diff -up gpac/configure.ffmpeg gpac/configure --- gpac/configure.ffmpeg 2010-06-25 14:17:46.000000000 +0200 +++ gpac/configure 2011-09-02 10:56:49.000000000 +0200 @@ -851,12 +851,21 @@ fi #look for FFMPEG support +if pkg-config --exists libavcodec libavformat libswscale 2> /dev/null ; then + ffmpeg_cflags=`pkg-config --cflags libavcodec libavformat libswscale libavutil` + ffmpeg_lflags=`pkg-config --libs libavcodec libavformat libswscale libavutil` + has_ffmpeg="system" +else + ffmpeg_cflags=`` + ffmpeg_lflags=`-lz -lavcodec -lavformat` +fi + cat > $TMPC << EOF #include int main( void ) { return 0; } EOF -if $cc $TMPO -c $TMPC 2> /dev/null ; then +if $cc $TMPO $ffmpeg_cflags -c $TMPC 2> /dev/null ; then old_ffmpeg_inc="no" else @@ -871,10 +880,10 @@ fi if test "$cross_prefix" != "" ; then - if $cc -o $TMPO $TMPC -I$prefix/include -L$prefix/lib -lz -lavcodec -lavformat -lavutil 2> /dev/null ; then + if $cc -o $TMPO $TMPC -I$prefix/include -L$prefix/lib $ffmpeg_cflags $ffmpeg_lflags 2> /dev/null ; then has_ffmpeg="system" else - if $cc -o $TMPO $TMPC -I$local_inc -L$local_lib -lz -lavcodec -lavformat 2> /dev/null ; then + if $cc -o $TMPO $TMPC -I$local_inc -L$local_lib $ffmpeg_cflags $ffmpeg_lflags 2> /dev/null ; then has_ffmpeg="local" echo OK fi @@ -1999,6 +2013,10 @@ echo "CONFIG_VORBIS=$has_vorbis" >> conf echo "CONFIG_THEORA=$has_theora" >> config.mak echo "CONFIG_FFMPEG=$has_ffmpeg" >> config.mak echo "CONFIG_FFMPEG_OLD=$old_ffmpeg_inc" >> config.mak +if test x$has_ffmpeg != x ; then + echo "FFMPEG_CFLAGS=$ffmpeg_cflags" >> config.mak + echo "FFMPEG_LFLAGS=$ffmpeg_lflags" >> config.mak +fi echo "CONFIG_OSS_AUDIO=$has_oss_audio" >> config.mak echo "CONFIG_ALSA=$has_alsa" >> config.mak diff -up gpac/modules/ffmpeg_in/ffmpeg_decode.c.ffmpeg gpac/modules/ffmpeg_in/ffmpeg_decode.c --- gpac/modules/ffmpeg_in/ffmpeg_decode.c.ffmpeg 2010-07-06 10:33:31.000000000 +0200 +++ gpac/modules/ffmpeg_in/ffmpeg_decode.c 2011-09-03 09:11:40.000000000 +0200 @@ -150,7 +150,11 @@ static GF_Err FFDEC_AttachStream(GF_Base bs = gf_bs_new(esd->decoderConfig->decoderSpecificInfo->data, esd->decoderConfig->decoderSpecificInfo->dataLength, GF_BITSTREAM_READ); codec_id = gf_bs_read_u32(bs); if (ffd->st==GF_STREAM_AUDIO) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_AUDIO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_AUDIO; +#endif (*ctx)->sample_rate = gf_bs_read_u32(bs); (*ctx)->channels = gf_bs_read_u16(bs); (*ctx)->frame_size = gf_bs_read_u16(bs); @@ -160,7 +164,11 @@ static GF_Err FFDEC_AttachStream(GF_Base /*ffmpeg specific*/ (*ctx)->block_align = gf_bs_read_u16(bs); } else if (ffd->st==GF_STREAM_VISUAL) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_VIDEO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_VIDEO; +#endif (*ctx)->width = gf_bs_read_u16(bs); (*ctx)->height = gf_bs_read_u16(bs); } @@ -177,7 +185,11 @@ static GF_Err FFDEC_AttachStream(GF_Base bs = gf_bs_new(esd->decoderConfig->decoderSpecificInfo->data, esd->decoderConfig->decoderSpecificInfo->dataLength, GF_BITSTREAM_READ); codec_id = gf_bs_read_u32(bs); if (ffd->st==GF_STREAM_AUDIO) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_AUDIO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_AUDIO; +#endif (*ctx)->sample_rate = gf_bs_read_u32(bs); (*ctx)->channels = gf_bs_read_u16(bs); (*ctx)->frame_size = gf_bs_read_u16(bs); @@ -190,7 +202,11 @@ static GF_Err FFDEC_AttachStream(GF_Base (*ctx)->frame_size = 160; } } else if (ffd->st==GF_STREAM_VISUAL) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_VIDEO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_VIDEO; +#endif (*ctx)->width = gf_bs_read_u16(bs); (*ctx)->height = gf_bs_read_u16(bs); } @@ -202,7 +218,11 @@ static GF_Err FFDEC_AttachStream(GF_Base else { u32 codec_id = 0; if (ffd->st==GF_STREAM_VISUAL) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_VIDEO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_VIDEO; +#endif switch (ffd->oti) { case GPAC_OTI_VIDEO_MPEG4_PART2: codec_id = CODEC_ID_MPEG4; @@ -229,7 +249,11 @@ static GF_Err FFDEC_AttachStream(GF_Base break; } } else if (ffd->st==GF_STREAM_AUDIO) { +#if LIBAVCODEC_VERSION_MAJOR < 53 (*ctx)->codec_type = CODEC_TYPE_AUDIO; +#else + (*ctx)->codec_type = AVMEDIA_TYPE_AUDIO; +#endif switch (ffd->oti) { case GPAC_OTI_AUDIO_MPEG2_PART3: case GPAC_OTI_AUDIO_MPEG1: @@ -284,7 +308,7 @@ static GF_Err FFDEC_AttachStream(GF_Base /*setup audio streams*/ if (ffd->st==GF_STREAM_AUDIO) { - if ((*codec)->type == CODEC_ID_MP2) { + if ((*codec)->id == CODEC_ID_MP2) { (*ctx)->frame_size = ((*ctx)->sample_rate > 24000) ? 1152 : 576; } /*may be 0 (cfg not known yet)*/ @@ -303,7 +327,15 @@ static GF_Err FFDEC_AttachStream(GF_Base break; case CODEC_ID_DVD_SUBTITLE: *frame = avcodec_alloc_frame(); +#if FF_API_VIDEO_OLD avcodec_decode_video((*ctx), *frame, &gotpic, esd->decoderConfig->decoderSpecificInfo->data, esd->decoderConfig->decoderSpecificInfo->dataLength); +#else + AVPacket avpkt; + av_init_packet(&avpkt); + avpkt.data = esd->decoderConfig->decoderSpecificInfo->data; + avpkt.size = esd->decoderConfig->decoderSpecificInfo->dataLength; + avcodec_decode_video2((*ctx), *frame, &gotpic, &avpkt); +#endif ffd->pix_fmt = GF_PIXEL_YV12; break; default: @@ -553,12 +585,24 @@ static GF_Err FFDEC_ProcessData(GF_Media redecode: gotpic = AVCODEC_MAX_AUDIO_FRAME_SIZE; +#if FF_API_AUDIO_OLD len = avcodec_decode_audio2(ctx, (short *)ffd->audio_buf, &gotpic, inBuffer + ffd->frame_start, inBufferLength - ffd->frame_start); +#else + AVPacket avpkt; + av_init_packet(&avpkt); + avpkt.data = inBuffer + ffd->frame_start; + avpkt.size = inBufferLength - ffd->frame_start; + len = avcodec_decode_audio3(ctx, (short *)ffd->audio_buf, &gotpic, &avpkt); +#endif if (len<0) { ffd->frame_start = 0; return GF_NON_COMPLIANT_BITSTREAM; } if (gotpic<0) { ffd->frame_start = 0; return GF_OK; } +#if FF_API_HURRY_UP ctx->hurry_up = 0; +#else + ctx->skip_frame = 0; +#endif /*first config*/ if (!ffd->out_size) { @@ -659,7 +703,15 @@ redecode: avcodec_close(ctx); *codec = avcodec_find_decoder(CODEC_ID_H263); if (! (*codec) || (avcodec_open(ctx, *codec)<0)) return GF_NON_COMPLIANT_BITSTREAM; +#if FF_API_VIDEO_OLD if (avcodec_decode_video(ctx, frame, &gotpic, inBuffer, inBufferLength) < 0) { +#else + AVPacket avpkt; + av_init_packet(&avpkt); + avpkt.data = inBuffer; + avpkt.size = inBufferLength; + if (avcodec_decode_video2(ctx, frame, &gotpic, &avpkt) < 0) { +#endif /*nope, stay in MPEG-4*/ avcodec_close(ctx); *codec = avcodec_find_decoder(old_codec); @@ -669,7 +721,11 @@ redecode: } } } +#if FF_API_HURRY_UP ctx->hurry_up = 0; +#else + ctx->skip_frame = 0; +#endif /*some streams use odd width/height frame values*/ if (ffd->out_pix_fmt == GF_PIXEL_YV12) { diff -up gpac/modules/ffmpeg_in/ffmpeg_demux.c.ffmpeg gpac/modules/ffmpeg_in/ffmpeg_demux.c --- gpac/modules/ffmpeg_in/ffmpeg_demux.c.ffmpeg 2010-05-27 10:42:25.000000000 +0200 +++ gpac/modules/ffmpeg_in/ffmpeg_demux.c 2011-09-03 09:21:08.000000000 +0200 @@ -242,10 +242,18 @@ static Bool FFD_CanHandleURL(GF_InputSer for(i = 0; i < ctx->nb_streams; i++) { AVCodecContext *enc = ctx->streams[i]->codec; switch(enc->codec_type) { +#if LIBAVCODEC_VERSION_MAJOR < 53 case CODEC_TYPE_AUDIO: +#else + case AVMEDIA_TYPE_AUDIO: +#endif if (!has_audio) has_audio = 1; break; +#if LIBAVCODEC_VERSION_MAJOR < 53 case CODEC_TYPE_VIDEO: +#else + case AVMEDIA_TYPE_VIDEO: +#endif if (!has_video) has_video= 1; break; default: @@ -255,7 +263,11 @@ static Bool FFD_CanHandleURL(GF_InputSer if (!has_audio && !has_video) goto exit; ret = 1; +#if FF_API_GUESS_FORMAT fmt_out = guess_stream_format(NULL, url, NULL); +#else + fmt_out = av_guess_format(NULL, url, NULL); +#endif if (fmt_out) gf_term_register_mime_type(plug, fmt_out->mime_type, fmt_out->extensions, fmt_out->name); else { ext = strrchr(szName, '.'); @@ -554,10 +566,17 @@ static GF_Err FFD_ConnectService(GF_Inpu switch (res) { #ifndef _WIN32_WCE case 0: e = GF_OK; break; +#if LIBAVUTIL_VERSION_MAJOR < 51 case AVERROR_IO: e = GF_URL_ERROR; goto err_exit; case AVERROR_INVALIDDATA: e = GF_NON_COMPLIANT_BITSTREAM; goto err_exit; case AVERROR_NOMEM: e = GF_OUT_OF_MEM; goto err_exit; case AVERROR_NOFMT: e = GF_NOT_SUPPORTED; goto err_exit; +#else + case AVERROR(EIO): e = GF_URL_ERROR; goto err_exit; + case AVERROR(EINVAL): e = GF_NON_COMPLIANT_BITSTREAM; goto err_exit; + case AVERROR(ENOMEM): e = GF_OUT_OF_MEM; goto err_exit; + case AVERROR(EILSEQ): e = GF_NOT_SUPPORTED; goto err_exit; +#endif #endif default: e = GF_SERVICE_ERROR; goto err_exit; } @@ -577,13 +596,21 @@ static GF_Err FFD_ConnectService(GF_Inpu for (i = 0; i < ffd->ctx->nb_streams; i++) { AVCodecContext *enc = ffd->ctx->streams[i]->codec; switch(enc->codec_type) { +#if LIBAVCODEC_VERSION_MAJOR < 53 case CODEC_TYPE_AUDIO: +#else + case AVMEDIA_TYPE_AUDIO: +#endif if ((ffd->audio_st<0) && (ffd->service_type!=1)) { ffd->audio_st = i; ffd->audio_tscale = ffd->ctx->streams[i]->time_base; } break; +#if LIBAVCODEC_VERSION_MAJOR < 53 case CODEC_TYPE_VIDEO: +#else + case AVMEDIA_TYPE_VIDEO: +#endif if ((ffd->video_st<0) && (ffd->service_type!=2)) { ffd->video_st = i; ffd->video_tscale = ffd->ctx->streams[i]->time_base; diff -up gpac/modules/ffmpeg_in/Makefile.ffmpeg gpac/modules/ffmpeg_in/Makefile --- gpac/modules/ffmpeg_in/Makefile.ffmpeg 2010-05-21 09:49:31.000000000 +0200 +++ gpac/modules/ffmpeg_in/Makefile 2011-09-02 10:56:49.000000000 +0200 @@ -2,7 +2,7 @@ include ../../config.mak vpath %.c $(SRC_PATH)/modules/ffmpeg_in -CFLAGS= $(OPTFLAGS) -I$(SRC_PATH)/include +CFLAGS= $(OPTFLAGS) -I$(SRC_PATH)/include $(FFMPEG_CFLAGS) ifeq ($(DEBUGBUILD), yes) CFLAGS+=-g @@ -15,7 +15,7 @@ LDFLAGS+=-pg endif LOCAL_LIB= -LINKLIBS=-lgpac -lavcodec -lavformat -lavutil -lz +LINKLIBS=-lgpac -lz $(FFMPEG_LFLAGS) #darwin needs bz2 ifeq ($(CONFIG_DARWIN),yes) @@ -25,8 +25,6 @@ endif #old ffmpeg lib ifeq ($(CONFIG_FFMPEG_OLD), yes) CFLAGS+=-DFFMPEG_OLD_HEADERS -else -LINKLIBS+=-lswscale endif #common obj