Index: modules/ffmpeg_in/ffmpeg_in.h =================================================================== --- modules/ffmpeg_in/ffmpeg_in.h (revision 4282) +++ modules/ffmpeg_in/ffmpeg_in.h (revision 4451) @@ -120,7 +120,7 @@ /*for audio packed frames*/ u32 frame_start; - char audio_buf[AVCODEC_MAX_AUDIO_FRAME_SIZE]; + char audio_buf[192000]; Bool check_h264_isma; u32 base_ES_ID; Index: modules/ffmpeg_in/ffmpeg_load.c =================================================================== --- modules/ffmpeg_in/ffmpeg_load.c (revision 4282) +++ modules/ffmpeg_in/ffmpeg_load.c (revision 4451) @@ -44,7 +44,7 @@ #endif -GF_EXPORT +GPAC_MODULE_EXPORT const u32 *QueryInterfaces() { static u32 si [] = { @@ -57,7 +57,7 @@ return si; } -GF_EXPORT +GPAC_MODULE_EXPORT GF_BaseInterface *LoadInterface(u32 InterfaceType) { if (InterfaceType == GF_MEDIA_DECODER_INTERFACE) return FFDEC_Load(); @@ -67,7 +67,7 @@ return NULL; } -GF_EXPORT +GPAC_MODULE_EXPORT void ShutdownInterface(GF_BaseInterface *ifce) { switch (ifce->InterfaceType) { @@ -81,3 +81,6 @@ #endif } } + + +GPAC_MODULE_STATIC_DELARATION( ffmpeg ) Index: modules/ffmpeg_in/ffmpeg_demux.c =================================================================== --- modules/ffmpeg_in/ffmpeg_demux.c (revision 4282) +++ modules/ffmpeg_in/ffmpeg_demux.c (revision 4451) @@ -53,6 +53,18 @@ #define AVERROR_NOFMT AVERROR(EINVAL) #endif /* AVERROR_NOFMT */ + +#if (LIBAVFORMAT_VERSION_MAJOR >= 54) && (LIBAVFORMAT_VERSION_MINOR >= 20) + +#define av_find_stream_info(__c) avformat_find_stream_info(__c, NULL) +#ifndef FF_API_FORMAT_PARAMETERS +#define FF_API_FORMAT_PARAMETERS 1 +#endif + +#endif + + + static u32 FFDemux_Run(void *par) { AVPacket pkt; @@ -76,7 +88,7 @@ seek_to = (s64) (AV_TIME_BASE*ffd->seek_time); map_video_time = !ffd->seekable; - video_init = (seek_to && ffd->video_ch) ? 0 : 1; + video_init = (seek_to && ffd->video_ch) ? GF_FALSE : GF_TRUE; seek_audio = seek_video = 0; if (ffd->seekable && (ffd->audio_st>=0)) seek_audio = (u64) (s64) (ffd->seek_time*ffd->audio_tscale.den); if (ffd->seekable && (ffd->video_st>=0)) seek_video = (u64) (s64) (ffd->seek_time*ffd->video_tscale.den); Index: modules/ffmpeg_in/ffmpeg_decode.c =================================================================== --- modules/ffmpeg_in/ffmpeg_decode.c (revision 4282) +++ modules/ffmpeg_in/ffmpeg_decode.c (revision 4451) @@ -38,8 +38,14 @@ #undef USE_AVCODEC2 #endif +#if (LIBAVCODEC_VERSION_MAJOR >= 55) +#define USE_AVCTX3 +#elif (LIBAVCODEC_VERSION_MAJOR >= 54) && (LIBAVCODEC_VERSION_MINOR >= 35) +#define USE_AVCTX3 +#endif + /** * Allocates data for FFMPEG decoding * \param oldBuffer The oldBuffer (freed if not NULL) @@ -170,7 +176,12 @@ frame = &ffd->base_frame; } if (!(*ctx)){ + +#ifdef USE_AVCTX3 + *ctx = avcodec_alloc_context3(NULL); +#else *ctx = avcodec_alloc_context(); +#endif } /*private FFMPEG DSI*/ @@ -318,7 +329,11 @@ (*ctx)->pix_fmt = ffd->raw_pix_fmt; if ((*ctx)->extradata && strstr((*ctx)->extradata, "BottomUp")) ffd->flipped = 1; } else { +#ifdef USE_AVCTX3 + if (avcodec_open2((*ctx), (*codec), NULL )<0) return GF_NON_COMPLIANT_BITSTREAM; +#else if (avcodec_open((*ctx), (*codec) )<0) return GF_NON_COMPLIANT_BITSTREAM; +#endif } /*setup audio streams*/ @@ -612,10 +627,11 @@ if (ffd->frame_start>inBufferLength) ffd->frame_start = 0; redecode: - gotpic = AVCODEC_MAX_AUDIO_FRAME_SIZE; #ifdef USE_AVCODEC2 + gotpic = 0; len = avcodec_decode_audio3(ctx, (short *)ffd->audio_buf, &gotpic, &pkt); #else + gotpic = AVCODEC_MAX_AUDIO_FRAME_SIZE; len = avcodec_decode_audio2(ctx, (short *)ffd->audio_buf, &gotpic, inBuffer + ffd->frame_start, inBufferLength - ffd->frame_start); #endif if (len<0) { ffd->frame_start = 0; return GF_NON_COMPLIANT_BITSTREAM; } @@ -755,7 +771,13 @@ here this means the DSI was broken, so no big deal*/ avcodec_close(ctx); *codec = avcodec_find_decoder(CODEC_ID_H263); + +#ifdef USE_AVCTX3 + if (! (*codec) || (avcodec_open2(ctx, *codec, NULL)<0)) return GF_NON_COMPLIANT_BITSTREAM; +#else if (! (*codec) || (avcodec_open(ctx, *codec)<0)) return GF_NON_COMPLIANT_BITSTREAM; +#endif + #if USE_AVCODEC2 if (avcodec_decode_video2(ctx, frame, &gotpic, &pkt) < 0) { #else @@ -765,7 +787,11 @@ avcodec_close(ctx); *codec = avcodec_find_decoder(old_codec); assert(*codec); +#ifdef USE_AVCTX3 + avcodec_open2(ctx, *codec, NULL); +#else avcodec_open(ctx, *codec); +#endif return GF_NON_COMPLIANT_BITSTREAM; } } @@ -979,7 +1005,7 @@ else if (StreamType==GF_STREAM_VISUAL) { /*fixme - we should use some priority rather than declare ffmpeg can't handle svc*/ - if (esd->decoderConfig->objectTypeIndication == GPAC_OTI_VIDEO_AVC) { + if (esd->decoderConfig->objectTypeIndication == GPAC_OTI_VIDEO_AVC){ if (esd->decoderConfig->decoderSpecificInfo && esd->decoderConfig->decoderSpecificInfo->data) { Bool is_svc = 0; u32 i, count; @@ -1003,7 +1029,7 @@ gf_odf_avc_cfg_del(cfg); return (is_svc || esd->decoderConfig->rvc_config || esd->decoderConfig->predefined_rvc_config) ? GF_CODEC_MAYBE_SUPPORTED : GF_CODEC_SUPPORTED; } - if (esd->decoderConfig->rvc_config || esd->decoderConfig->predefined_rvc_config) return GF_CODEC_MAYBE_SUPPORTED; + if (esd->decoderConfig->rvc_config || esd->decoderConfig->predefined_rvc_config || esd->has_ref_base) return GF_CODEC_MAYBE_SUPPORTED; return GF_CODEC_SUPPORTED; } @@ -1011,7 +1037,8 @@ /*MPEG-4 v1 simple profile*/ case GPAC_OTI_VIDEO_MPEG4_PART2: codec_id = CODEC_ID_MPEG4; break; /*H264 (not std OTI, just the way we use it internally)*/ - case GPAC_OTI_VIDEO_AVC: codec_id = CODEC_ID_H264; break; + case GPAC_OTI_VIDEO_AVC: + codec_id = CODEC_ID_H264; break; /*MPEG1 video*/ case GPAC_OTI_VIDEO_MPEG1: /*MPEG2 video*/