Package: vxl Version: 1.17.0.dfsg2-2 Severity: important Tags: patch User: pkg-multimedia-maintain...@lists.alioth.debian.org Usertags: ffmpeg2.9
Dear Maintainer, your package fails to build with the upcoming ffmpeg 2.9. This bug will become release-critical at some point when the ffmpeg2.9 transition gets closer. Attached is a patch replacing the deprecated functionality. It also works with ffmpeg 2.8. Please apply this patch and forward it upstream, if necessary. These changes are non-trivial and should be runtime-tested. Best regards, Andreas
diff --git a/debian/control b/debian/control index 9de0530..93c2a2b 100644 --- a/debian/control +++ b/debian/control @@ -7,6 +7,7 @@ Build-Depends: cmake, debhelper (>= 9), freeglut3-dev, libavcodec-dev (>= 6:10~), + libavfilter-dev, libavformat-dev (>= 6:10~), libavifile-0.7-dev, libbz2-dev, diff --git a/debian/patches/ffmpeg_2.9.patch b/debian/patches/ffmpeg_2.9.patch new file mode 100644 index 0000000..96dc900 --- /dev/null +++ b/debian/patches/ffmpeg_2.9.patch @@ -0,0 +1,439 @@ +Description: Replace deprecated FFmpeg API +Author: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> +Last-Update: <2015-11-02> + +--- vxl-1.17.0.dfsg2.orig/config/cmake/Modules/NewCMake/FindFFMPEG.cmake ++++ vxl-1.17.0.dfsg2/config/cmake/Modules/NewCMake/FindFFMPEG.cmake +@@ -48,6 +48,13 @@ ELSE( FFMPEG_CONFIG ) + /usr/local/lib64 + ) + ++ FIND_LIBRARY( FFMPEG_avfilter_LIBRARY avfilter ++ /usr/lib ++ /usr/local/lib ++ /usr/lib64 ++ /usr/local/lib64 ++ ) ++ + FIND_LIBRARY( FFMPEG_avformat_LIBRARY avformat + /usr/lib + /usr/local/lib +@@ -71,9 +78,10 @@ ELSE( FFMPEG_CONFIG ) + + IF( FFMPEG_avcodec_LIBRARY ) + IF( FFMPEG_avformat_LIBRARY ) ++ IF( FFMPEG_avfilter_LIBRARY ) + + SET( FFMPEG_FOUND "YES" ) +- SET( FFMPEG_LIBRARIES ${FFMPEG_avformat_LIBRARY} ${FFMPEG_avcodec_LIBRARY} ) ++ SET( FFMPEG_LIBRARIES ${FFMPEG_avformat_LIBRARY} ${FFMPEG_avcodec_LIBRARY} ${FFMPEG_avfilter_LIBRARY} ) + IF( FFMPEG_avutil_LIBRARY ) + SET( FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${FFMPEG_avutil_LIBRARY} ) + ENDIF( FFMPEG_avutil_LIBRARY ) +@@ -81,6 +89,7 @@ ELSE( FFMPEG_CONFIG ) + SET( FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${FFMPEG_swscale_LIBRARY} ) + ENDIF( FFMPEG_swscale_LIBRARY ) + ++ ENDIF( FFMPEG_avfilter_LIBRARY ) + ENDIF( FFMPEG_avformat_LIBRARY ) + ENDIF( FFMPEG_avcodec_LIBRARY ) + +--- vxl-1.17.0.dfsg2.orig/core/vgui/vgui_section_buffer.cxx ++++ vxl-1.17.0.dfsg2/core/vgui/vgui_section_buffer.cxx +@@ -458,8 +458,8 @@ apply( vil1_image const& image, + bool conversion_ok = false; + bool section_ok = false; + +-#define DoCase( PixelFormat, DataType, NComp ) \ +- case PixelFormat: \ ++#define DoCase( AVPixelFormat, DataType, NComp ) \ ++ case AVPixelFormat: \ + { \ + DataType* temp_buffer = new DataType[ w_ * h_ * NComp ]; \ + section_ok = image.get_section( temp_buffer, x_, y_, w_, h_ ); \ +--- vxl-1.17.0.dfsg2.orig/core/vidl/vidl_ffmpeg_convert.cxx ++++ vxl-1.17.0.dfsg2/core/vidl/vidl_ffmpeg_convert.cxx +@@ -16,8 +16,8 @@ + + #ifdef LIBAVFORMAT_BUILD + #if LIBAVFORMAT_BUILD <= 4623 +-// PIX_FMT_NONE is undefined in old versions of FFMPEG +-#define PIX_FMT_NONE PixelFormat(-1) ++// AV_PIX_FMT_NONE is undefined in old versions of FFMPEG ++#define AV_PIX_FMT_NONE AVPixelFormat(-1) + #endif + #endif + +@@ -42,13 +42,13 @@ bool vidl_ffmpeg_convert(const vidl_fram + if (!in_frame || !out_frame) + return false; + +- PixelFormat in_fmt = ++ AVPixelFormat in_fmt = + vidl_pixel_format_to_ffmpeg(in_frame->pixel_format()); + +- PixelFormat out_fmt = ++ AVPixelFormat out_fmt = + vidl_pixel_format_to_ffmpeg(out_frame->pixel_format()); + +- if (in_fmt == PIX_FMT_NONE || out_fmt == PIX_FMT_NONE) ++ if (in_fmt == AV_PIX_FMT_NONE || out_fmt == AV_PIX_FMT_NONE) + return false; + + unsigned ni = in_frame->ni(); +@@ -91,29 +91,29 @@ bool vidl_ffmpeg_convert(const vidl_fram + + //: Find the vidl pixel format that matches a FFMPEG one + vidl_pixel_format +-vidl_pixel_format_from_ffmpeg(PixelFormat ffmpeg_pix_fmt) ++vidl_pixel_format_from_ffmpeg(AVPixelFormat ffmpeg_pix_fmt) + { + switch (ffmpeg_pix_fmt) + { +- case PIX_FMT_YUV420P: return VIDL_PIXEL_FORMAT_YUV_420P; +- case PIX_FMT_YUYV422: return VIDL_PIXEL_FORMAT_YUYV_422; +- case PIX_FMT_RGB24: return VIDL_PIXEL_FORMAT_RGB_24; +- case PIX_FMT_BGR24: return VIDL_PIXEL_FORMAT_BGR_24; +- case PIX_FMT_YUV422P: return VIDL_PIXEL_FORMAT_YUV_422P; +- case PIX_FMT_YUV444P: return VIDL_PIXEL_FORMAT_YUV_444P; +-#ifdef PIX_FMT_RGBA +- case PIX_FMT_RGBA: return VIDL_PIXEL_FORMAT_RGBA_32; +-#endif +- case PIX_FMT_YUV410P: return VIDL_PIXEL_FORMAT_YUV_410P; +- case PIX_FMT_YUV411P: return VIDL_PIXEL_FORMAT_YUV_411P; +- case PIX_FMT_RGB565: return VIDL_PIXEL_FORMAT_RGB_565; +- case PIX_FMT_RGB555: return VIDL_PIXEL_FORMAT_RGB_555; +- case PIX_FMT_GRAY8: return VIDL_PIXEL_FORMAT_MONO_8; +- case PIX_FMT_PAL8: return VIDL_PIXEL_FORMAT_MONO_8; //HACK: Treating 8-bit palette as greyscale image +- case PIX_FMT_MONOWHITE: return VIDL_PIXEL_FORMAT_MONO_1; +- case PIX_FMT_MONOBLACK: return VIDL_PIXEL_FORMAT_MONO_1; +- case PIX_FMT_UYVY422: return VIDL_PIXEL_FORMAT_UYVY_422; +- case PIX_FMT_UYYVYY411: return VIDL_PIXEL_FORMAT_UYVY_411; ++ case AV_PIX_FMT_YUV420P: return VIDL_PIXEL_FORMAT_YUV_420P; ++ case AV_PIX_FMT_YUYV422: return VIDL_PIXEL_FORMAT_YUYV_422; ++ case AV_PIX_FMT_RGB24: return VIDL_PIXEL_FORMAT_RGB_24; ++ case AV_PIX_FMT_BGR24: return VIDL_PIXEL_FORMAT_BGR_24; ++ case AV_PIX_FMT_YUV422P: return VIDL_PIXEL_FORMAT_YUV_422P; ++ case AV_PIX_FMT_YUV444P: return VIDL_PIXEL_FORMAT_YUV_444P; ++#ifdef AV_PIX_FMT_RGBA ++ case AV_PIX_FMT_RGBA: return VIDL_PIXEL_FORMAT_RGBA_32; ++#endif ++ case AV_PIX_FMT_YUV410P: return VIDL_PIXEL_FORMAT_YUV_410P; ++ case AV_PIX_FMT_YUV411P: return VIDL_PIXEL_FORMAT_YUV_411P; ++ case AV_PIX_FMT_RGB565: return VIDL_PIXEL_FORMAT_RGB_565; ++ case AV_PIX_FMT_RGB555: return VIDL_PIXEL_FORMAT_RGB_555; ++ case AV_PIX_FMT_GRAY8: return VIDL_PIXEL_FORMAT_MONO_8; ++ case AV_PIX_FMT_PAL8: return VIDL_PIXEL_FORMAT_MONO_8; //HACK: Treating 8-bit palette as greyscale image ++ case AV_PIX_FMT_MONOWHITE: return VIDL_PIXEL_FORMAT_MONO_1; ++ case AV_PIX_FMT_MONOBLACK: return VIDL_PIXEL_FORMAT_MONO_1; ++ case AV_PIX_FMT_UYVY422: return VIDL_PIXEL_FORMAT_UYVY_422; ++ case AV_PIX_FMT_UYYVYY411: return VIDL_PIXEL_FORMAT_UYVY_411; + default: break; + } + return VIDL_PIXEL_FORMAT_UNKNOWN; +@@ -121,29 +121,29 @@ vidl_pixel_format_from_ffmpeg(PixelForma + + + //: Find the FFMPEG pixel format that matches a vidl one +-PixelFormat ++AVPixelFormat + vidl_pixel_format_to_ffmpeg(vidl_pixel_format vidl_pix_fmt) + { + switch (vidl_pix_fmt) + { +- case VIDL_PIXEL_FORMAT_RGB_24: return PIX_FMT_RGB24; +- case VIDL_PIXEL_FORMAT_BGR_24: return PIX_FMT_BGR24; +-#ifdef PIX_FMT_RGBA +- case VIDL_PIXEL_FORMAT_RGBA_32: return PIX_FMT_RGBA; +-#endif +- case VIDL_PIXEL_FORMAT_RGB_565: return PIX_FMT_RGB565; +- case VIDL_PIXEL_FORMAT_RGB_555: return PIX_FMT_RGB555; +- case VIDL_PIXEL_FORMAT_YUV_444P: return PIX_FMT_YUV444P; +- case VIDL_PIXEL_FORMAT_YUYV_422: return PIX_FMT_YUYV422; +- case VIDL_PIXEL_FORMAT_YUV_422P: return PIX_FMT_YUV422P; +- case VIDL_PIXEL_FORMAT_YUV_420P: return PIX_FMT_YUV420P; +- case VIDL_PIXEL_FORMAT_YUV_411P: return PIX_FMT_YUV411P; +- case VIDL_PIXEL_FORMAT_YUV_410P: return PIX_FMT_YUV410P; +- case VIDL_PIXEL_FORMAT_UYVY_422: return PIX_FMT_UYVY422; +- case VIDL_PIXEL_FORMAT_UYVY_411: return PIX_FMT_UYYVYY411; +- case VIDL_PIXEL_FORMAT_MONO_1: return PIX_FMT_MONOBLACK; +- case VIDL_PIXEL_FORMAT_MONO_8: return PIX_FMT_GRAY8; ++ case VIDL_PIXEL_FORMAT_RGB_24: return AV_PIX_FMT_RGB24; ++ case VIDL_PIXEL_FORMAT_BGR_24: return AV_PIX_FMT_BGR24; ++#ifdef AV_PIX_FMT_RGBA ++ case VIDL_PIXEL_FORMAT_RGBA_32: return AV_PIX_FMT_RGBA; ++#endif ++ case VIDL_PIXEL_FORMAT_RGB_565: return AV_PIX_FMT_RGB565; ++ case VIDL_PIXEL_FORMAT_RGB_555: return AV_PIX_FMT_RGB555; ++ case VIDL_PIXEL_FORMAT_YUV_444P: return AV_PIX_FMT_YUV444P; ++ case VIDL_PIXEL_FORMAT_YUYV_422: return AV_PIX_FMT_YUYV422; ++ case VIDL_PIXEL_FORMAT_YUV_422P: return AV_PIX_FMT_YUV422P; ++ case VIDL_PIXEL_FORMAT_YUV_420P: return AV_PIX_FMT_YUV420P; ++ case VIDL_PIXEL_FORMAT_YUV_411P: return AV_PIX_FMT_YUV411P; ++ case VIDL_PIXEL_FORMAT_YUV_410P: return AV_PIX_FMT_YUV410P; ++ case VIDL_PIXEL_FORMAT_UYVY_422: return AV_PIX_FMT_UYVY422; ++ case VIDL_PIXEL_FORMAT_UYVY_411: return AV_PIX_FMT_UYYVYY411; ++ case VIDL_PIXEL_FORMAT_MONO_1: return AV_PIX_FMT_MONOBLACK; ++ case VIDL_PIXEL_FORMAT_MONO_8: return AV_PIX_FMT_GRAY8; + default: break; + } +- return PIX_FMT_NONE; ++ return AV_PIX_FMT_NONE; + } +--- vxl-1.17.0.dfsg2.orig/core/vidl/vidl_ffmpeg_convert.h ++++ vxl-1.17.0.dfsg2/core/vidl/vidl_ffmpeg_convert.h +@@ -39,11 +39,11 @@ bool vidl_ffmpeg_convert(const vidl_fram + + //: Find the vidl pixel format that matches a FFMPEG one + vidl_pixel_format +-vidl_pixel_format_from_ffmpeg(PixelFormat ffmpeg_pix_fmt); ++vidl_pixel_format_from_ffmpeg(AVPixelFormat ffmpeg_pix_fmt); + + + //: Find the FFMPEG pixel format that matches a vidl one +-PixelFormat ++AVPixelFormat + vidl_pixel_format_to_ffmpeg(vidl_pixel_format vidl_pix_fmt); + + #endif // vidl_ffmpeg_convert_h_ +--- vxl-1.17.0.dfsg2.orig/core/vidl/vidl_ffmpeg_istream_v3.txx ++++ vxl-1.17.0.dfsg2/core/vidl/vidl_ffmpeg_istream_v3.txx +@@ -25,6 +25,9 @@ extern "C" { + #include <libavcodec/avcodec.h> + #include <libavformat/avformat.h> + #include <libswscale/swscale.h> ++#include <libavfilter/avfilter.h> ++#include <libavfilter/buffersrc.h> ++#include <libavfilter/buffersink.h> + #else + #include <ffmpeg/avcodec.h> + #include <ffmpeg/avformat.h> +@@ -34,6 +37,17 @@ extern "C" { + + //-------------------------------------------------------------------------------- + ++typedef struct filter_ctx_ ++{ ++ AVFilterContext *buffersink_ctx; ++ AVFilterContext *buffersrc_ctx; ++ AVFilterGraph *filter_graph; ++ AVFrame *filter_frame; ++ int last_width; ++ int last_height; ++ enum AVPixelFormat last_pixfmt; ++} filter_ctx; ++ + struct vidl_ffmpeg_istream::pimpl + { + pimpl() +@@ -96,8 +110,9 @@ struct vidl_ffmpeg_istream::pimpl + //: Some codec/file format combinations need a frame number offset. + // These codecs have a delay between reading packets and generating frames. + unsigned frame_number_offset_; +-}; + ++ filter_ctx fctx; ++}; + + //-------------------------------------------------------------------------------- + +@@ -107,6 +122,9 @@ vidl_ffmpeg_istream() + : is_( new vidl_ffmpeg_istream::pimpl ) + { + vidl_ffmpeg_init(); ++ is_->fctx.last_width = -1; ++ is_->fctx.last_height = -1; ++ is_->fctx.last_pixfmt = AV_PIX_FMT_NONE; + } + + +@@ -119,11 +137,18 @@ vidl_ffmpeg_istream(const vcl_string& fi + open(filename); + } + ++static void delete_filter_graph(filter_ctx *fctx) { ++ if (fctx->filter_graph) { ++ av_frame_free(&fctx->filter_frame); ++ avfilter_graph_free(&fctx->filter_graph); ++ } ++} + + //: Destructor + vidl_ffmpeg_istream:: + ~vidl_ffmpeg_istream() + { ++ delete_filter_graph(&is_->fctx); + close(); + delete is_; + } +@@ -170,7 +195,7 @@ open(const vcl_string& filename) + } + + is_->vid_str_ = is_->fmt_cxt_->streams[ is_->vid_index_ ]; +- is_->frame_ = avcodec_alloc_frame(); ++ is_->frame_ = av_frame_alloc(); + + if ( is_->vid_str_->start_time == int64_t(1)<<63 ) { + is_->start_time = 0; +@@ -205,7 +230,7 @@ close() + av_free_packet( &is_->packet_ ); // free last packet + + if ( is_->frame_ ) { +- av_freep( &is_->frame_ ); ++ av_frame_free( &is_->frame_ ); + } + + is_->num_frames_ = -2; +@@ -450,6 +475,66 @@ vidl_ffmpeg_istream::read_frame() + return NULL; + } + ++static int init_filter_graph(filter_ctx *fctx, enum AVPixelFormat pixfmt, int width, int height) { ++ AVFilterInOut *inputs = NULL, *outputs = NULL; ++ char args[512]; ++ int res; ++ ++ delete_filter_graph(fctx); ++ fctx->filter_graph = avfilter_graph_alloc(); ++ snprintf(args, sizeof(args), ++ "buffer=video_size=%dx%d:pix_fmt=%d:time_base=1/1:pixel_aspect=0/1[in];" ++ "[in]yadif[out];" ++ "[out]buffersink", ++ width, height, pixfmt); ++ res = avfilter_graph_parse2(fctx->filter_graph, args, &inputs, &outputs); ++ if (res < 0) ++ return res; ++ if(inputs || outputs) ++ return -1; ++ res = avfilter_graph_config(fctx->filter_graph, NULL); ++ if (res < 0) ++ return res; ++ ++ fctx->buffersrc_ctx = avfilter_graph_get_filter(fctx->filter_graph, "Parsed_buffer_0"); ++ fctx->buffersink_ctx = avfilter_graph_get_filter(fctx->filter_graph, "Parsed_buffersink_2"); ++ if (!fctx->buffersrc_ctx || !fctx->buffersink_ctx) ++ return -1; ++ fctx->filter_frame = av_frame_alloc(); ++ fctx->last_width = width; ++ fctx->last_height = height; ++ fctx->last_pixfmt = pixfmt; ++ ++ return 0; ++} ++ ++static int process_filter_graph(filter_ctx *fctx, AVPicture *dst, const AVPicture *src, ++ enum AVPixelFormat pixfmt, int width, int height) { ++ int res; ++ ++ if (!fctx->filter_graph || width != fctx->last_width || ++ height != fctx->last_height || pixfmt != fctx->last_pixfmt) { ++ res = init_filter_graph(fctx, pixfmt, width, height); ++ if (res < 0) ++ return res; ++ } ++ ++ memcpy(fctx->filter_frame->data, src->data, sizeof(src->data)); ++ memcpy(fctx->filter_frame->linesize, src->linesize, sizeof(src->linesize)); ++ fctx->filter_frame->width = width; ++ fctx->filter_frame->height = height; ++ fctx->filter_frame->format = pixfmt; ++ res = av_buffersrc_add_frame(fctx->buffersrc_ctx, fctx->filter_frame); ++ if (res < 0) ++ return res; ++ res = av_buffersink_get_frame(fctx->buffersink_ctx, fctx->filter_frame); ++ if (res < 0) ++ return res; ++ av_picture_copy(dst, (const AVPicture *) fctx->filter_frame, pixfmt, width, height); ++ av_frame_unref(fctx->filter_frame); ++ ++ return 0; ++} + + //: Return the current frame in the stream + vidl_frame_sptr +@@ -468,7 +553,7 @@ vidl_ffmpeg_istream::current_frame() + + // Deinterlace if requested + if ( is_->deinterlace_ ) { +- avpicture_deinterlace( (AVPicture*)is_->frame_, (AVPicture*)is_->frame_, ++ process_filter_graph(&is_->fctx, (AVPicture*)is_->frame_, (AVPicture*)is_->frame_, + enc->pix_fmt, width, height ); + } + +@@ -486,7 +571,7 @@ vidl_ffmpeg_istream::current_frame() + is_->sws_context_ = sws_getCachedContext( + is_->sws_context_, + width, height, enc->pix_fmt, +- width, height, PIX_FMT_RGB24, ++ width, height, AV_PIX_FMT_RGB24, + SWS_BILINEAR, + NULL, NULL, NULL ); + +@@ -496,7 +581,7 @@ vidl_ffmpeg_istream::current_frame() + } + + AVPicture rgb_frame; +- avpicture_fill(&rgb_frame, (uint8_t*)is_->contig_memory_->data(), PIX_FMT_RGB24, width, height); ++ avpicture_fill(&rgb_frame, (uint8_t*)is_->contig_memory_->data(), AV_PIX_FMT_RGB24, width, height); + + sws_scale( is_->sws_context_, + is_->frame_->data, is_->frame_->linesize, +--- vxl-1.17.0.dfsg2.orig/core/vidl/vidl_ffmpeg_ostream_v4.txx ++++ vxl-1.17.0.dfsg2/core/vidl/vidl_ffmpeg_ostream_v4.txx +@@ -100,6 +100,7 @@ bool + vidl_ffmpeg_ostream:: + open() + { ++ AVDictionary *opts = NULL; + // Close any open files + close(); + +@@ -210,10 +211,10 @@ open() + video_enc->sample_aspect_ratio = av_d2q(params_.frame_aspect_ratio_*params_.ni_/params_.nj_, 255); + + // Our source is packed RGB. Use that if possible. +- video_enc->pix_fmt = PIX_FMT_RGB24; ++ video_enc->pix_fmt = AV_PIX_FMT_RGB24; + if ( codec && codec->pix_fmts ) + { +- const enum PixelFormat* p= codec->pix_fmts; ++ const enum AVPixelFormat* p= codec->pix_fmts; + for ( ; *p != -1; p++ ) + { + if ( *p == video_enc->pix_fmt ) +@@ -226,7 +227,7 @@ open() + codec->id == AV_CODEC_ID_HUFFYUV ) ) + { + // these formats only support the YUV input image formats +- video_enc->pix_fmt = PIX_FMT_YUV420P; ++ video_enc->pix_fmt = AV_PIX_FMT_YUV420P; + } + + if (!params_.intra_only_) +@@ -358,7 +359,7 @@ open() + video_enc->mb_threshold= params_.mb_threshold_; + video_enc->intra_dc_precision= params_.intra_dc_precision_ - 8; + video_enc->strict_std_compliance = params_.strict_; +- video_enc->error_rate = params_.error_rate_; ++ av_dict_set_int(&opts, "error_rate", params_.error_rate_, 0); + video_enc->noise_reduction= params_.noise_reduction_; + video_enc->scenechange_threshold= params_.sc_threshold_; + video_enc->me_range = params_.me_range_; +@@ -396,7 +397,7 @@ open() + + //dump_format( os_->fmt_cxt_, 1, filename_, 1 ); + +- if ( avcodec_open2( video_enc, codec, NULL ) < 0 ) ++ if ( avcodec_open2( video_enc, codec, &opts ) < 0 ) + { + vcl_cerr << "ffmpeg: couldn't open codec\n"; + close(); +@@ -484,7 +485,7 @@ write_frame(const vidl_frame_sptr& frame + return false; + } + +- PixelFormat fmt = vidl_pixel_format_to_ffmpeg(frame->pixel_format()); ++ AVPixelFormat fmt = vidl_pixel_format_to_ffmpeg(frame->pixel_format()); + + vidl_pixel_format target_fmt = vidl_pixel_format_from_ffmpeg(codec->pix_fmt); + static vidl_frame_sptr temp_frame = new vidl_shared_frame(NULL,frame->ni(),frame->nj(),target_fmt); diff --git a/debian/patches/series b/debian/patches/series index 3589dc5..ddb4f98 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -20,3 +20,4 @@ shared-lib-without-dependency-information.patch libav10.patch gcc-5x.patch unset-cmake-variables.patch +ffmpeg_2.9.patch