Package: gmerlin-avdecoder Version: 1.2.0~dfsg-5 Severity: important Tags: patch User: pkg-multimedia-maintainers@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/patches/ffmpeg_2.9.patch b/debian/patches/ffmpeg_2.9.patch new file mode 100644 index 0000000..6d3b744 --- /dev/null +++ b/debian/patches/ffmpeg_2.9.patch @@ -0,0 +1,258 @@ +Description: Replace deprecated FFmpeg API +Author: Andreas Cadhalpun <andreas.cadhal...@googlemail.com> +Last-Update: <2015-11-02> + +--- gmerlin-avdecoder-1.2.0~dfsg.orig/lib/video_ffmpeg.c ++++ gmerlin-avdecoder-1.2.0~dfsg/lib/video_ffmpeg.c +@@ -117,7 +117,7 @@ typedef struct + + /* Pixelformat */ + int do_convert; +- enum PixelFormat dst_format; ++ enum AVPixelFormat dst_format; + + /* Real video ugliness */ + +@@ -181,16 +181,15 @@ typedef struct + + #endif + +- int b_age; +- int ip_age[2]; +- + bgav_packet_t * p; + + } ffmpeg_video_priv; + + + #ifdef HAVE_VDPAU +-static int vdpau_get_buffer(struct AVCodecContext *c, AVFrame *pic) ++static void vdpau_dummy_free_buffer(void *opaque, uint8_t *data); ++ ++static int vdpau_get_buffer(struct AVCodecContext *c, AVFrame *pic, int flags) + { + ffmpeg_video_priv * priv; + int i = 0; +@@ -202,8 +201,8 @@ static int vdpau_get_buffer(struct AVCod + { + if(!priv->vdpau_states[i].used) + { +- pic->data[0] = (uint8_t*)(&priv->vdpau_states[i]); +- pic->type = FF_BUFFER_TYPE_USER; ++ pic->buf[0] = av_buffer_create((uint8_t*)(&priv->vdpau_states[i]), 0, vdpau_dummy_free_buffer, NULL, 0); ++ pic->data[0] = pic->buf[0]->data; + + // pic->age = INT_MAX; + +@@ -219,24 +218,6 @@ static int vdpau_get_buffer(struct AVCod + // priv->vdpau_states[i].state.surface); + } + } +- if(pic->reference) +- { +-#if LIBAVCODEC_VERSION_INT < ((53<<16)|(28<<8)|1) +- pic->age= priv->ip_age[0]; +-#endif +- priv->ip_age[0]= priv->ip_age[1]+1; +- priv->ip_age[1]= 1; +- priv->b_age++; +- } +- else +- { +-#if LIBAVCODEC_VERSION_INT < ((53<<16)|(28<<8)|1) +- pic->age= priv->b_age; +-#endif +- priv->ip_age[0]++; +- priv->ip_age[1]++; +- priv->b_age=1; +- } + priv->vdpau_states[i].used = 1; + return 0; + } +@@ -245,10 +226,9 @@ static int vdpau_get_buffer(struct AVCod + return -1; + } + +-static void vdpau_release_buffer(struct AVCodecContext *avctx, AVFrame *pic) ++static void vdpau_dummy_free_buffer(void *opaque, uint8_t *data) + { +- vdpau_state_t * state = (vdpau_state_t *)pic->data[0]; +- pic->data[0] = NULL; ++ vdpau_state_t * state = (vdpau_state_t *)data; + state->used = 0; + } + +@@ -273,7 +253,7 @@ static void vdpau_draw_horiz_band(struct + state->bitstream_buffers); + } + +-static enum PixelFormat vdpau_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) ++static enum AVPixelFormat vdpau_get_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt) + { + return *fmt; + } +@@ -785,8 +765,7 @@ static int init_vdpau(bgav_stream_t * s, + if(priv->vdpau_decoder == VDP_INVALID_HANDLE) + goto fail; + +- priv->ctx->get_buffer = vdpau_get_buffer; +- priv->ctx->release_buffer = vdpau_release_buffer; ++ priv->ctx->get_buffer2 = vdpau_get_buffer; + priv->ctx->draw_horiz_band = vdpau_draw_horiz_band; + priv->ctx->get_format = vdpau_get_format; + +@@ -822,10 +801,6 @@ static int init_ffmpeg(bgav_stream_t * s + priv = calloc(1, sizeof(*priv)); + priv->skip_time = BGAV_TIMESTAMP_UNDEFINED; + +- priv->ip_age[0] = 256*256*256*64; +- priv->ip_age[1] = 256*256*256*64; +- priv->b_age = 256*256*256*64; +- + s->data.video.decoder->priv = priv; + + /* Set up coded specific details */ +@@ -934,7 +909,7 @@ static int init_ffmpeg(bgav_stream_t * s + + // bgav_hexdump(s->ext_data, s->ext_size, 16); + +- priv->frame = avcodec_alloc_frame(); ++ priv->frame = av_frame_alloc(); + priv->gavl_frame = gavl_video_frame_create(NULL); + + /* Some codecs need extra stuff */ +@@ -1032,7 +1007,7 @@ static int init_ffmpeg(bgav_stream_t * s + { + s->data.video.format.pixelformat = GAVL_YUV_420_P; + priv->do_convert = 1; +- priv->dst_format = PIX_FMT_YUV420P; ++ priv->dst_format = AV_PIX_FMT_YUV420P; + + #ifdef HAVE_LIBSWSCALE + priv->swsContext = +@@ -1073,10 +1048,6 @@ static void resync_ffmpeg(bgav_stream_t + priv = s->data.video.decoder->priv; + avcodec_flush_buffers(priv->ctx); + +- priv->ip_age[0] = 256*256*256*64; +- priv->ip_age[1] = 256*256*256*64; +- priv->b_age = 256*256*256*64; +- + priv->last_dv_timecode = GAVL_TIMECODE_UNDEFINED; + + bgav_pts_cache_clear(&priv->pts_cache); +@@ -1142,7 +1113,7 @@ static void close_ffmpeg(bgav_stream_t * + sws_freeContext(priv->swsContext); + #endif + +- free(priv->frame); ++ av_frame_free(&priv->frame); + free(priv); + } + +@@ -2108,50 +2079,48 @@ static void rgba32_to_rgba32(gavl_video_ + + static const struct + { +- enum PixelFormat ffmpeg_csp; ++ enum AVPixelFormat ffmpeg_csp; + gavl_pixelformat_t gavl_csp; + } pixelformats[] = + { +- { PIX_FMT_YUV420P, GAVL_YUV_420_P }, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples) ++ { AV_PIX_FMT_YUV420P, GAVL_YUV_420_P }, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples) + #if LIBAVUTIL_VERSION_INT < (50<<16) +- { PIX_FMT_YUV422, GAVL_YUY2 }, ++ { AV_PIX_FMT_YUV422, GAVL_YUY2 }, + #else +- { PIX_FMT_YUYV422, GAVL_YUY2 }, ++ { AV_PIX_FMT_YUYV422, GAVL_YUY2 }, + #endif +- { PIX_FMT_RGB24, GAVL_RGB_24 }, ///< Packed pixel, 3 bytes per pixel, RGBRGB... +- { PIX_FMT_BGR24, GAVL_BGR_24 }, ///< Packed pixel, 3 bytes per pixel, BGRBGR... +- { PIX_FMT_YUV422P, GAVL_YUV_422_P }, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples) +- { PIX_FMT_YUV444P, GAVL_YUV_444_P }, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples) ++ { AV_PIX_FMT_RGB24, GAVL_RGB_24 }, ///< Packed pixel, 3 bytes per pixel, RGBRGB... ++ { AV_PIX_FMT_BGR24, GAVL_BGR_24 }, ///< Packed pixel, 3 bytes per pixel, BGRBGR... ++ { AV_PIX_FMT_YUV422P, GAVL_YUV_422_P }, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples) ++ { AV_PIX_FMT_YUV444P, GAVL_YUV_444_P }, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples) + #if LIBAVUTIL_VERSION_INT < (50<<16) +- { PIX_FMT_RGBA32, GAVL_RGBA_32 }, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness ++ { AV_PIX_FMT_RGBA32, GAVL_RGBA_32 }, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness + #else +- { PIX_FMT_RGB32, GAVL_RGBA_32 }, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness ++ { AV_PIX_FMT_RGB32, GAVL_RGBA_32 }, ///< Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness + #endif +- { PIX_FMT_YUV410P, GAVL_YUV_410_P }, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples) +- { PIX_FMT_YUV411P, GAVL_YUV_411_P }, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples) +- { PIX_FMT_RGB565, GAVL_RGB_16 }, ///< always stored in cpu endianness +- { PIX_FMT_RGB555, GAVL_RGB_15 }, ///< always stored in cpu endianness, most significant bit to 1 +- { PIX_FMT_GRAY8, GAVL_PIXELFORMAT_NONE }, +- { PIX_FMT_MONOWHITE, GAVL_PIXELFORMAT_NONE }, ///< 0 is white +- { PIX_FMT_MONOBLACK, GAVL_PIXELFORMAT_NONE }, ///< 0 is black +- // { PIX_FMT_PAL8, GAVL_RGB_24 }, ///< 8 bit with RGBA palette +- { PIX_FMT_YUVJ420P, GAVL_YUVJ_420_P }, ///< Planar YUV 4:2:0 full scale (jpeg) +- { PIX_FMT_YUVJ422P, GAVL_YUVJ_422_P }, ///< Planar YUV 4:2:2 full scale (jpeg) +- { PIX_FMT_YUVJ444P, GAVL_YUVJ_444_P }, ///< Planar YUV 4:4:4 full scale (jpeg) +- { PIX_FMT_XVMC_MPEG2_MC, GAVL_PIXELFORMAT_NONE }, ///< XVideo Motion Acceleration via common packet passing(xvmc_render.h) +- { PIX_FMT_XVMC_MPEG2_IDCT, GAVL_PIXELFORMAT_NONE }, ++ { AV_PIX_FMT_YUV410P, GAVL_YUV_410_P }, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples) ++ { AV_PIX_FMT_YUV411P, GAVL_YUV_411_P }, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples) ++ { AV_PIX_FMT_RGB565, GAVL_RGB_16 }, ///< always stored in cpu endianness ++ { AV_PIX_FMT_RGB555, GAVL_RGB_15 }, ///< always stored in cpu endianness, most significant bit to 1 ++ { AV_PIX_FMT_GRAY8, GAVL_PIXELFORMAT_NONE }, ++ { AV_PIX_FMT_MONOWHITE, GAVL_PIXELFORMAT_NONE }, ///< 0 is white ++ { AV_PIX_FMT_MONOBLACK, GAVL_PIXELFORMAT_NONE }, ///< 0 is black ++ // { AV_PIX_FMT_PAL8, GAVL_RGB_24 }, ///< 8 bit with RGBA palette ++ { AV_PIX_FMT_YUVJ420P, GAVL_YUVJ_420_P }, ///< Planar YUV 4:2:0 full scale (jpeg) ++ { AV_PIX_FMT_YUVJ422P, GAVL_YUVJ_422_P }, ///< Planar YUV 4:2:2 full scale (jpeg) ++ { AV_PIX_FMT_YUVJ444P, GAVL_YUVJ_444_P }, ///< Planar YUV 4:4:4 full scale (jpeg) + #if LIBAVCODEC_BUILD >= ((51<<16)+(45<<8)+0) +- { PIX_FMT_YUVA420P, GAVL_YUVA_32 }, ++ { AV_PIX_FMT_YUVA420P, GAVL_YUVA_32 }, + #endif +- { PIX_FMT_NB, GAVL_PIXELFORMAT_NONE } ++ { AV_PIX_FMT_NB, GAVL_PIXELFORMAT_NONE } + }; + + +-static gavl_pixelformat_t get_pixelformat(enum PixelFormat p, ++static gavl_pixelformat_t get_pixelformat(enum AVPixelFormat p, + gavl_pixelformat_t pixelformat) + { + int i; +- if(p == PIX_FMT_PAL8) ++ if(p == AV_PIX_FMT_PAL8) + { + if(pixelformat == GAVL_RGBA_32) + return GAVL_RGBA_32; +@@ -2310,7 +2279,7 @@ static void put_frame(bgav_stream_t * s, + + ffmpeg_video_priv * priv; + priv = s->data.video.decoder->priv; +- if(priv->ctx->pix_fmt == PIX_FMT_PAL8) ++ if(priv->ctx->pix_fmt == AV_PIX_FMT_PAL8) + { + if(s->data.video.format.pixelformat == GAVL_RGBA_32) + pal8_to_rgba32(f, priv->frame, +@@ -2332,9 +2301,9 @@ static void put_frame(bgav_stream_t * s, + } + #endif + #if LIBAVUTIL_VERSION_INT < (50<<16) +- else if(priv->ctx->pix_fmt == PIX_FMT_RGBA32) ++ else if(priv->ctx->pix_fmt == AV_PIX_FMT_RGBA32) + #else +- else if(priv->ctx->pix_fmt == PIX_FMT_RGB32) ++ else if(priv->ctx->pix_fmt == AV_PIX_FMT_RGB32) + #endif + { + rgba32_to_rgba32(f, priv->frame, +@@ -2342,7 +2311,7 @@ static void put_frame(bgav_stream_t * s, + s->data.video.format.image_height, !!(priv->flags & FLIP_Y)); + } + #if LIBAVCODEC_BUILD >= ((51<<16)+(45<<8)+0) +- else if(priv->ctx->pix_fmt == PIX_FMT_YUVA420P) ++ else if(priv->ctx->pix_fmt == AV_PIX_FMT_YUVA420P) + { + yuva420_to_yuva32(f, priv->frame, + s->data.video.format.image_width, diff --git a/debian/patches/series b/debian/patches/series index 0e565fd..63f6023 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,3 +6,4 @@ fix_typos.patch fix-ftbfs-libav9.patch plugins-ldflags.patch libav10.patch +ffmpeg_2.9.patch
_______________________________________________ pkg-multimedia-maintainers mailing list pkg-multimedia-maintainers@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-multimedia-maintainers