From: Kitae Kim Date: Tue, 6 Jan 2015 10:24:20 +0000 (+0900) Subject: brillcodec: support h.264 encoder X-Git-Tag: Tizen_Studio_1.3_Release_p2.3~41^2~33 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=adfc510068c2015463f6c2af01ed061d085025f8;p=sdk%2Femulator%2Fqemu.git brillcodec: support h.264 encoder configure and use libx264 to support h.264 encoder Change-Id: I17245ca51b1447dcd8470f2d2b56484ad7fc37db Signed-off-by: Kitae Kim (cherry picked from commit c3d9a0018cc87adf4a0e1e472da472b2eaa6980c) Signed-off-by: Sooyoung Ha --- diff --git a/configure b/configure index 8e06cf8986..b6e5f048b2 100755 --- a/configure +++ b/configure @@ -3988,11 +3988,11 @@ if test "$libav" != "no"; then libavformat_version="54.20.3" libavresample_package="libavresample" libavresample_version="1.0.1" + libx264_package="x264" if $pkg_config --exists "$libavcodec_package >= $libavcodec_version" ; then libav_cflags=`$pkg_config --cflags $libavcodec_package` libav_libs=`$pkg_config --libs $libavcodec_package` - libs_softmmu="$libav_libs $libs_softmmu" libav="yes" else #if test "$libav" = "yes" ; then @@ -4002,8 +4002,7 @@ if test "$libav" != "no"; then fi if $pkg_config --exists "$libavutil_package >= $libavutil_version" ; then - libav_libs=`$pkg_config --libs-only-l $libavutil_package` - libs_softmmu="$libav_libs $libs_softmmu" + libav_libs="$libav_libs `$pkg_config --libs-only-l $libavutil_package`" libav="yes" else #if test "$libav" = "yes" ; then @@ -4013,8 +4012,7 @@ if test "$libav" != "no"; then fi if $pkg_config --exists "$libavformat_package >= $libavformat_version" ; then - libav_libs=`$pkg_config --libs-only-l $libavformat_package` - libs_softmmu="$libav_libs $libs_softmmu" + libav_libs="$libav_libs `$pkg_config --libs-only-l $libavformat_package`" libav="yes" else #if test "$libav" = "yes" ; then @@ -4024,8 +4022,7 @@ if test "$libav" != "no"; then fi if $pkg_config --exists "$libavresample_package >= $libavresample_version" ; then - libav_libs=`$pkg_config --libs-only-l $libavresample_package` - libs_softmmu="$libav_libs $libs_softmmu" + libav_libs="$libav_libs `$pkg_config --libs-only-l $libavresample_package`" libav="yes" else #if test "$libav" = "yes" ; then @@ -4034,6 +4031,15 @@ if test "$libav" != "no"; then libav="no" fi + if $pkg_config --exists "$libx264_package" ; then + libav_libs="$libav_libs `$pkg_config --libs $libx264_package`" + libav="yes" + else + #if test "$libav" = "yes" ; then + # feature_not_found "libav" + #fi + libav="no" + fi fi ########################################## @@ -4843,6 +4849,7 @@ fi if test "$libav" = "yes" ; then echo "CONFIG_LIBAV=y" >> $config_host_mak echo "LIBAV_CFLAGS=$libav_cflags" >> $config_host_mak + echo "LIBAV_LIBS=$libav_libs" >> $config_host_mak fi if test "$libpng" = "yes" ; then echo "CONFIG_PNG=y" >> $config_host_mak diff --git a/package/build.macos-64 b/package/build.macos-64 index c96f6141f0..fba1c2440c 100755 --- a/package/build.macos-64 +++ b/package/build.macos-64 @@ -25,7 +25,7 @@ prepare() exit 1 fi - export PKG_CONFIG_PATH=$ROOTDIR/glib2/lib/pkgconfig:$ROOTDIR/curl/lib/pkgconfig:$ROOTDIR/libffi/lib/pkgconfig:$ROOTDIR/libidn/lib/pkgconfig:$ROOTDIR/libxml2/lib/pkgconfig:$ROOTDIR/ncurses/lib/pkgconfig:$ROOTDIR/openssl/lib/pkgconfig:$ROOTDIR/pixman/lib/pkgconfig:$ROOTDIR/zlib/lib/pkgconfig:$ROOTDIR/libav/lib/pkgconfig:$ROOTDIR/libpng/lib/pkgconfig:$PKG_CONFIG_PATH + export PKG_CONFIG_PATH=$ROOTDIR/glib2/lib/pkgconfig:$ROOTDIR/curl/lib/pkgconfig:$ROOTDIR/libffi/lib/pkgconfig:$ROOTDIR/libidn/lib/pkgconfig:$ROOTDIR/libxml2/lib/pkgconfig:$ROOTDIR/ncurses/lib/pkgconfig:$ROOTDIR/openssl/lib/pkgconfig:$ROOTDIR/pixman/lib/pkgconfig:$ROOTDIR/zlib/lib/pkgconfig:$ROOTDIR/libav/lib/pkgconfig:$ROOTDIR/libpng/lib/pkgconfig:$ROOTDIR/x264/lib/pkgconfig:$PKG_CONFIG_PATH BUILD_CFLAGS="--extra-cflags=-I$ROOTDIR/libiconv/include " BUILD_LDFLAGS="--extra-ldflags=-L$ROOTDIR/libiconv/lib " @@ -107,13 +107,11 @@ build() install() { X86_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-x86.package.${TARGET_OS}/data/platforms/tizen-2.3/common -# ARM_BIN_DIR=$SRCDIR/package/emulator-qemu-arm.package.${TARGET_OS}/data/tools COMMON_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-common.package.${TARGET_OS}/data/platforms/tizen-2.3/common MOBILE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/mobile-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/mobile/emulator-resources/skins WEARABLE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/wearable-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/wearable/emulator-resources/skins mkdir -p $X86_BIN_DIR -# mkdir -p $ARM_BIN_DIR mkdir -p $COMMON_BIN_DIR mkdir -p $MOBILE_2_3_SKIN_RESOURCE_DIR mkdir -p $WEARABLE_2_3_SKIN_RESOURCE_DIR @@ -122,7 +120,6 @@ install() make install_dibs mv x86 $X86_BIN_DIR/emulator -# mv x86 $ARM_BIN_DIR/emulator mv common $COMMON_BIN_DIR/emulator #profile skins diff --git a/package/build.ubuntu-32 b/package/build.ubuntu-32 index 4c70a7eef2..5aaee6c9fe 100755 --- a/package/build.ubuntu-32 +++ b/package/build.ubuntu-32 @@ -4,7 +4,7 @@ clean() { prepare - export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${ROOTDIR}/libav/lib/pkgconfig + export PKG_CONFIG_PATH=${ROOTDIR}/x264/lib/pkgconfig:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig:${PKG_CONFIG_PATH} cd $SRCDIR/tizen if test -e "Makefile" @@ -48,7 +48,7 @@ prepare() # build build() { - export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig + export PKG_CONFIG_PATH=${ROOTDIR}/x264/lib/pkgconfig:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig:${PKG_CONFIG_PATH} cd $SRCDIR/tizen/ ./emulator_configure.sh x86 @@ -60,33 +60,17 @@ build() echo "x86 build failure" exit 1 fi - -# make install_dibs -# make clean -# -# ./emulator_configure.sh arm -# make all_dibs -# if [ $? -eq 0 ] -# then -# echo "arm build success" -# else -# echo "arm build failure" -# exit 1 -# fi -# make install_dibs } # install install() { X86_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-x86.package.${TARGET_OS}/data/platforms/tizen-2.3/common -# ARM_BIN_DIR=$SRCDIR/package/emulator-qemu-arm.package.${TARGET_OS}/data/tools COMMON_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-common.package.${TARGET_OS}/data/platforms/tizen-2.3/common MOBILE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/mobile-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/mobile/emulator-resources/skins WEARABLE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/wearable-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/wearable/emulator-resources/skins mkdir -p $X86_BIN_DIR -# mkdir -p $ARM_BIN_DIR mkdir -p $COMMON_BIN_DIR mkdir -p $MOBILE_2_3_SKIN_RESOURCE_DIR mkdir -p $WEARABLE_2_3_SKIN_RESOURCE_DIR @@ -95,7 +79,6 @@ install() make install_dibs mv x86 $X86_BIN_DIR/emulator -# mv x86 $ARM_BIN_DIR/emulator mv common $COMMON_BIN_DIR/emulator #profile skins diff --git a/package/build.ubuntu-64 b/package/build.ubuntu-64 index 4c70a7eef2..5aaee6c9fe 100755 --- a/package/build.ubuntu-64 +++ b/package/build.ubuntu-64 @@ -4,7 +4,7 @@ clean() { prepare - export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${ROOTDIR}/libav/lib/pkgconfig + export PKG_CONFIG_PATH=${ROOTDIR}/x264/lib/pkgconfig:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig:${PKG_CONFIG_PATH} cd $SRCDIR/tizen if test -e "Makefile" @@ -48,7 +48,7 @@ prepare() # build build() { - export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig + export PKG_CONFIG_PATH=${ROOTDIR}/x264/lib/pkgconfig:${ROOTDIR}/remote/lib/pkgconfig:${ROOTDIR}/libav/lib/pkgconfig:${PKG_CONFIG_PATH} cd $SRCDIR/tizen/ ./emulator_configure.sh x86 @@ -60,33 +60,17 @@ build() echo "x86 build failure" exit 1 fi - -# make install_dibs -# make clean -# -# ./emulator_configure.sh arm -# make all_dibs -# if [ $? -eq 0 ] -# then -# echo "arm build success" -# else -# echo "arm build failure" -# exit 1 -# fi -# make install_dibs } # install install() { X86_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-x86.package.${TARGET_OS}/data/platforms/tizen-2.3/common -# ARM_BIN_DIR=$SRCDIR/package/emulator-qemu-arm.package.${TARGET_OS}/data/tools COMMON_BIN_DIR=$SRCDIR/package/2.3-emulator-qemu-common.package.${TARGET_OS}/data/platforms/tizen-2.3/common MOBILE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/mobile-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/mobile/emulator-resources/skins WEARABLE_2_3_SKIN_RESOURCE_DIR=$SRCDIR/package/wearable-2.3-emulator-qemu-skins.package.${TARGET_OS}/data/platforms/tizen-2.3/wearable/emulator-resources/skins mkdir -p $X86_BIN_DIR -# mkdir -p $ARM_BIN_DIR mkdir -p $COMMON_BIN_DIR mkdir -p $MOBILE_2_3_SKIN_RESOURCE_DIR mkdir -p $WEARABLE_2_3_SKIN_RESOURCE_DIR @@ -95,7 +79,6 @@ install() make install_dibs mv x86 $X86_BIN_DIR/emulator -# mv x86 $ARM_BIN_DIR/emulator mv common $COMMON_BIN_DIR/emulator #profile skins diff --git a/package/build.windows-32 b/package/build.windows-32 index 14571d0d79..345b56e9ef 100755 --- a/package/build.windows-32 +++ b/package/build.windows-32 @@ -39,9 +39,9 @@ prepare() if [ -z ${PKG_CONFIG_PATH} ] then - PKG_CONFIG_PATH=$PURIFIED_ROOTDIR/libav/lib/pkgconfig:$PURIFIED_ROOTDIR/SDL_1.2.15/lib/pkgconfig:$PURIFIED_ROOTDIR/pixman_0.30.0/lib/pkgconfig:$PURIFIED_ROOTDIR/gtk-bundle_2.24.10/lib/pkgconfig:$PURIFIED_ROOTDIR/libcurl-4_1.0.1/lib/pkgconfig + PKG_CONFIG_PATH=$PURIFIED_ROOTDIR/libav/lib/pkgconfig:$PURIFIED_ROOTDIR/SDL_1.2.15/lib/pkgconfig:$PURIFIED_ROOTDIR/pixman_0.30.0/lib/pkgconfig:$PURIFIED_ROOTDIR/gtk-bundle_2.24.10/lib/pkgconfig:$PURIFIED_ROOTDIR/libcurl-4_1.0.1/lib/pkgconfig:$PURIFIED_ROOTDIR/x264/lib/pkgconfig else - PKG_CONFIG_PATH=$PURIFIED_ROOTDIR/libav/lib/pkgconfig:$PURIFIED_ROOTDIR/SDL_1.2.15/lib/pkgconfig:$PURIFIED_ROOTDIR/pixman_0.30.0/lib/pkgconfig:$PURIFIED_ROOTDIR/gtk-bundle_2.24.10/lib/pkgconfig:$PURIFIED_ROOTDIR/libcurl-4_1.0.1/lib/pkgconfig:${PKG_CONFIG_PATH} + PKG_CONFIG_PATH=$PURIFIED_ROOTDIR/libav/lib/pkgconfig:$PURIFIED_ROOTDIR/SDL_1.2.15/lib/pkgconfig:$PURIFIED_ROOTDIR/pixman_0.30.0/lib/pkgconfig:$PURIFIED_ROOTDIR/gtk-bundle_2.24.10/lib/pkgconfig:$PURIFIED_ROOTDIR/libcurl-4_1.0.1/lib/pkgconfig:$PURIFIED_ROOTDIR/x264/lib/pkgconfig:${PKG_CONFIG_PATH} fi export PKG_CONFIG_PATH diff --git a/tizen/src/hw/pci/Makefile.objs b/tizen/src/hw/pci/Makefile.objs index f816976dd8..86c0c26cef 100644 --- a/tizen/src/hw/pci/Makefile.objs +++ b/tizen/src/hw/pci/Makefile.objs @@ -21,4 +21,6 @@ LIBS += -framework AppKit endif maru_brillcodec_device.o-cflags := $(LIBAV_CFLAGS) +maru_brillcodec_device.o-libs := $(LIBAV_LIBS) maru_brillcodec.o-cflags := $(LIBAV_CFLAGS) +maru_brillcodec.o-libs := $(LIBAV_LIBS) diff --git a/tizen/src/hw/pci/maru_brillcodec.c b/tizen/src/hw/pci/maru_brillcodec.c index de0afe43ea..76347cf638 100644 --- a/tizen/src/hw/pci/maru_brillcodec.c +++ b/tizen/src/hw/pci/maru_brillcodec.c @@ -490,8 +490,8 @@ static void serialize_video_data(const struct video_data *video, avctx->ticks_per_frame = video->ticks_per_frame; } - INFO("codec_init. video, resolution: %dx%d, framerate: %d/%d " - "pixel_fmt: %d sample_aspect_ratio: %d/%d bpp %d\n", + INFO("video_init! resolution %dx%d, framerate %d/%d " + "pixel_fmt %d sample_aspect_ratio %d/%d bpp %d\n", avctx->width, avctx->height, avctx->time_base.num, avctx->time_base.den, avctx->pix_fmt, avctx->sample_aspect_ratio.num, avctx->sample_aspect_ratio.den, avctx->bits_per_coded_sample); @@ -530,7 +530,7 @@ static void serialize_audio_data (const struct audio_data *audio, avctx->sample_fmt = audio->sample_fmt; } - INFO("codec_init. audio, channel %d sample_rate %d sample_fmt %d ch_layout %lld\n", + INFO("audio_init! channel %d sample_rate %d sample_fmt %d ch_layout %lld\n", avctx->channels, avctx->sample_rate, avctx->sample_fmt, avctx->channel_layout); } @@ -637,7 +637,7 @@ int maru_brill_codec_query_list (MaruBrillCodecState *s) } } } else { - ERR("unknown media type: %d\n", media_type); + ERR("unknown media type: %d name %s\n", media_type, codec->name); } memset(s->vaddr + mem_size, 0x00, length); @@ -693,22 +693,6 @@ int maru_brill_codec_get_context_index(MaruBrillCodecState *s) return ctx_id; } - -// allocate avcontext and avframe struct. -static AVCodecContext *maru_brill_codec_alloc_context(MaruBrillCodecState *s, int ctx_id) -{ - TRACE("enter: %s\n", __func__); - - TRACE("allocate %d of context and frame.\n", ctx_id); - CONTEXT(s, ctx_id).avctx = avcodec_alloc_context3(NULL); - CONTEXT(s, ctx_id).frame = avcodec_alloc_frame(); - CONTEXT(s, ctx_id).opened_context = false; - - TRACE("leave: %s\n", __func__); - - return CONTEXT(s, ctx_id).avctx; -} - static AVCodec *maru_brill_codec_find_avcodec(uint8_t *mem_buf) { AVCodec *codec = NULL; @@ -727,7 +711,7 @@ static AVCodec *maru_brill_codec_find_avcodec(uint8_t *mem_buf) } else { codec = avcodec_find_decoder_by_name (codec_name); } - INFO("%s!! find %s %s\n", codec ? "success" : "failure", + INFO("%s! find %s %s\n", codec ? "success" : "failure", codec_name, encode ? "encoder" : "decoder"); return codec; @@ -758,7 +742,7 @@ static void read_codec_init_data(AVCodecContext *avctx, uint8_t *mem_buf) memcpy(&avctx->extradata_size, mem_buf + size, sizeof(avctx->extradata_size)); size += sizeof(avctx->extradata_size); - INFO("extradata size: %d.\n", avctx->extradata_size); + INFO("extradata size: %d\n", avctx->extradata_size); if (avctx->extradata_size > 0) { avctx->extradata = @@ -768,7 +752,7 @@ static void read_codec_init_data(AVCodecContext *avctx, uint8_t *mem_buf) memcpy(avctx->extradata, mem_buf + size, avctx->extradata_size); } } else { - TRACE("no extra data.\n"); + TRACE("no extra data\n"); avctx->extradata = av_mallocz(ROUND_UP_X(FF_INPUT_BUFFER_PADDING_SIZE, 4)); } @@ -903,7 +887,11 @@ static AVFrame *resample_audio(AVCodecContext *avctx, AVFrame *sample_frame, return NULL; } +#if LIBAVUTIL_VERSION_CHECK resample_frame = avcodec_alloc_frame(); +#else + resample_frame = av_frame_alloc(); +#endif TRACE("resample audio. nb_samples %d sample_fmt %d\n", resample_nb_samples, resample_sample_fmt); *resample_buffer_size = av_samples_get_buffer_size(NULL, avctx->channels, resample_nb_samples, resample_sample_fmt, 0); @@ -965,7 +953,7 @@ static int parse_and_decode_video(AVCodecContext *avctx, AVFrame *picture, } TRACE("after parsing ret: %d parser_outbuf_size %d parser_buf_size %d pts %lld\n", - ret, parser_outbuf_size, parser_buf_size, pctx->pts); + ret, parser_outbuf_size, parser_buf_size, pctx->pts); /* if there is no output, we must break and wait for more data. * also the timestamp in the context is not updated. @@ -991,7 +979,7 @@ static int parse_and_decode_video(AVCodecContext *avctx, AVFrame *picture, if (!pctx) { if (len == 0 && (*got_picture) == 0) { - ERR("decoding video didn't return any data! ctx_id %d len %d\n", ctx_id, len); + INFO("decoding video 1! didn't return any data! ctx_id %d len %d\n", ctx_id, len); break; } else if (len < 0) { ERR("decoding video error! ctx_id %d len %d\n", ctx_id, len); @@ -1001,7 +989,7 @@ static int parse_and_decode_video(AVCodecContext *avctx, AVFrame *picture, parser_buf += len; } else { if (len == 0) { - ERR("decoding video didn't return any data! ctx_id %d len %d\n", ctx_id, len); + INFO("decoding video 2! didn't return any data! ctx_id %d len %d\n", ctx_id, len); *got_picture = 0; break; } else if (len < 0) { @@ -1009,6 +997,8 @@ static int parse_and_decode_video(AVCodecContext *avctx, AVFrame *picture, break; } } + + TRACE("decoding video. parser_buf_size %d\n", parser_buf_size); } while (parser_buf_size > 0); return len; @@ -1028,51 +1018,74 @@ static bool codec_init(MaruBrillCodecState *s, int ctx_id, void *data_buf) elem = (DeviceMemEntry *)data_buf; - // allocate AVCodecContext - avctx = maru_brill_codec_alloc_context(s, ctx_id); - if (!avctx) { - ERR("[%d] failed to allocate context.\n", __LINE__); - ret = -1; - } else { - codec = maru_brill_codec_find_avcodec(elem->opaque); - if (codec) { - size = sizeof(int32_t) + 32; // buffer size of codec_name - read_codec_init_data(avctx, elem->opaque + size); - - // in case of aac encoder, sample format is float - if (!strcmp(codec->name, "aac") && codec->encode2) { - TRACE("convert sample format into SAMPLE_FMT_FLTP\n"); - avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; - - avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; + codec = maru_brill_codec_find_avcodec(elem->opaque); + if (codec) { + TRACE("allocate %d of context and frame.\n", ctx_id); + CONTEXT(s, ctx_id).avctx = avctx = avcodec_alloc_context3(codec); +#if LIBAVUTIL_VERSION_CHECK + CONTEXT(s, ctx_id).frame = avcodec_alloc_frame(); +#else + CONTEXT(s, ctx_id).frame = av_frame_alloc(); +#endif + CONTEXT(s, ctx_id).opened_context = false; + + size = sizeof(int32_t) + 32; // buffer size of codec_name + read_codec_init_data(avctx, elem->opaque + size); + + AVDictionary *opts = NULL; + + if (codec->encode2) { + avctx->gop_size = DEFAULT_VIDEO_GOP_SIZE; + + switch (codec->id) { + case AV_CODEC_ID_AAC: + avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; + avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; + avctx->channel_layout = av_get_default_channel_layout(avctx->channels); - INFO("aac encoder!! channels %d channel_layout %lld\n", - avctx->channels, avctx->channel_layout); - avctx->channel_layout = av_get_default_channel_layout(avctx->channels); + INFO("aac encoder sample_fmt %d channels %d channel_layout %lld strict_std_compliance %d\n", + avctx->sample_fmt, avctx->channels, avctx->channel_layout, avctx->strict_std_compliance); + break; + case AV_CODEC_ID_H264: + avctx->bit_rate = 0; + + avctx->flags = 0; + // avctx->flags |= CODEC_FLAG_GLOBAL_HEADER; + avctx->flags |= CODEC_FLAG_CLOSED_GOP; + avctx->flags |= CODEC_FLAG_LOOP_FILTER; + avctx->qmax = 45; + av_dict_set(&opts, "aud", "1" , 0); + break; + default: + break; } - TRACE("audio sample format %d\n", avctx->sample_fmt); - TRACE("strict_std_compliance %d\n", avctx->strict_std_compliance); + INFO("setting encode_init extradata_size %d channels %d sample_rate %d sample_fmt %d " + "channel_layout %lld frame_size %d bitrate %d profile %d\n", + avctx->extradata_size, avctx->channels, avctx->sample_rate, avctx->sample_fmt, + avctx->channel_layout, avctx->frame_size, avctx->bit_rate, avctx->profile); + } + + ret = avcodec_open2(avctx, codec, &opts); + INFO("avcodec_open. ret 0x%x ctx_id %d\n", ret, ctx_id); - ret = avcodec_open2(avctx, codec, NULL); - INFO("avcodec_open. ret 0x%x ctx_id %d\n", ret, ctx_id); + TRACE("avcodec_open resolution %dx%d, framerate %d/%d pixel_fmt %d sample_aspect_ratio %d/%d bpp %d\n", + avctx->width, avctx->height, avctx->time_base.num, + avctx->time_base.den, avctx->pix_fmt, avctx->sample_aspect_ratio.num, + avctx->sample_aspect_ratio.den, avctx->bits_per_coded_sample); - INFO("channels %d sample_rate %d sample_fmt %d " - "channel_layout %lld frame_size %d\n", - avctx->channels, avctx->sample_rate, avctx->sample_fmt, + TRACE("channels %d bitrate %d sample_rate %d sample_fmt %d channel_layout %lld frame_size %d\n", + avctx->channels, avctx->bit_rate, avctx->sample_rate, avctx->sample_fmt, avctx->channel_layout, avctx->frame_size); - tempbuf_size = (sizeof(avctx->sample_fmt) + sizeof(avctx->frame_size) - + sizeof(avctx->extradata_size) + avctx->extradata_size) - + sizeof(int); + tempbuf_size = (sizeof(avctx->sample_fmt) + sizeof(avctx->frame_size) + + sizeof(avctx->extradata_size) + avctx->extradata_size) + sizeof(int); - CONTEXT(s, ctx_id).opened_context = true; - CONTEXT(s, ctx_id).parser_ctx = - maru_brill_codec_parser_init(avctx); - } else { - ERR("failed to find codec. ctx_id: %d\n", ctx_id); - ret = -1; - } + CONTEXT(s, ctx_id).opened_context = true; + CONTEXT(s, ctx_id).parser_ctx = maru_brill_codec_parser_init(avctx); + } else { + ERR("failed to find codec. ctx_id: %d\n", ctx_id); + ret = -1; } tempbuf_size += sizeof(ret); @@ -1089,15 +1102,12 @@ static bool codec_init(MaruBrillCodecState *s, int ctx_id, void *data_buf) } else { size += write_codec_init_data(avctx, tempbuf + size); TRACE("codec_init. copyback!! size %d\n", size); - { - memcpy(tempbuf + size, &avctx->extradata_size, sizeof(avctx->extradata_size)); - size += sizeof(avctx->extradata_size); - - INFO("codec_init. extradata_size: %d\n", avctx->extradata_size); - if (avctx->extradata) { - memcpy(tempbuf + size, avctx->extradata, avctx->extradata_size); - size += avctx->extradata_size; - } + + memcpy(tempbuf + size, &avctx->extradata_size, sizeof(avctx->extradata_size)); + size += sizeof(avctx->extradata_size); + if (avctx->extradata) { + memcpy(tempbuf + size, avctx->extradata, avctx->extradata_size); + size += avctx->extradata_size; } } } @@ -1127,10 +1137,8 @@ static bool codec_deinit(MaruBrillCodecState *s, int ctx_id, void *data_buf) } INFO("close avcontext of %d\n", ctx_id); - // qemu_mutex_lock(&s->threadpool.mutex); avcodec_close(avctx); CONTEXT(s, ctx_id).opened_context = false; - // qemu_mutex_unlock(&s->threadpool.mutex); if (avctx->extradata) { TRACE("free context extradata\n"); @@ -1140,7 +1148,11 @@ static bool codec_deinit(MaruBrillCodecState *s, int ctx_id, void *data_buf) if (frame) { TRACE("free frame\n"); +#if LIBAVUTIL_VERSION_CHECK avcodec_free_frame(&frame); +#else + av_frame_free(&frame); +#endif CONTEXT(s, ctx_id).frame = NULL; } @@ -1193,7 +1205,7 @@ static bool codec_flush_buffers(MaruBrillCodecState *s, int ctx_id, void *data_b if (pctx) { res = av_parser_parse2(pctx, avctx, &poutbuf, &poutbuf_size, p_inbuf, p_inbuf_size, -1, -1, -1); - INFO("before flush buffers, using parser. res: %d\n", res); + TRACE("before flush buffers, using parser. res: %d\n", res); } avcodec_flush_buffers(avctx); @@ -1257,7 +1269,6 @@ static bool codec_decode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu ERR("decode_video. %d of AVFrame is NULL.\n", ctx_id); } else { pctx = CONTEXT(s, ctx_id).parser_ctx; - len = parse_and_decode_video(avctx, picture, pctx, ctx_id, &avpkt, &got_picture, idx, in_offset); } @@ -1470,7 +1481,7 @@ static bool codec_encode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu AVFrame *pict = NULL; AVPacket avpkt; uint8_t *inbuf = NULL, *outbuf = NULL; - int inbuf_size = 0, outbuf_size = 0; + int inbuf_size = 0; int got_frame = 0, ret = 0, size = 0; int64_t in_timestamp = 0; int coded_frame = 0, key_frame = 0; @@ -1510,8 +1521,8 @@ static bool codec_encode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu } else if (!avctx->codec) { ERR("%d of AVCodec is NULL.\n", ctx_id); } else { - TRACE("pixel format: %d inbuf: %p, picture data: %p\n", - avctx->pix_fmt, inbuf, pict->data[0]); + TRACE("pixel format: %d inbuf: %p, inbuf_size: %d picture data: %p\n", + avctx->pix_fmt, inbuf, inbuf_size, pict->data[0]); ret = avpicture_fill((AVPicture *)pict, inbuf, avctx->pix_fmt, avctx->width, avctx->height); @@ -1521,16 +1532,15 @@ static bool codec_encode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu if (avctx->time_base.num == 0) { pict->pts = AV_NOPTS_VALUE; } else { - AVRational bq = - {1, (G_USEC_PER_SEC * G_GINT64_CONSTANT(1000))}; + AVRational bq = {1, (G_USEC_PER_SEC * G_GINT64_CONSTANT(1000))}; pict->pts = av_rescale_q(in_timestamp, bq, avctx->time_base); } - TRACE("encode video. ticks_per_frame:%d, pts:%lld\n", - avctx->ticks_per_frame, pict->pts); - outbuf_size = - (avctx->width * avctx->height * 6) + FF_MIN_BUFFER_SIZE; + TRACE("encode video. ticks_per_frame:%d, pts:%lld\n", avctx->ticks_per_frame, pict->pts); + int outbuf_size = 0; + + outbuf_size = (avctx->width * avctx->height * 6) + FF_MIN_BUFFER_SIZE; outbuf = g_malloc0(outbuf_size); avpkt.data = outbuf; @@ -1541,15 +1551,13 @@ static bool codec_encode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu } else { ret = avcodec_encode_video2(avctx, &avpkt, pict, &got_frame); - TRACE("encode video. ret %d got_picture %d outbuf_size %d\n", ret, got_frame, avpkt.size); - if (avctx->coded_frame) { - TRACE("encode video. keyframe %d\n", avctx->coded_frame->key_frame); - } + TRACE("encode video. ret %d got_picture %d outbuf_size %d keyframe %d pkt %d\n", + ret, got_frame, avpkt.size, avctx->coded_frame->key_frame, avpkt.flags); } } } - tempbuf_size = sizeof(ret); + tempbuf_size = sizeof(avpkt.size); if (ret < 0) { ERR("failed to encode video. ctx_id %d ret %d\n", ctx_id, ret); } else { @@ -1564,19 +1572,27 @@ static bool codec_encode_video(MaruBrillCodecState *s, int ctx_id, void *data_bu memcpy(tempbuf, &avpkt.size, sizeof(avpkt.size)); size = sizeof(avpkt.size); + TRACE("encode video. output_packet size %d\n", avpkt.size); + if ((got_frame) && outbuf) { // inform gstreamer plugin about the status of encoded frames - // A flag for output buffer in gstreamer is depending on the status. + // output buffer in gstreamer is depending on this status. + if (avctx->coded_frame) { - coded_frame = 1; + coded_frame = true; // if key_frame is 0, this frame cannot be decoded independently. - key_frame = avctx->coded_frame->key_frame; + if (avctx->codec_id == AV_CODEC_ID_H264) { + key_frame = avpkt.flags; + } else { + key_frame = avctx->coded_frame->key_frame; + } } + memcpy(tempbuf + size, &coded_frame, sizeof(coded_frame)); size += sizeof(coded_frame); memcpy(tempbuf + size, &key_frame, sizeof(key_frame)); size += sizeof(key_frame); - memcpy(tempbuf + size, outbuf, avpkt.size); + memcpy(tempbuf + size, avpkt.data, avpkt.size); } } @@ -1656,7 +1672,11 @@ static bool codec_encode_audio(MaruBrillCodecState *s, int ctx_id, void *data_bu nb_samples = audio_in_size / (bytes_per_sample * avctx->channels); TRACE("nb_samples %d\n", nb_samples); +#if LIBAVUTIL_VERSION_CHECK in_frame = avcodec_alloc_frame(); +#else + in_frame = av_frame_alloc(); +#endif if (!in_frame) { ERR("encode_audio. failed to allocate in_frame\n"); } else { @@ -1725,27 +1745,23 @@ static bool codec_encode_audio(MaruBrillCodecState *s, int ctx_id, void *data_bu static AVCodecParserContext *maru_brill_codec_parser_init(AVCodecContext *avctx) { AVCodecParserContext *parser = NULL; + int codec_id = avctx->codec_id; - if (!avctx) { - ERR("context is NULL\n"); - return NULL; - } - - switch (avctx->codec_id) { - case CODEC_ID_MPEG4: - case CODEC_ID_VC1: + switch (codec_id) { + case AV_CODEC_ID_MPEG4: + case AV_CODEC_ID_VC1: TRACE("not using parser\n"); break; - case CODEC_ID_H264: + case AV_CODEC_ID_H264: if (avctx->extradata_size == 0) { TRACE("H.264 with no extradata, creating parser.\n"); - parser = av_parser_init (avctx->codec_id); + parser = av_parser_init (codec_id); } break; default: - parser = av_parser_init(avctx->codec_id); + parser = av_parser_init(codec_id); if (parser) { - INFO("using parser: %s\n", avctx->codec->name); + INFO("using parser: %d\n", codec_id); } break; } diff --git a/tizen/src/hw/pci/maru_brillcodec.h b/tizen/src/hw/pci/maru_brillcodec.h index e814661a07..8ebd9493d2 100644 --- a/tizen/src/hw/pci/maru_brillcodec.h +++ b/tizen/src/hw/pci/maru_brillcodec.h @@ -35,11 +35,20 @@ #include "libavcodec/avcodec.h" -#define CODEC_CONTEXT_MAX 1024 +#define CODEC_CONTEXT_MAX 1024 #define CODEC_MEM_SIZE (32 * 1024 * 1024) #define CONTEXT(s, id) (s->context[id]) +// version check +#ifndef LIBAVCODEC_VERSION_CHECK +#define LIBAVCODEC_VERSION_CHECK (LIBAVCODEC_VERSION_MAJOR < 55) +#endif + +#ifndef LIBAVUTIL_VERSION_CHECK +#define LIBAVUTIL_VERSION_CHECK (LIBAVUTIL_VERSION_MAJOR < 53) +#endif + /* * Codec Device Structures */