From 02ffc575de018faba49ca3301c37eee9333fbc24 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 27 Apr 2015 15:37:27 +0200 Subject: [PATCH] ffmpeg: add upstream dcadec support Signed-off-by: Stephan Raue --- config/functions | 1 + packages/multimedia/ffmpeg/package.mk | 10 +- ...9.0001-avcodec-add-libdcadec-decoder.patch | 280 ++++++++++++++++++ ...02-avcodec-Fix-libdcadec-include-dir.patch | 40 +++ ...c-add-profile-define-for-DTS-Express.patch | 25 ++ projects/Generic/options | 3 + projects/RPi/options | 3 + projects/RPi2/options | 3 + projects/WeTek_Play/options | 3 + projects/imx6/options | 3 + 10 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-avcodec-add-libdcadec-decoder.patch create mode 100644 packages/multimedia/ffmpeg/patches/ffmpeg-99.0002-avcodec-Fix-libdcadec-include-dir.patch create mode 100644 packages/multimedia/ffmpeg/patches/ffmpeg-99.0003-avcodec-add-profile-define-for-DTS-Express.patch diff --git a/config/functions b/config/functions index f62bd1d9ce..986b7c2498 100644 --- a/config/functions +++ b/config/functions @@ -324,6 +324,7 @@ show_config() { config_message="$config_message\n - Kodi Player driver:\t\t\t $KODIPLAYER_DRIVER" config_message="$config_message\n - VAAPI Support:\t\t\t $VAAPI_SUPPORT" config_message="$config_message\n - VDPAU Support:\t\t\t $VDPAU_SUPPORT" + config_message="$config_message\n - DCA decoder Support:\t\t\t $DCADEC_SUPPORT" # Input device configuration diff --git a/packages/multimedia/ffmpeg/package.mk b/packages/multimedia/ffmpeg/package.mk index 233502f85f..605d3b3c94 100644 --- a/packages/multimedia/ffmpeg/package.mk +++ b/packages/multimedia/ffmpeg/package.mk @@ -49,6 +49,13 @@ else FFMPEG_VDPAU="--disable-vdpau" fi +if [ "$DCADEC_SUPPORT" = yes ]; then + PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET dcadec" + FFMPEG_LIBDCADEC="--enable-libdcadec" +else + FFMPEG_LIBDCADEC="--disable-libdcadec" +fi + if [ "$DEBUG" = yes ]; then FFMPEG_DEBUG="--enable-debug --disable-stripping" else @@ -111,7 +118,7 @@ configure_target() { --host-ldflags="$HOST_LDFLAGS" \ --host-libs="-lm" \ --extra-cflags="$CFLAGS" \ - --extra-ldflags="$LDFLAGS" \ + --extra-ldflags="$LDFLAGS -fPIC" \ --extra-libs="" \ --extra-version="" \ --build-suffix="" \ @@ -184,6 +191,7 @@ configure_target() { --disable-libopencore-amrwb \ --disable-libopencv \ --disable-libdc1394 \ + $FFMPEG_LIBDCADEC \ --disable-libfaac \ --disable-libfreetype \ --disable-libgsm \ diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-avcodec-add-libdcadec-decoder.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-avcodec-add-libdcadec-decoder.patch new file mode 100644 index 0000000000..c0c2ac19fd --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0001-avcodec-add-libdcadec-decoder.patch @@ -0,0 +1,280 @@ +From 519868de7d9c99876efcaf57d6a9683c22732cde Mon Sep 17 00:00:00 2001 +From: Hendrik Leppkes +Date: Thu, 19 Mar 2015 23:56:22 +0100 +Subject: [PATCH] avcodec: add libdcadec decoder + +Signed-off-by: Michael Niedermayer +--- + configure | 4 + + libavcodec/Makefile | 1 + + libavcodec/allcodecs.c | 1 + + libavcodec/libdcadec.c | 197 +++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 203 insertions(+) + create mode 100644 libavcodec/libdcadec.c + +diff --git a/configure b/configure +index 1bf8f80..a449bc7 100755 +--- a/configure ++++ b/configure +@@ -210,6 +210,7 @@ External library support: + --enable-libcdio enable audio CD grabbing with libcdio [no] + --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394 + and libraw1394 [no] ++ --enable-libdcadec enable DCA decoding via libdcadec [no] + --enable-libfaac enable AAC encoding via libfaac [no] + --enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no] + --enable-libflite enable flite (voice synthesis) support via libflite [no] +@@ -1353,6 +1354,7 @@ EXTERNAL_LIBRARY_LIST=" + libcdio + libcelt + libdc1394 ++ libdcadec + libfaac + libfdk_aac + libflite +@@ -2359,6 +2361,7 @@ vc1_parser_select="mpegvideo startcode vc1_decoder" + # external libraries + libaacplus_encoder_deps="libaacplus" + libcelt_decoder_deps="libcelt" ++libdcadec_decoder_deps="libdcadec" + libfaac_encoder_deps="libfaac" + libfaac_encoder_select="audio_frame_queue" + libfdk_aac_decoder_deps="libfdk_aac" +@@ -4922,6 +4925,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 && + { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 || + die "ERROR: libcelt must be installed and version must be >= 0.11.0."; } + enabled libcaca && require_pkg_config caca caca.h caca_create_canvas ++enabled libdcadec && require libdcadec dca_context.h dcadec_context_create -ldcadec + enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac + enabled libfdk_aac && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac + flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite" +diff --git a/libavcodec/Makefile b/libavcodec/Makefile +index 4173f88..1a0c734 100644 +--- a/libavcodec/Makefile ++++ b/libavcodec/Makefile +@@ -732,6 +732,7 @@ OBJS-$(CONFIG_ELBG_FILTER) += elbg.o + # external codec libraries + OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o + OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o ++OBJS-$(CONFIG_LIBDCADEC_DECODER) += libdcadec.o + OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o + OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o + OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o +diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c +index 5194e74..bbf70a6 100644 +--- a/libavcodec/allcodecs.c ++++ b/libavcodec/allcodecs.c +@@ -512,6 +512,7 @@ void avcodec_register_all(void) + + /* external libraries */ + REGISTER_DECODER(LIBCELT, libcelt); ++ REGISTER_DECODER(LIBDCADEC, libdcadec) + REGISTER_ENCODER(LIBFAAC, libfaac); + REGISTER_ENCDEC (LIBFDK_AAC, libfdk_aac); + REGISTER_ENCDEC (LIBGSM, libgsm); +diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c +new file mode 100644 +index 0000000..d060db5 +--- /dev/null ++++ b/libavcodec/libdcadec.c +@@ -0,0 +1,197 @@ ++/* ++ * libdcadec decoder wrapper ++ * Copyright (C) 2015 Hendrik Leppkes ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++ ++#include "libavutil/avassert.h" ++#include "libavutil/channel_layout.h" ++#include "libavutil/common.h" ++#include "libavutil/opt.h" ++#include "avcodec.h" ++#include "dca.h" ++#include "dca_syncwords.h" ++#include "internal.h" ++ ++typedef struct DCADecContext { ++ struct dcadec_context *ctx; ++ uint8_t *buffer; ++ int buffer_size; ++} DCADecContext; ++ ++static int dcadec_decode_frame(AVCodecContext *avctx, void *data, ++ int *got_frame_ptr, AVPacket *avpkt) ++{ ++ DCADecContext *s = avctx->priv_data; ++ AVFrame *frame = data; ++ int ret, i, k; ++ int **samples, nsamples, channel_mask, sample_rate, bits_per_sample, profile; ++ uint32_t mrk; ++ uint8_t *input = avpkt->data; ++ int input_size = avpkt->size; ++ ++ /* convert bytestream syntax to RAW BE format if required */ ++ mrk = AV_RB32(input); ++ if (mrk != DCA_SYNCWORD_CORE_BE && mrk != DCA_SYNCWORD_SUBSTREAM) { ++ s->buffer = av_fast_realloc(s->buffer, &s->buffer_size, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE); ++ if (!s->buffer) ++ return AVERROR(ENOMEM); ++ ++ if ((ret = avpriv_dca_convert_bitstream(avpkt->data, avpkt->size, s->buffer, s->buffer_size)) < 0) ++ return ret; ++ ++ input = s->buffer; ++ input_size = ret; ++ } ++ ++ if ((ret = dcadec_context_parse(s->ctx, input, input_size)) < 0) { ++ av_log(avctx, AV_LOG_ERROR, "dcadec_context_parse() failed: %d (%s)\n", -ret, dcadec_strerror(ret)); ++ return AVERROR_EXTERNAL; ++ } ++ if ((ret = dcadec_context_filter(s->ctx, &samples, &nsamples, &channel_mask, ++ &sample_rate, &bits_per_sample, &profile)) < 0) { ++ av_log(avctx, AV_LOG_ERROR, "dcadec_context_filter() failed: %d (%s)\n", -ret, dcadec_strerror(ret)); ++ return AVERROR_EXTERNAL; ++ } ++ ++ avctx->channels = av_get_channel_layout_nb_channels(channel_mask); ++ avctx->channel_layout = channel_mask; ++ avctx->sample_rate = sample_rate; ++ ++ av_assert0(bits_per_sample >= 16 && bits_per_sample <= 24); ++ if (bits_per_sample == 16) ++ avctx->sample_fmt = AV_SAMPLE_FMT_S16P; ++ else ++ avctx->sample_fmt = AV_SAMPLE_FMT_S32P; ++ ++ avctx->bits_per_raw_sample = bits_per_sample; ++ ++ switch (profile) { ++ case DCADEC_PROFILE_DS: ++ avctx->profile = FF_PROFILE_DTS; ++ break; ++ case DCADEC_PROFILE_DS_96_24: ++ avctx->profile = FF_PROFILE_DTS_96_24; ++ break; ++ case DCADEC_PROFILE_DS_ES: ++ avctx->profile = FF_PROFILE_DTS_ES; ++ break; ++ case DCADEC_PROFILE_HD_HRA: ++ avctx->profile = FF_PROFILE_DTS_HD_HRA; ++ break; ++ case DCADEC_PROFILE_HD_MA: ++ avctx->profile = FF_PROFILE_DTS_HD_MA; ++ break; ++ case DCADEC_PROFILE_EXPRESS: ++ avctx->profile = FF_PROFILE_DTS_EXPRESS; ++ break; ++ case DCADEC_PROFILE_UNKNOWN: ++ default: ++ avctx->profile = FF_PROFILE_UNKNOWN; ++ break; ++ } ++ ++ /* bitrate is only meaningful if there are no HD extensions, as they distort the bitrate */ ++ if (profile == DCADEC_PROFILE_DS || profile == DCADEC_PROFILE_DS_96_24 || profile == DCADEC_PROFILE_DS_ES) { ++ struct dcadec_core_info *info = dcadec_context_get_core_info(s->ctx); ++ avctx->bit_rate = info->bit_rate; ++ dcadec_context_free_core_info(info); ++ } else ++ avctx->bit_rate = 0; ++ ++ frame->nb_samples = nsamples; ++ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) ++ return ret; ++ ++ for (i = 0; i < avctx->channels; i++) { ++ if (frame->format == AV_SAMPLE_FMT_S16P) { ++ int16_t *plane = (int16_t *)frame->extended_data[i]; ++ for (k = 0; k < nsamples; k++) ++ plane[k] = samples[i][k]; ++ } else { ++ int32_t *plane = (int32_t *)frame->extended_data[i]; ++ int shift = 32 - bits_per_sample; ++ for (k = 0; k < nsamples; k++) ++ plane[k] = samples[i][k] << shift; ++ } ++ } ++ ++ *got_frame_ptr = 1; ++ ++ return avpkt->size; ++} ++ ++static av_cold void dcadec_flush(AVCodecContext *avctx) ++{ ++ DCADecContext *s = avctx->priv_data; ++ dcadec_context_clear(s->ctx); ++} ++ ++static av_cold int dcadec_close(AVCodecContext *avctx) ++{ ++ DCADecContext *s = avctx->priv_data; ++ ++ dcadec_context_destroy(s->ctx); ++ s->ctx = NULL; ++ ++ av_freep(&s->buffer); ++ ++ return 0; ++} ++ ++static av_cold int dcadec_init(AVCodecContext *avctx) ++{ ++ DCADecContext *s = avctx->priv_data; ++ ++ s->ctx = dcadec_context_create(0); ++ if (!s->ctx) ++ return AVERROR(ENOMEM); ++ ++ avctx->sample_fmt = AV_SAMPLE_FMT_S32P; ++ avctx->bits_per_raw_sample = 24; ++ ++ return 0; ++} ++ ++static const AVProfile profiles[] = { ++ { FF_PROFILE_DTS, "DTS" }, ++ { FF_PROFILE_DTS_ES, "DTS-ES" }, ++ { FF_PROFILE_DTS_96_24, "DTS 96/24" }, ++ { FF_PROFILE_DTS_HD_HRA, "DTS-HD HRA" }, ++ { FF_PROFILE_DTS_HD_MA, "DTS-HD MA" }, ++ { FF_PROFILE_DTS_EXPRESS, "DTS Express" }, ++ { FF_PROFILE_UNKNOWN }, ++}; ++ ++AVCodec ff_libdcadec_decoder = { ++ .name = "libdcadec", ++ .long_name = NULL_IF_CONFIG_SMALL("dcadec DCA decoder"), ++ .type = AVMEDIA_TYPE_AUDIO, ++ .id = AV_CODEC_ID_DTS, ++ .priv_data_size = sizeof(DCADecContext), ++ .init = dcadec_init, ++ .decode = dcadec_decode_frame, ++ .close = dcadec_close, ++ .flush = dcadec_flush, ++ .capabilities = CODEC_CAP_DR1 | CODEC_CAP_CHANNEL_CONF, ++ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_S16P, ++ AV_SAMPLE_FMT_NONE }, ++ .profiles = NULL_IF_CONFIG_SMALL(profiles), ++}; +-- +1.9.1 + diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-99.0002-avcodec-Fix-libdcadec-include-dir.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0002-avcodec-Fix-libdcadec-include-dir.patch new file mode 100644 index 0000000000..b4db15dd80 --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0002-avcodec-Fix-libdcadec-include-dir.patch @@ -0,0 +1,40 @@ +From 4f3c31df3f569c7171ee9e651ddf479690367b9b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= +Date: Fri, 20 Mar 2015 01:58:25 +0100 +Subject: [PATCH] avcodec: Fix libdcadec include dir + +Signed-off-by: Michael Niedermayer +--- + configure | 2 +- + libavcodec/libdcadec.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/configure b/configure +index a449bc7..1ef83e3 100755 +--- a/configure ++++ b/configure +@@ -4925,7 +4925,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 && + { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 || + die "ERROR: libcelt must be installed and version must be >= 0.11.0."; } + enabled libcaca && require_pkg_config caca caca.h caca_create_canvas +-enabled libdcadec && require libdcadec dca_context.h dcadec_context_create -ldcadec ++enabled libdcadec && require libdcadec libdcadec/dca_context.h dcadec_context_create -ldcadec + enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac + enabled libfdk_aac && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac + flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite" +diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c +index d060db5..a28b983 100644 +--- a/libavcodec/libdcadec.c ++++ b/libavcodec/libdcadec.c +@@ -19,7 +19,7 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +-#include ++#include + + #include "libavutil/avassert.h" + #include "libavutil/channel_layout.h" +-- +1.9.1 + diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-99.0003-avcodec-add-profile-define-for-DTS-Express.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0003-avcodec-add-profile-define-for-DTS-Express.patch new file mode 100644 index 0000000000..1550538e33 --- /dev/null +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-99.0003-avcodec-add-profile-define-for-DTS-Express.patch @@ -0,0 +1,25 @@ +From 11fe56c8bbf39cd0c3edbf0cd404dea400ff7e0c Mon Sep 17 00:00:00 2001 +From: Hendrik Leppkes +Date: Thu, 19 Mar 2015 23:45:39 +0100 +Subject: [PATCH] avcodec: add profile define for DTS Express + +Signed-off-by: Michael Niedermayer +--- + libavcodec/avcodec.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h +index cdc8aa1..48e212f 100644 +--- a/libavcodec/avcodec.h ++++ b/libavcodec/avcodec.h +@@ -2851,6 +2851,7 @@ typedef struct AVCodecContext { + #define FF_PROFILE_DTS_96_24 40 + #define FF_PROFILE_DTS_HD_HRA 50 + #define FF_PROFILE_DTS_HD_MA 60 ++#define FF_PROFILE_DTS_EXPRESS 70 + + #define FF_PROFILE_MPEG2_422 0 + #define FF_PROFILE_MPEG2_HIGH 1 +-- +1.9.1 + diff --git a/projects/Generic/options b/projects/Generic/options index 27fb442e37..eae4e70583 100644 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -82,6 +82,9 @@ # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="default" + # KODI DCADEC support (yes / no) + DCADEC_SUPPORT="no" + # Modules to install in initramfs for early boot INITRAMFS_MODULES="" diff --git a/projects/RPi/options b/projects/RPi/options index 61df3cfc59..ce23603dc8 100644 --- a/projects/RPi/options +++ b/projects/RPi/options @@ -112,6 +112,9 @@ # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="bcm2835-driver" + # KODI DCADEC support (yes / no) + DCADEC_SUPPORT="yes" + # Modules to install in initramfs for early boot INITRAMFS_MODULES="" diff --git a/projects/RPi2/options b/projects/RPi2/options index 9b224e86d0..28b3747c9d 100644 --- a/projects/RPi2/options +++ b/projects/RPi2/options @@ -112,6 +112,9 @@ # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="bcm2835-driver" + # KODI DCADEC support (yes / no) + DCADEC_SUPPORT="yes" + # Modules to install in initramfs for early boot INITRAMFS_MODULES="" diff --git a/projects/WeTek_Play/options b/projects/WeTek_Play/options index c67d9660e2..b7f78c0edc 100644 --- a/projects/WeTek_Play/options +++ b/projects/WeTek_Play/options @@ -110,6 +110,9 @@ # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap / libamcodec) KODIPLAYER_DRIVER="libamcodec" + # KODI DCADEC support (yes / no) + DCADEC_SUPPORT="no" + # Modules to install in initramfs for early boot INITRAMFS_MODULES="" diff --git a/projects/imx6/options b/projects/imx6/options index bb68545a96..430621f802 100644 --- a/projects/imx6/options +++ b/projects/imx6/options @@ -111,6 +111,9 @@ # KODI Player implementation to use (default / bcm2835-driver / libfslvpuwrap) KODIPLAYER_DRIVER="libfslvpuwrap" + # KODI DCADEC support (yes / no) + DCADEC_SUPPORT="no" + # Modules to install in initramfs for early boot INITRAMFS_MODULES=""