Bug#1004579: mplayer: FTBFS with ffmpeg 5.0
Package: mplayer
Version: 2:1.4+ds1-3
Followup-For: Bug #1004579
User: ubuntu-devel@lists.ubuntu.com
Usertags: origin-ubuntu kinetic ubuntu-patch
Control: tags -1 patch
Dear Maintainer,
The upstream release 1.5 supports ffmpeg 5 and would solve this issue.
In the meantime, I have attempted to backport the upstream patches on
top of the 1.4 version.
In Ubuntu, the attached patch was applied to achieve the following:
* Backport upstream patches to build against ffmpeg 5 (LP: #1987114)
Thanks for considering the patch.
-- System Information:
Debian Release: bookworm/sid
APT prefers jammy-updates
APT policy: (500, 'jammy-updates'), (500, 'jammy-security'), (500, 'jammy'), (100, 'jammy-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 5.15.0-46-generic (SMP w/8 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru mplayer-1.4+ds1/debian/patches/r38215.patch mplayer-1.4+ds1/debian/patches/r38215.patch
--- mplayer-1.4+ds1/debian/patches/r38215.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38215.patch 2022-08-19 17:10:25.000000000 +0200
@@ -0,0 +1,61 @@
+Description: av_helpers: switch to new lavc audio encode API.
+Origin: upstream, commit: r38215
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/av_helpers.c
+===================================================================
+--- a/av_helpers.c 2022-08-19 16:52:03.979666019 +0200
++++ b/av_helpers.c 2022-08-19 16:52:37.000000000 +0200
+@@ -98,7 +98,6 @@
+ if (!avcodec_initialized) {
+ show_av_version(MSGT_DECVIDEO, "libavcodec", LIBAVCODEC_VERSION_INT,
+ avcodec_version(), avcodec_configuration());
+- avcodec_register_all();
+ avcodec_initialized = 1;
+ av_log_set_callback(mp_msp_av_log_callback);
+ }
+@@ -109,7 +108,6 @@
+ if (!avformat_initialized) {
+ show_av_version(MSGT_DEMUX, "libavformat", LIBAVFORMAT_VERSION_INT,
+ avformat_version(), avformat_configuration());
+- av_register_all();
+ avformat_initialized = 1;
+ av_log_set_callback(mp_msp_av_log_callback);
+ }
+@@ -132,8 +130,6 @@
+ ctx->channels,
+ src_len / bps, bps);
+ }
+- pkt.data = dst;
+- pkt.size = dst_len;
+ frame->nb_samples = src_len / ctx->channels / bps;
+ if (planar) {
+ // TODO: this is horribly inefficient.
+@@ -150,11 +146,22 @@
+ }
+ }
+ }
++ frame->format = ctx->sample_fmt;
++ frame->channels = ctx->channels;
+ n = avcodec_fill_audio_frame(frame, ctx->channels, ctx->sample_fmt, src, src_len, 1);
+ if (n < 0) return 0;
+- n = avcodec_encode_audio2(ctx, &pkt, frame, &got);
++ n = avcodec_send_frame(ctx, frame);
++ av_init_packet(&pkt);
++ got = avcodec_receive_packet(ctx, &pkt);
+ av_frame_free(&frame);
+ if (planar) av_free(src);
+ if (n < 0) return n;
+- return got ? pkt.size : 0;
++ if (got >= 0) {
++ int size = pkt.size;
++ if (size > dst_len) return -1;
++ memcpy(dst, pkt.data, size);
++ av_packet_unref(&pkt);
++ return size;
++ }
++ return 0;
+ }
diff -Nru mplayer-1.4+ds1/debian/patches/r38216.patch mplayer-1.4+ds1/debian/patches/r38216.patch
--- mplayer-1.4+ds1/debian/patches/r38216.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38216.patch 2022-08-19 17:09:46.000000000 +0200
@@ -0,0 +1,86 @@
+Description: ad_ffmpeg: switch to new lavc API.
+Origin: upstream, commit: r38216
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpcodecs/ad_ffmpeg.c
+===================================================================
+--- a/libmpcodecs/ad_ffmpeg.c 2022-08-19 16:52:04.011665773 +0200
++++ b/libmpcodecs/ad_ffmpeg.c 2022-08-19 16:52:04.003665834 +0200
+@@ -310,34 +310,41 @@
+
+ static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
+ {
++ int draining_started = 0;
+ unsigned char *start=NULL;
+- int y,len=-1, got_frame;
++ int y,len=-1;
+ AVFrame *frame = av_frame_alloc();
+
+ if (!frame)
+ return AVERROR(ENOMEM);
+
+ while(len<minlen){
+- AVPacket pkt;
+ int len2=maxlen;
++ y = avcodec_receive_frame(sh_audio->context, frame);
++ if (y == AVERROR(EAGAIN) || y == AVERROR_EOF) {
++ AVPacket pkt;
+ double pts;
+ int x=ds_get_packet_pts(sh_audio->ds,&start, &pts);
+ if(x<=0) {
+ start = NULL;
+ x = 0;
+ ds_parse(sh_audio->ds, &start, &x, MP_NOPTS_VALUE, 0);
+- if (x <= 0)
+- break; // error
+ } else {
+ int in_size = x;
+ int consumed = ds_parse(sh_audio->ds, &start, &x, pts, 0);
+ sh_audio->ds->buffer_pos -= in_size - consumed;
+- // Note: hopefully below is correct, it was only
++ // Note: hopefully the following x <= 0 handling is correct, it was only
+ // added because FFmpeg broke the API and 0-sized
+ // packets started to break e.g. AC3 decode.
+- if (x <= 0)
+- break; // error or not enough data
+ }
++ if (x <= 0) {
++ if (sh_audio->ds->eof && !draining_started) {
++ avcodec_send_packet(sh_audio->context, NULL);
++ draining_started = 1;
++ continue;
++ }
++ break; // error or not enough data
++ }
+
+ av_init_packet(&pkt);
+ pkt.data = start;
+@@ -346,16 +353,18 @@
+ sh_audio->pts = pts;
+ sh_audio->pts_bytes = 0;
+ }
+- y=avcodec_decode_audio4(sh_audio->context, frame, &got_frame, &pkt);
+-//printf("return:%d samples_out:%d bitstream_in:%d sample_sum:%d\n", y, len2, x, len); fflush(stdout);
+- // LATM may need many packets to find mux info
+- if (y == AVERROR(EAGAIN))
+- continue;
++ y=avcodec_send_packet(sh_audio->context, &pkt);
++ if(y<0){ mp_msg(MSGT_DECAUDIO,MSGL_V,"lavc_audio: error\n");break; }
++ continue;
++ }
+ if(y<0){ mp_msg(MSGT_DECAUDIO,MSGL_V,"lavc_audio: error\n");break; }
++//printf("return:%d samples_out:%d bitstream_in:%d sample_sum:%d\n", y, len2, x, len); fflush(stdout);
++#if 0
++ // this should be obsolete since the new API does no support it
++ // and we support inserting parsers as necessary instead.
+ if(!sh_audio->parser && y<x)
+ sh_audio->ds->buffer_pos+=y-x; // put back data (HACK!)
+- if (!got_frame)
+- continue;
++#endif
+ len2 = copy_samples(sh_audio->context, frame, buf, maxlen);
+ if (len2 < 0)
+ return len2;
diff -Nru mplayer-1.4+ds1/debian/patches/r38217.patch mplayer-1.4+ds1/debian/patches/r38217.patch
--- mplayer-1.4+ds1/debian/patches/r38217.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38217.patch 2022-08-19 17:09:04.000000000 +0200
@@ -0,0 +1,47 @@
+Description: vd_ffmpeg: Switch to newer lavc decode API.
+Origin: upstream, commit: r38217
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpcodecs/vd_ffmpeg.c
+===================================================================
+--- a/libmpcodecs/vd_ffmpeg.c 2022-08-19 16:52:04.039665557 +0200
++++ b/libmpcodecs/vd_ffmpeg.c 2022-08-19 16:52:37.000000000 +0200
+@@ -484,7 +484,7 @@
+ set_dr_slice_settings(avctx, lavc_codec);
+ avctx->thread_count = lavc_param_threads;
+ avctx->thread_type = FF_THREAD_FRAME | FF_THREAD_SLICE;
+- avctx->refcounted_frames = 1;
++ av_dict_set(&opts, "refcounted_frames", "1", 0);
+
+ /* open it */
+ if (avcodec_open2(avctx, lavc_codec, &opts) < 0) {
+@@ -925,7 +925,16 @@
+ }
+ ctx->palette_sent = 1;
+ }
+- ret = avcodec_decode_video2(avctx, pic, &got_picture, &pkt);
++ ret = avcodec_send_packet(avctx, !pkt.data && !pkt.size ? NULL : &pkt);
++ if (ret == AVERROR(EAGAIN)) {
++ mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many frames buffered in decode, MPlayer cannot handle that yet!\n");
++ ret = 0;
++ }
++ if (ret >= 0 || ret == AVERROR_EOF) {
++ ret = avcodec_receive_frame(avctx, pic);
++ got_picture = ret >= 0;
++ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) ret = 0;
++ }
+ ctx->refcount_frame = pic;
+ pkt.data = NULL;
+ pkt.size = 0;
+@@ -935,7 +944,7 @@
+ // FFmpeg allocate - this mostly happens with nonref_dr.
+ // Ensure we treat it correctly.
+ dr1= ctx->do_dr1 && pic->opaque != NULL;
+- if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n");
++ if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame! (%i)\n", ret);
+ //printf("repeat: %d\n", pic->repeat_pict);
+ //-- vstats generation
+ while(lavc_param_vstats){ // always one time loop
diff -Nru mplayer-1.4+ds1/debian/patches/r38219.patch mplayer-1.4+ds1/debian/patches/r38219.patch
--- mplayer-1.4+ds1/debian/patches/r38219.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38219.patch 2022-08-19 17:08:26.000000000 +0200
@@ -0,0 +1,104 @@
+Description: demux_lavf: avoid several deprecated lavf features.
+Origin: upstream, commit: r38219
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpdemux/demux_lavf.c
+===================================================================
+--- a/libmpdemux/demux_lavf.c 2022-08-19 16:52:03.951666234 +0200
++++ b/libmpdemux/demux_lavf.c 2022-08-19 16:52:37.000000000 +0200
+@@ -146,9 +146,10 @@
+ }
+
+ static void list_formats(void) {
+- AVInputFormat *fmt;
++ void *i = 0;
++ const AVInputFormat *fmt;
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n");
+- for (fmt = av_iformat_next(NULL); fmt; fmt = av_iformat_next(fmt))
++ while ((fmt = av_demuxer_iterate(&i)))
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name);
+ }
+
+@@ -288,7 +289,7 @@
+ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
+ lavf_priv_t *priv= demuxer->priv;
+ AVStream *st= avfc->streams[i];
+- AVCodecContext *codec= st->codec;
++ AVCodecParameters *codec= st->codecpar;
+ char *stream_type = NULL;
+ int stream_id;
+ AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
+@@ -396,7 +397,7 @@
+ if (codec->bits_per_coded_sample && codec->bits_per_coded_sample > 0 &&
+ codec->codec_tag == MKTAG('r', 'a', 'w', 32))
+ codec->codec_tag = 0;
+- switch (codec->pix_fmt) {
++ switch (codec->format) {
+ case AV_PIX_FMT_RGB24:
+ codec->codec_tag= MKTAG(24, 'B', 'G', 'R');
+ break;
+@@ -420,8 +421,8 @@
+ sh_video->video.dwRate= st->time_base.den;
+ sh_video->video.dwScale= st->time_base.num;
+ } else {
+- sh_video->video.dwRate= codec->time_base.den;
+- sh_video->video.dwScale= codec->time_base.num;
++ sh_video->video.dwRate= st->codec->time_base.den;
++ sh_video->video.dwScale= st->codec->time_base.num;
+ }
+ sh_video->fps=av_q2d(st->r_frame_rate);
+ sh_video->frametime=1/av_q2d(st->r_frame_rate);
+@@ -513,7 +514,7 @@
+ break;
+ }
+ case AVMEDIA_TYPE_ATTACHMENT:{
+- if (st->codec->codec_id == AV_CODEC_ID_TTF || st->codec->codec_id == AV_CODEC_ID_OTF) {
++ if (st->codecpar->codec_id == AV_CODEC_ID_TTF || st->codecpar->codec_id == AV_CODEC_ID_OTF) {
+ AVDictionaryEntry *fnametag = av_dict_get(st->metadata, "filename", NULL, 0);
+ AVDictionaryEntry *mimetype = av_dict_get(st->metadata, "mimetype", NULL, 0);
+ demuxer_add_attachment(demuxer, fnametag ? fnametag->value : NULL,
+@@ -716,23 +717,19 @@
+ ds=demux->sub;
+ sub_utf8=1;
+ } else {
+- av_free_packet(&pkt);
++ av_packet_unref(&pkt);
+ return 1;
+ }
+
+ av_packet_merge_side_data(&pkt);
+ dp=new_demux_packet(pkt.size);
+ memcpy(dp->buffer, pkt.data, pkt.size);
+- av_free_packet(&pkt);
+
+ if(pkt.pts != AV_NOPTS_VALUE){
+ dp->pts=pkt.pts * av_q2d(priv->avfc->streams[id]->time_base);
+ priv->last_pts= dp->pts * AV_TIME_BASE;
+ if(pkt.duration > 0)
+ dp->endpts = dp->pts + pkt.duration * av_q2d(priv->avfc->streams[id]->time_base);
+- /* subtitle durations are sometimes stored in convergence_duration */
+- if(ds == demux->sub && pkt.convergence_duration > 0)
+- dp->endpts = dp->pts + pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base);
+ }
+ dp->pos=demux->filepos;
+ dp->flags= !!(pkt.flags&AV_PKT_FLAG_KEY);
+@@ -741,6 +738,7 @@
+ dp->stream_pts = stream_pts;
+ // append packet to DS stream:
+ ds_add_packet(ds,dp);
++ av_packet_unref(&pkt);
+ return 1;
+ }
+
+@@ -879,7 +877,7 @@
+ program = priv->avfc->programs[p];
+ for(i=0; i<program->nb_stream_indexes; i++)
+ {
+- switch(priv->avfc->streams[program->stream_index[i]]->codec->codec_type)
++ switch(priv->avfc->streams[program->stream_index[i]]->codecpar->codec_type)
+ {
+ case AVMEDIA_TYPE_VIDEO:
+ if(prog->vid == -2)
diff -Nru mplayer-1.4+ds1/debian/patches/r38246.patch mplayer-1.4+ds1/debian/patches/r38246.patch
--- mplayer-1.4+ds1/debian/patches/r38246.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38246.patch 2022-08-19 17:07:36.000000000 +0200
@@ -0,0 +1,39 @@
+Description: Use new lavc decode API for GUI's PNG decode.
+Origin: upstream, commit: r38246
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/gui/util/bitmap.c
+===================================================================
+--- a/gui/util/bitmap.c 2022-08-19 16:52:04.067665341 +0200
++++ b/gui/util/bitmap.c 2022-08-19 16:52:04.063665372 +0200
+@@ -124,8 +124,6 @@
+ return 6;
+ }
+
+- avcodec_register_all();
+-
+ if (avcodec_open2(avctx, avcodec_find_decoder(AV_CODEC_ID_PNG), NULL) < 0) {
+ av_free(frame);
+ av_free(avctx);
+@@ -139,7 +137,8 @@
+ /* HACK: Make PNGs decode normally instead of as CorePNG delta frames. */
+ pkt.flags = AV_PKT_FLAG_KEY;
+
+- avcodec_decode_video2(avctx, frame, &decode_ok, &pkt);
++ decode_ok = (avcodec_send_packet(avctx, &pkt) == 0 &&
++ avcodec_receive_frame(avctx, frame) == 0);
+
+ memset(img, 0, sizeof(*img));
+ memset(palette, 0, sizeof(palette));
+@@ -186,6 +185,8 @@
+ decode_ok = False;
+ }
+
++ avcodec_send_packet(avctx, NULL); // flush the decoder
++
+ avcodec_close(avctx);
+ av_free(frame);
+ av_free(avctx);
diff -Nru mplayer-1.4+ds1/debian/patches/r38306.patch mplayer-1.4+ds1/debian/patches/r38306.patch
--- mplayer-1.4+ds1/debian/patches/r38306.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38306.patch 2022-08-19 17:19:15.000000000 +0200
@@ -0,0 +1,67 @@
+Description: vo_png: switch to new FFmpeg API.
+Origin: upstream, commit: r38306
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libvo/vo_png.c
+===================================================================
+--- a/libvo/vo_png.c 2022-08-19 16:52:03.919666480 +0200
++++ b/libvo/vo_png.c 2022-08-19 16:52:03.915666511 +0200
+@@ -150,8 +150,7 @@
+
+ static uint32_t draw_image(mp_image_t* mpi){
+ AVFrame *pic;
+- int buffersize;
+- int res, got_pkt;
++ int res;
+ char buf[100];
+ FILE *outfile;
+ AVPacket pkt;
+@@ -174,26 +173,25 @@
+ pic->format = imgfmt2pixfmt(png_format);
+ pic->data[0] = mpi->planes[0];
+ pic->linesize[0] = mpi->stride[0];
+- buffersize = mpi->w * mpi->h * 8;
+- if (outbuffer_size < buffersize) {
+- av_freep(&outbuffer);
+- outbuffer = av_malloc(buffersize);
+- outbuffer_size = buffersize;
+- }
+ av_init_packet(&pkt);
+- pkt.data = outbuffer;
+- pkt.size = outbuffer_size;
+- res = avcodec_encode_video2(avctx, &pkt, pic, &got_pkt);
++ res = avcodec_send_frame(avctx, pic);
++ if (res >= 0) {
++ res = avcodec_receive_packet(avctx, &pkt);
++ if (res == AVERROR(EAGAIN)) {
++ avcodec_send_frame(avctx, NULL);
++ res = avcodec_receive_packet(avctx, &pkt);
++ }
++ }
+ av_frame_free(&pic);
+
+- if (res < 0 || !got_pkt) {
++ if (res < 0) {
+ mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_PNG_ErrorInCreatePng);
+ } else {
+- fwrite(outbuffer, pkt.size, 1, outfile);
++ fwrite(pkt.data, pkt.size, 1, outfile);
+ }
+
+ fclose(outfile);
+- av_free_packet(&pkt);
++ av_packet_unref(&pkt);
+
+ return VO_TRUE;
+ }
+@@ -251,7 +249,6 @@
+ if (subopt_parse(arg, subopts) != 0) {
+ return -1;
+ }
+- avcodec_register_all();
+ return 0;
+ }
+
diff -Nru mplayer-1.4+ds1/debian/patches/r38307.patch mplayer-1.4+ds1/debian/patches/r38307.patch
--- mplayer-1.4+ds1/debian/patches/r38307.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38307.patch 2022-08-19 17:06:50.000000000 +0200
@@ -0,0 +1,498 @@
+Description: Fix compilation against latest FFmpeg.
+ Only for MPlayer, mencoder needs more changes.
+Origin: upstream, commit: r38307
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/Makefile
+===================================================================
+--- a/Makefile 2022-08-19 16:52:04.099665096 +0200
++++ b/Makefile 2022-08-19 16:52:04.091665157 +0200
+@@ -70,7 +70,9 @@
+ SRCS_COMMON-$(FFMPEG_A) += libmpcodecs/vf_fspp.c \
+ libmpcodecs/vf_qp.c \
+ libmpcodecs/vf_spp.c \
+- libmpcodecs/vf_uspp.c \
++
++# needs update for missing coded_frame
++#libmpcodecs/vf_uspp.c \
+
+ SRCS_COMMON-$(FREETYPE) += sub/font_load_ft.c
+ SRCS_COMMON-$(FTP) += stream/stream_ftp.c
+Index: b/av_helpers.c
+===================================================================
+--- a/av_helpers.c 2022-08-19 16:52:04.099665096 +0200
++++ b/av_helpers.c 2022-08-19 16:52:21.000000000 +0200
+@@ -20,6 +20,7 @@
+
+ #include "libavcodec/avcodec.h"
+ #include "libavformat/avformat.h"
++#include "libavutil/intreadwrite.h"
+ #include "mp_msg.h"
+ #include "av_helpers.h"
+ #include "libaf/reorder_ch.h"
+@@ -165,3 +166,93 @@
+ }
+ return 0;
+ }
++
++#define MERGE_MARKER 0x8c4d9d108e25e9feULL
++
++static void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
++{
++ memcpy(*b, src, size);
++ *b += size;
++}
++
++int mp_packet_merge_side_data(AVPacket *pkt){
++ if(pkt->side_data_elems){
++ AVBufferRef *buf;
++ int i;
++ uint8_t *p;
++ uint64_t size= pkt->size + 8LL + AV_INPUT_BUFFER_PADDING_SIZE;
++ AVPacket old= *pkt;
++ for (i=0; i<old.side_data_elems; i++) {
++ size += old.side_data[i].size + 5LL;
++ }
++ if (size > INT_MAX)
++ return AVERROR(EINVAL);
++ buf = av_buffer_alloc(size);
++ if (!buf)
++ return AVERROR(ENOMEM);
++ pkt->buf = buf;
++ pkt->data = p = buf->data;
++ pkt->size = size - AV_INPUT_BUFFER_PADDING_SIZE;
++ bytestream_put_buffer(&p, old.data, old.size);
++ for (i=old.side_data_elems-1; i>=0; i--) {
++ bytestream_put_buffer(&p, old.side_data[i].data, old.side_data[i].size);
++ AV_WB32(p, old.side_data[i].size);
++ p += 4;
++ *p++ = old.side_data[i].type | ((i==old.side_data_elems-1)*128);
++ }
++ AV_WB64(p, MERGE_MARKER);
++ p += 8;
++ memset(p, 0, AV_INPUT_BUFFER_PADDING_SIZE);
++ av_packet_unref(&old);
++ pkt->side_data_elems = 0;
++ pkt->side_data = NULL;
++ return 1;
++ }
++ return 0;
++}
++
++int mp_packet_split_side_data(AVPacket *pkt){
++ if (!pkt->side_data_elems && pkt->size >12 && AV_RB64(pkt->data + pkt->size - 8) == MERGE_MARKER){
++ int i;
++ unsigned int size;
++ uint8_t *p;
++
++ p = pkt->data + pkt->size - 8 - 5;
++ for (i=1; ; i++){
++ size = AV_RB32(p);
++ if (size>INT_MAX - 5 || p - pkt->data < size)
++ return 0;
++ if (p[4]&128)
++ break;
++ if (p - pkt->data < size + 5)
++ return 0;
++ p-= size+5;
++ }
++
++ if (i > AV_PKT_DATA_NB)
++ return AVERROR(ERANGE);
++
++ pkt->side_data = av_malloc_array(i, sizeof(*pkt->side_data));
++ if (!pkt->side_data)
++ return AVERROR(ENOMEM);
++
++ p= pkt->data + pkt->size - 8 - 5;
++ for (i=0; ; i++){
++ size= AV_RB32(p);
++ pkt->side_data[i].data = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
++ pkt->side_data[i].size = size;
++ pkt->side_data[i].type = p[4]&127;
++ if (!pkt->side_data[i].data)
++ return AVERROR(ENOMEM);
++ memcpy(pkt->side_data[i].data, p-size, size);
++ pkt->size -= size + 5;
++ if(p[4]&128)
++ break;
++ p-= size+5;
++ }
++ pkt->size -= 8;
++ pkt->side_data_elems = i+1;
++ return 1;
++ }
++ return 0;
++}
+Index: b/av_helpers.h
+===================================================================
+--- a/av_helpers.h 2022-08-19 16:52:04.099665096 +0200
++++ b/av_helpers.h 2022-08-19 16:52:04.091665157 +0200
+@@ -22,9 +22,13 @@
+ #define MPLAYER_AV_HELPERS_H
+
+ struct AVCodecContext;
++struct AVFrame;
++struct AVPacket;
+
+ void init_avcodec(void);
+ void init_avformat(void);
+ int lavc_encode_audio(struct AVCodecContext *ctx, void *src, int src_len, void *dst, int dst_len);
++int mp_packet_merge_side_data(struct AVPacket *pkt);
++int mp_packet_split_side_data(struct AVPacket *pkt);
+
+ #endif /* MPLAYER_AV_HELPERS_H */
+Index: b/libmpcodecs/ad_spdif.c
+===================================================================
+--- a/libmpcodecs/ad_spdif.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpcodecs/ad_spdif.c 2022-08-19 16:52:04.091665157 +0200
+@@ -126,7 +126,7 @@
+ lavf_ctx->start_time = AV_NOPTS_VALUE;
+ for (i = 0; fmt_id_type[i].name; i++) {
+ if (!strcmp(codec_idx2str(sh->codec->dll_idx), fmt_id_type[i].name)) {
+- lavf_ctx->streams[0]->codec->codec_id = fmt_id_type[i].id;
++ lavf_ctx->streams[0]->codecpar->codec_id = fmt_id_type[i].id;
+ break;
+ }
+ }
+@@ -161,7 +161,7 @@
+ }
+ sh->ds->buffer_pos -= in_size;
+
+- switch (lavf_ctx->streams[0]->codec->codec_id) {
++ switch (lavf_ctx->streams[0]->codecpar->codec_id) {
+ case AV_CODEC_ID_AAC:
+ spdif_ctx->iec61937_packet_size = 16384;
+ sh->sample_format = AF_FORMAT_IEC61937_LE;
+Index: b/libmpcodecs/vd_ffmpeg.c
+===================================================================
+--- a/libmpcodecs/vd_ffmpeg.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpcodecs/vd_ffmpeg.c 2022-08-19 16:52:04.091665157 +0200
+@@ -902,7 +902,7 @@
+ pkt.size = len;
+ // Necessary to decode e.g. CorePNG and ZeroCodec correctly
+ pkt.flags = (sh->ds->flags & 1) ? AV_PKT_FLAG_KEY : 0;
+- av_packet_split_side_data(&pkt);
++ mp_packet_split_side_data(&pkt);
+ if (av_packet_get_side_data(&pkt, AV_PKT_DATA_PALETTE, NULL))
+ ctx->palette_sent = 1;
+ if (!ctx->palette_sent && sh->bih && sh->bih->biBitCount <= 8) {
+@@ -975,6 +975,8 @@
+
+ // average MB quantizer
+ {
++// TODO: still possible in new FFmpeg API?
++#if 0
+ int x, y;
+ int w = ((avctx->width << lavc_param_lowres)+15) >> 4;
+ int h = ((avctx->height << lavc_param_lowres)+15) >> 4;
+@@ -987,6 +989,7 @@
+ q += qstride;
+ }
+ quality /= w * h;
++#endif
+ }
+
+ all_len+=len;
+@@ -1077,7 +1080,8 @@
+ swap_palette(mpi->planes[1]);
+ #endif
+ /* to comfirm with newer lavc style */
+- mpi->qscale = av_frame_get_qp_table(pic, &mpi->qstride, &mpi->qscale_type);
++// TODO: still possible in new FFmpeg API?
++// mpi->qscale = av_frame_get_qp_table(pic, &mpi->qstride, &mpi->qscale_type);
+ mpi->pict_type=pic->pict_type;
+ mpi->fields = MP_IMGFIELD_ORDERED;
+ if(pic->interlaced_frame) mpi->fields |= MP_IMGFIELD_INTERLACED;
+Index: b/libmpcodecs/vf.c
+===================================================================
+--- a/libmpcodecs/vf.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpcodecs/vf.c 2022-08-19 16:52:04.095665126 +0200
+@@ -197,7 +197,7 @@
+ &vf_info_hue,
+ #ifdef CONFIG_FFMPEG_A
+ &vf_info_spp,
+- &vf_info_uspp,
++// &vf_info_uspp, // TODO: does not currently build
+ &vf_info_fspp,
+ &vf_info_qp,
+ // &vf_info_mcdeint, //TODO: vf_mcdeint is deactivated because it doesn't build after latest FFmpeg major bumps
+Index: b/libmpcodecs/vf_lavc.c
+===================================================================
+--- a/libmpcodecs/vf_lavc.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpcodecs/vf_lavc.c 2022-08-19 16:52:04.095665126 +0200
+@@ -33,12 +33,12 @@
+
+
+ struct vf_priv_s {
+- unsigned char* outbuf;
+- int outbuf_size;
+ AVCodecContext* context;
+ AVFrame* pic;
+- AVCodec* codec;
++ const AVCodec* codec;
+ vo_mpegpes_t pes;
++ AVPacket *pkt;
++ int pkt_has_ref;
+ };
+
+ #define lavc_venc_context (*vf->priv->context)
+@@ -69,10 +69,7 @@
+ }
+ }
+
+- free(vf->priv->outbuf);
+-
+- vf->priv->outbuf_size=10000+width*height; // must be enough!
+- vf->priv->outbuf = malloc(vf->priv->outbuf_size);
++ if (vf->priv->pkt_has_ref) av_packet_unref(vf->priv->pkt);
+
+ if (avcodec_open2(&lavc_venc_context, vf->priv->codec, NULL) != 0) {
+ mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantOpenCodec);
+@@ -84,10 +81,9 @@
+
+ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts, double endpts){
+ mp_image_t* dmpi;
+- int out_size;
+ AVFrame *pic= vf->priv->pic;
+- int ret, got_pkt;
+- AVPacket pkt;
++ AVPacket *pkt = vf->priv->pkt;
++ int ret;
+
+ pic->data[0]=mpi->planes[0];
+ pic->data[1]=mpi->planes[1];
+@@ -96,21 +92,21 @@
+ pic->linesize[1]=mpi->stride[1];
+ pic->linesize[2]=mpi->stride[2];
+
+- av_init_packet(&pkt);
+- pkt.data = vf->priv->outbuf;
+- pkt.size = vf->priv->outbuf_size;
+- ret = avcodec_encode_video2(&lavc_venc_context, &pkt, pic, &got_pkt);
+-
+- if(ret<=0) return 1;
+- if(!got_pkt) return 1;
+- out_size = pkt.size;
++ if (vf->priv->pkt_has_ref) av_packet_unref(pkt);
++ ret = avcodec_send_frame(&lavc_venc_context, pic);
++ if (ret >= 0) {
++ ret = avcodec_receive_packet(&lavc_venc_context, pkt);
++ }
++ vf->priv->pkt_has_ref = ret >= 0;
++
++ if(ret<0) return 1;
+
+ dmpi=vf_get_image(vf->next,IMGFMT_MPEGPES,
+ MP_IMGTYPE_EXPORT, 0,
+ mpi->w, mpi->h);
+
+- vf->priv->pes.data=vf->priv->outbuf;
+- vf->priv->pes.size=out_size;
++ vf->priv->pes.data=pkt->data;
++ vf->priv->pes.size=pkt->size;
+ vf->priv->pes.id=0x1E0;
+ vf->priv->pes.timestamp=-1; // dunno
+
+@@ -151,6 +147,7 @@
+
+ vf->priv->context=avcodec_alloc_context3(vf->priv->codec);
+ vf->priv->pic = av_frame_alloc();
++ vf->priv->pkt = av_packet_alloc();
+
+ // TODO: parse args ->
+ if(args) sscanf(args, "%d:%f", &p_quality, &p_fps);
+Index: b/libmpcodecs/vf_screenshot.c
+===================================================================
+--- a/libmpcodecs/vf_screenshot.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpcodecs/vf_screenshot.c 2022-08-19 16:52:04.095665126 +0200
+@@ -54,10 +54,9 @@
+ int shot, store_slices;
+ int dw, dh;
+ AVFrame *pic;
++ AVPacket *pkt;
+ struct SwsContext *ctx;
+ AVCodecContext *avctx;
+- uint8_t *outbuffer;
+- int outbuffer_size;
+ };
+
+ //===========================================================================//
+@@ -80,7 +79,6 @@
+ vf->priv->ctx=sws_getContextFromCmdLine(width, height, outfmt,
+ d_width, d_height, IMGFMT_RGB24);
+
+- av_fast_malloc(&vf->priv->outbuffer, &vf->priv->outbuffer_size, d_width * d_height * 3 * 2);
+ if (!vf->priv->avctx) {
+ vf->priv->avctx = avcodec_alloc_context3(NULL);
+ vf->priv->avctx->pix_fmt = AV_PIX_FMT_RGB24;
+@@ -111,17 +109,21 @@
+ {
+ char *fname = priv->fname;
+ FILE * fp;
+- AVPacket pkt;
+- int res, got_pkt;
++ AVPacket *pkt = priv->pkt;
++ int res;
+
+- av_init_packet(&pkt);
+- pkt.data = priv->outbuffer;
+- pkt.size = priv->outbuffer_size;
+ priv->pic->width = priv->avctx->width;
+ priv->pic->height = priv->avctx->height;
+ priv->pic->format = priv->avctx->pix_fmt;
+- res = avcodec_encode_video2(priv->avctx, &pkt, priv->pic, &got_pkt);
+- if (res < 0 || !got_pkt || pkt.size <= 0) {
++ res = avcodec_send_frame(priv->avctx, priv->pic);
++ if (res >= 0) {
++ res = avcodec_receive_packet(priv->avctx, pkt);
++ if (res == AVERROR(EAGAIN)) {
++ avcodec_send_frame(priv->avctx, NULL);
++ res = avcodec_receive_packet(priv->avctx, pkt);
++ }
++ }
++ if (res < 0 || pkt->size <= 0) {
+ mp_msg(MSGT_VFILTER,MSGL_ERR,"\nFailed to encode screenshot %s!\n", fname);
+ return;
+ }
+@@ -132,7 +134,8 @@
+ return;
+ }
+
+- fwrite(priv->outbuffer, pkt.size, 1, fp);
++ fwrite(pkt->data, pkt->size, 1, fp);
++ av_packet_unref(pkt);
+
+ fclose (fp);
+ mp_msg(MSGT_VFILTER,MSGL_INFO,"*** screenshot '%s' ***\n",priv->fname);
+@@ -286,7 +289,7 @@
+ if(vf->priv->ctx) sws_freeContext(vf->priv->ctx);
+ av_freep(&vf->priv->pic->data[0]);
+ av_frame_free(&vf->priv->pic);
+- av_freep(&vf->priv->outbuffer);
++ av_packet_free(&vf->priv->pkt);
+ free(vf->priv->prefix);
+ free(vf->priv);
+ }
+@@ -303,8 +306,8 @@
+ vf->uninit=uninit;
+ vf->priv = calloc(1, sizeof(struct vf_priv_s));
+ vf->priv->pic = av_frame_alloc();
++ vf->priv->pkt = av_packet_alloc();
+ vf->priv->prefix = strdup(args ? args : "shot");
+- avcodec_register_all();
+ if (!avcodec_find_encoder(AV_CODEC_ID_PNG)) {
+ mp_msg(MSGT_VFILTER, MSGL_FATAL, "Could not find libavcodec PNG encoder\n");
+ return 0;
+Index: b/libmpdemux/demux_lavf.c
+===================================================================
+--- a/libmpdemux/demux_lavf.c 2022-08-19 16:52:04.099665096 +0200
++++ b/libmpdemux/demux_lavf.c 2022-08-19 16:52:04.095665126 +0200
+@@ -68,7 +68,7 @@
+ #define BIO_BUFFER_SIZE 32768
+
+ typedef struct lavf_priv {
+- AVInputFormat *avif;
++ const AVInputFormat *avif;
+ AVFormatContext *avfc;
+ AVIOContext *pb;
+ int audio_streams;
+@@ -366,7 +366,7 @@
+ if (demuxer->audio->id != i)
+ st->discard= AVDISCARD_ALL;
+ if (priv->audio_streams == 0) {
+- int rg_size;
++ size_t rg_size;
+ AVReplayGain *rg = (AVReplayGain*)av_stream_get_side_data(st, AV_PKT_DATA_REPLAYGAIN, &rg_size);
+ if (rg && rg_size >= sizeof(*rg)) {
+ priv->r_gain = rg->track_gain / 10000;
+@@ -420,9 +420,12 @@
+ if (st->time_base.den) { /* if container has time_base, use that */
+ sh_video->video.dwRate= st->time_base.den;
+ sh_video->video.dwScale= st->time_base.num;
++#if 0
+ } else {
++ // not available in latest FFmpeg API, ok to just remove?
+ sh_video->video.dwRate= st->codec->time_base.den;
+ sh_video->video.dwScale= st->codec->time_base.num;
++#endif
+ }
+ sh_video->fps=av_q2d(st->r_frame_rate);
+ sh_video->frametime=1/av_q2d(st->r_frame_rate);
+@@ -527,7 +530,7 @@
+ st->discard= AVDISCARD_ALL;
+ }
+ if (stream_type) {
+- AVCodec *avc = avcodec_find_decoder(codec->codec_id);
++ const AVCodec *avc = avcodec_find_decoder(codec->codec_id);
+ const char *codec_name = avc ? avc->name : "unknown";
+ if (!avc && *stream_type == 's' && demuxer->s_streams[i])
+ codec_name = sh_sub_type2str(((sh_sub_t *)demuxer->s_streams[i])->type);
+@@ -602,7 +605,6 @@
+ avfc->pb = priv->pb;
+ }
+
+- av_dict_set(&opts, "fflags", "+keepside", 0);
+ if(avformat_open_input(&avfc, mp_filename, priv->avif, &opts)<0){
+ mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n");
+ return NULL;
+@@ -707,7 +709,7 @@
+ }
+ sh = ds->sh;
+ if (sh && sh->bih) {
+- int size = 0;
++ size_t size = 0;
+ const uint8_t *pal = av_packet_get_side_data(&pkt, AV_PKT_DATA_PALETTE, &size);
+ if (pal && size)
+ memcpy(((uint8_t *)sh->bih) + sh->bih->biSize, pal, FFMIN(size, 1024));
+@@ -721,7 +723,7 @@
+ return 1;
+ }
+
+- av_packet_merge_side_data(&pkt);
++ mp_packet_merge_side_data(&pkt);
+ dp=new_demux_packet(pkt.size);
+ memcpy(dp->buffer, pkt.data, pkt.size);
+
+Index: b/sub/av_sub.c
+===================================================================
+--- a/sub/av_sub.c 2022-08-19 16:52:04.099665096 +0200
++++ b/sub/av_sub.c 2022-08-19 16:52:04.095665126 +0200
+@@ -43,9 +43,9 @@
+
+ if (num_rects == 1) {
+ spudec_set_paletted(vo_spudec,
+- rects[0]->pict.data[0],
+- rects[0]->pict.linesize[0],
+- rects[0]->pict.data[1],
++ rects[0]->data[0],
++ rects[0]->linesize[0],
++ rects[0]->data[1],
+ rects[0]->x,
+ rects[0]->y,
+ rects[0]->w,
+@@ -66,9 +66,9 @@
+ spudec_packet_clear(packet);
+ for (i = 0; i < num_rects; i++)
+ spudec_packet_fill(packet,
+- rects[i]->pict.data[0],
+- rects[i]->pict.linesize[0],
+- rects[i]->pict.data[1],
++ rects[i]->data[0],
++ rects[i]->linesize[0],
++ rects[i]->data[1],
+ rects[i]->x - xmin,
+ rects[i]->y - ymin,
+ rects[i]->w,
+@@ -105,7 +105,7 @@
+ pkt.size = *size;
+ pkt.pts = *pts * 1000;
+ if (*pts != MP_NOPTS_VALUE && *endpts != MP_NOPTS_VALUE)
+- pkt.convergence_duration = (*endpts - *pts) * 1000;
++ pkt.duration = (*endpts - *pts) * 1000;
+ if (!ctx) {
+ AVCodec *sub_codec;
+ init_avcodec();
diff -Nru mplayer-1.4+ds1/debian/patches/r38309.patch mplayer-1.4+ds1/debian/patches/r38309.patch
--- mplayer-1.4+ds1/debian/patches/r38309.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38309.patch 2022-08-19 17:06:00.000000000 +0200
@@ -0,0 +1,86 @@
+Description: muxer_lavf: fix compilation with newer FFmpeg.
+ Note that this also moves the time base setting from codec to
+ stream, which makes it actually work again as the codec
+ time base is ignored by FFmpeg.
+ Leaves ve_lavc to fix for mencoder, which is a bit more complicated,
+ mostly because it's so many parameters that need to be replaced
+ with the matching dictionary setting, which is not easy to find.
+Origin: upstream, commit: r38309
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpdemux/muxer_lavf.c
+===================================================================
+--- a/libmpdemux/muxer_lavf.c 2022-08-19 16:52:04.127664880 +0200
++++ b/libmpdemux/muxer_lavf.c 2022-08-19 16:52:04.123664911 +0200
+@@ -112,7 +112,7 @@
+ muxer_priv_t *priv = muxer->priv;
+ muxer_stream_t *stream;
+ muxer_stream_priv_t *spriv;
+- AVCodecContext *ctx;
++ AVCodecParameters *ctx;
+
+ if(type != MUXER_TYPE_VIDEO && type != MUXER_TYPE_AUDIO)
+ {
+@@ -154,7 +154,7 @@
+ }
+ spriv->avstream->id = 1;
+
+- ctx = spriv->avstream->codec;
++ ctx = spriv->avstream->codecpar;
+ ctx->codec_id = AV_CODEC_ID_NONE;
+ switch(type)
+ {
+@@ -177,11 +177,9 @@
+ static void fix_parameters(muxer_stream_t *stream)
+ {
+ muxer_stream_priv_t *spriv = stream->priv;
+- AVCodecContext *ctx = spriv->avstream->codec;
++ AVCodecParameters *ctx = spriv->avstream->codecpar;
+
+ ctx->bit_rate= stream->avg_rate;
+- ctx->rc_buffer_size= stream->vbv_size;
+- ctx->rc_max_rate= stream->max_rate;
+
+ if(stream->type == MUXER_TYPE_AUDIO)
+ {
+@@ -221,12 +219,12 @@
+ ctx->codec_tag= stream->bih->biCompression;
+ mp_msg(MSGT_MUXER, MSGL_INFO, "VIDEO CODEC ID: %d\n", ctx->codec_id);
+ if (stream->imgfmt)
+- ctx->pix_fmt = imgfmt2pixfmt(stream->imgfmt);
++ ctx->format = imgfmt2pixfmt(stream->imgfmt);
+ ctx->width = stream->bih->biWidth;
+ ctx->height = stream->bih->biHeight;
+ ctx->bit_rate = 800000;
+- ctx->time_base.den = stream->h.dwRate;
+- ctx->time_base.num = stream->h.dwScale;
++ spriv->avstream->time_base.den = stream->h.dwRate;
++ spriv->avstream->time_base.num = stream->h.dwScale;
+ if (stream->aspect)
+ ctx->sample_aspect_ratio =
+ spriv->avstream->sample_aspect_ratio = av_d2q(stream->aspect * ctx->height / ctx->width, 255);
+@@ -319,9 +317,10 @@
+ }
+
+ static void list_formats(void) {
+- AVOutputFormat *fmt;
++ void *i = NULL;
++ const AVOutputFormat *fmt;
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf output formats:\n");
+- for (fmt = av_oformat_next(NULL); fmt; fmt = av_oformat_next(fmt))
++ while ((fmt = av_muxer_iterate(&i)))
+ mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name);
+ }
+
+@@ -368,7 +367,7 @@
+ const char *src = out_filename;
+ if (!strncmp(out_filename, "ffmpeg://dummy://", 17)) src += 17;
+ else if (!strncmp(out_filename, "ffmpeg://", 9)) src += 9;
+- av_strlcpy(priv->oc->filename, src, sizeof(priv->oc->filename));
++ priv->oc->url = av_strdup(src);
+ }
+ priv->oc->oformat = fmt;
+
diff -Nru mplayer-1.4+ds1/debian/patches/r38310.patch mplayer-1.4+ds1/debian/patches/r38310.patch
--- mplayer-1.4+ds1/debian/patches/r38310.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38310.patch 2022-08-19 17:05:13.000000000 +0200
@@ -0,0 +1,153 @@
+Description: libmpcodecs/ve_lavc: Don't set options via deprecated AVCodecContext fields
+ Those fields were removed in libavcodec major 59.
+
+ Some options won't work for some codecs anymore. Probably they
+ didn't work before too but were simply ignored. We can't keep
+ passing all options in all cases, because some encoders don't
+ support them and if they were passed in as dict paramters, we
+ will fail if they weren't accepted.
+
+ For a few options the default was changed, because their default
+ in libavcodec is different. Now the default can be different in
+ every encoder, because that is how codec private options work
+ in libavcodec.
+
+ These defaults were changed:
+ -static int lavc_param_prediction_method= FF_PRED_LEFT;
+ +static int lavc_param_prediction_method= 0; // method left (for some encoders)
+ -static int lavc_param_pre_me= 1;
+ +static int lavc_param_pre_me= 0;
+ -static int lavc_param_skip_cmp=0;
+ +static int lavc_param_skip_cmp = FF_CMP_DCTMAX;
+Origin: upstream, commit: r38310
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpcodecs/ve_lavc.c
+===================================================================
+--- a/libmpcodecs/ve_lavc.c 2022-08-19 16:52:04.159664634 +0200
++++ b/libmpcodecs/ve_lavc.c 2022-08-19 16:52:28.000000000 +0200
+@@ -99,7 +99,7 @@
+ static float lavc_param_spatial_cplx_masking= 0.0;
+ static float lavc_param_p_masking= 0.0;
+ static int lavc_param_interlaced_dct= 0;
+-static int lavc_param_prediction_method= FF_PRED_LEFT;
++static int lavc_param_prediction_method= 0; // method left (for some encoders)
+ static int lavc_param_format= IMGFMT_YV12;
+ static int lavc_param_debug= 0;
+ static int lavc_param_psnr= 0;
+@@ -122,7 +122,7 @@
+ static int lavc_param_obmc= 0;
+ static int lavc_param_loop= 0;
+ static int lavc_param_last_pred= 0;
+-static int lavc_param_pre_me= 1;
++static int lavc_param_pre_me= 0;
+ static int lavc_param_me_subpel_quality= 8;
+ static int lavc_param_me_range= 0;
+ static int lavc_param_coder= 0;
+@@ -144,7 +144,7 @@
+ static int lavc_param_skip_threshold=0;
+ static int lavc_param_skip_factor=0;
+ static int lavc_param_skip_exp=0;
+-static int lavc_param_skip_cmp=0;
++static int lavc_param_skip_cmp = FF_CMP_DCTMAX;
+ static int lavc_param_brd_scale = 0;
+ static int lavc_param_bidir_refine = 0;
+ static int lavc_param_video_global_header= 0;
+@@ -344,9 +344,11 @@
+ lavc_venc_context->qblur= lavc_param_vqblur;
+ lavc_venc_context->max_b_frames= lavc_param_vmax_b_frames;
+ lavc_venc_context->b_quant_factor= lavc_param_vb_qfactor;
+- lavc_venc_context->b_frame_strategy= lavc_param_vb_strategy;
++ if (lavc_param_vb_strategy)
++ av_dict_set_int(&opts, "b_strategy", lavc_param_vb_strategy, 0);
+ lavc_venc_context->b_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vb_qoffset + 0.5);
+- lavc_venc_context->rtp_payload_size= lavc_param_packet_size;
++ if (lavc_param_packet_size)
++ av_dict_set_int(&opts, "ps", lavc_param_packet_size, 0);
+ lavc_venc_context->strict_std_compliance= lavc_param_strict;
+ lavc_venc_context->i_quant_factor= lavc_param_vi_qfactor;
+ lavc_venc_context->i_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vi_qoffset + 0.5);
+@@ -363,20 +365,29 @@
+ lavc_param_rc_initial_buffer_occupancy;
+ lavc_venc_context->debug= lavc_param_debug;
+ lavc_venc_context->last_predictor_count= lavc_param_last_pred;
+- lavc_venc_context->pre_me= lavc_param_pre_me;
++ if (lavc_param_pre_me)
++ av_dict_set_int(&opts, "mepre", lavc_param_pre_me, 0);
+ lavc_venc_context->me_pre_cmp= lavc_param_me_pre_cmp;
+ lavc_venc_context->pre_dia_size= lavc_param_pre_dia_size;
+ lavc_venc_context->me_subpel_quality= lavc_param_me_subpel_quality;
+ lavc_venc_context->me_range= lavc_param_me_range;
+- lavc_venc_context->coder_type= lavc_param_coder;
+- lavc_venc_context->context_model= lavc_param_context;
+- lavc_venc_context->scenechange_threshold= lavc_param_sc_threshold;
+- lavc_venc_context->noise_reduction= lavc_param_noise_reduction;
++ if (lavc_param_coder)
++ av_dict_set_int(&opts, "coder", lavc_param_coder, 0);
++ if (lavc_param_context)
++ av_dict_set_int(&opts, "context", lavc_param_context, 0);
++ if (lavc_param_sc_threshold)
++ av_dict_set_int(&opts, "sc_threshold", lavc_param_sc_threshold, 0);
++ if (lavc_param_noise_reduction)
++ av_dict_set_int(&opts, "noise_reduction", lavc_param_noise_reduction, 0);
+ lavc_venc_context->nsse_weight= lavc_param_nssew;
+- lavc_venc_context->frame_skip_threshold= lavc_param_skip_threshold;
+- lavc_venc_context->frame_skip_factor= lavc_param_skip_factor;
+- lavc_venc_context->frame_skip_exp= lavc_param_skip_exp;
+- lavc_venc_context->frame_skip_cmp= lavc_param_skip_cmp;
++ if (lavc_param_skip_threshold)
++ av_dict_set_int(&opts, "skip_threshold", lavc_param_skip_threshold, 0);
++ if (lavc_param_skip_factor)
++ av_dict_set_int(&opts, "skip_factor", lavc_param_skip_factor, 0);
++ if (lavc_param_skip_exp)
++ av_dict_set_int(&opts, "skip_exp", lavc_param_skip_exp, 0);
++ if (lavc_param_skip_cmp != FF_CMP_DCTMAX)
++ av_dict_set_int(&opts, "skip_cmp", lavc_param_skip_cmp, 0);
+
+ if (lavc_param_intra_matrix)
+ {
+@@ -444,7 +455,8 @@
+ }
+ lavc_venc_context->rc_override_count=i;
+
+- lavc_venc_context->mpeg_quant=lavc_param_mpeg_quant;
++ if (lavc_param_mpeg_quant)
++ av_dict_set_int(&opts, "mpeg_quant", lavc_param_mpeg_quant, 0);
+
+ lavc_venc_context->dct_algo= lavc_param_fdct;
+ lavc_venc_context->idct_algo= lavc_param_idct;
+@@ -534,8 +546,10 @@
+ if(lavc_param_interlaced_dct) lavc_venc_context->flags|= AV_CODEC_FLAG_INTERLACED_DCT;
+ lavc_venc_context->flags|= lavc_param_psnr;
+ lavc_venc_context->intra_dc_precision = lavc_param_dc_precision - 8;
+- lavc_venc_context->prediction_method= lavc_param_prediction_method;
+- lavc_venc_context->brd_scale = lavc_param_brd_scale;
++ if (lavc_param_prediction_method)
++ av_dict_set_int(&opts, "pred", lavc_param_prediction_method, 0);
++ if (lavc_param_brd_scale)
++ av_dict_set_int(&opts, "brd_scale", lavc_param_brd_scale, 0);
+ lavc_venc_context->bidir_refine = lavc_param_bidir_refine;
+ if((lavc_param_video_global_header&1)
+ /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){
+@@ -546,7 +560,8 @@
+ }
+ lavc_venc_context->mv0_threshold = lavc_param_mv0_threshold;
+ lavc_venc_context->refs = lavc_param_refs;
+- lavc_venc_context->b_sensitivity = lavc_param_b_sensitivity;
++ if (lavc_param_b_sensitivity != 40)
++ av_dict_set_int(&opts, "b_sensitivity", lavc_param_b_sensitivity, 0);
+ lavc_venc_context->level = lavc_param_level;
+
+ if(lavc_param_avopt){
+@@ -611,7 +626,7 @@
+ lavc_venc_context->pre_dia_size = 0;
+ lavc_venc_context->dia_size = 1;
+
+- lavc_venc_context->noise_reduction = 0; // nr=0
++ av_dict_set(&opts, "noise_reduction", "0", 0); // nr=0
+ lavc_venc_context->mb_decision = 0; // mbd=0 ("realtime" encoding)
+
+ lavc_venc_context->flags &= ~AV_CODEC_FLAG_QPEL;
diff -Nru mplayer-1.4+ds1/debian/patches/r38311.patch mplayer-1.4+ds1/debian/patches/r38311.patch
--- mplayer-1.4+ds1/debian/patches/r38311.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38311.patch 2022-08-19 17:03:09.000000000 +0200
@@ -0,0 +1,95 @@
+Description: libmpcodecs/ve_lavc: Use side data to implement subopt psnr
+ Previously coded_frame from AVCodecContext was used, but that got
+ removed in libavcodec major 59.
+Origin: upstream, commit: r38311
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpcodecs/ve_lavc.c
+===================================================================
+--- a/libmpcodecs/ve_lavc.c 2022-08-19 16:52:04.187664419 +0200
++++ b/libmpcodecs/ve_lavc.c 2022-08-19 16:52:24.000000000 +0200
+@@ -32,6 +32,7 @@
+ #endif
+
+ #include "config.h"
++#include "libavutil/intreadwrite.h"
+ #include "mencoder.h"
+ #include "mp_msg.h"
+ #include "help_mp.h"
+@@ -295,6 +296,7 @@
+ muxer_stream_t* mux;
+ AVCodecContext *context;
+ AVFrame *pic;
++ int coded_picture_number;
+ AVCodec *codec;
+ FILE *stats_file;
+ };
+@@ -785,7 +787,7 @@
+ char filename[20];
+ double f= lavc_venc_context->width*lavc_venc_context->height*255.0*255.0;
+ double quality=0.0;
+- int8_t *q;
++ uint8_t *sd = av_packet_get_side_data(&pkt, AV_PKT_DATA_QUALITY_STATS, NULL);
+
+ if(!fvstats) {
+ time_t today2;
+@@ -804,32 +806,27 @@
+ }
+ }
+
+- // average MB quantizer
+- q = lavc_venc_context->coded_frame->qscale_table;
+- if(q) {
+- int x, y;
+- int w = (lavc_venc_context->width+15) >> 4;
+- int h = (lavc_venc_context->height+15) >> 4;
+- for( y = 0; y < h; y++ ) {
+- for( x = 0; x < w; x++ )
+- quality += (double)*(q+x);
+- q += lavc_venc_context->coded_frame->qstride;
+- }
+- quality /= w * h;
+- } else
+- quality = lavc_venc_context->coded_frame->quality / (float)FF_QP2LAMBDA;
++ if(sd && sd[5] >= 3) {
++ uint8_t pict_type = sd[4] * (sd[4] < FF_ARRAY_ELEMS(pict_type_char));
++ uint64_t error[3] = {
++ AV_RL64(sd + 8), AV_RL64(sd + 16), AV_RL64(sd + 24)
++ };
++ quality = AV_RL32(sd) / (float)FF_QP2LAMBDA;
+
+ fprintf(fvstats, "%6d, %2.2f, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n",
+- lavc_venc_context->coded_frame->coded_picture_number,
++ vf->priv->coded_picture_number,
+ quality,
+ pkt.size,
+- psnr(lavc_venc_context->coded_frame->error[0]/f),
+- psnr(lavc_venc_context->coded_frame->error[1]*4/f),
+- psnr(lavc_venc_context->coded_frame->error[2]*4/f),
+- psnr((lavc_venc_context->coded_frame->error[0]+lavc_venc_context->coded_frame->error[1]+lavc_venc_context->coded_frame->error[2])/(f*1.5)),
+- pict_type_char[lavc_venc_context->coded_frame->pict_type]
++ psnr(error[0]/f),
++ psnr(error[1]*4/f),
++ psnr(error[2]*4/f),
++ psnr((error[0]+error[1]+error[2])/(f*1.5)),
++ pict_type_char[pict_type]
+ );
++ }
+ }
++ vf->priv->coded_picture_number++;
++ ++vf->priv->coded_picture_number;
+ res = pkt.size;
+ av_packet_unref(&pkt);
+ return res;
+@@ -839,7 +836,7 @@
+
+ if(lavc_param_psnr){
+ double f= lavc_venc_context->width*lavc_venc_context->height*255.0*255.0;
+- f*= lavc_venc_context->coded_frame->coded_picture_number;
++ f*= vf->priv->coded_picture_number;
+
+ mp_msg(MSGT_MENCODER, MSGL_INFO, "PSNR: Y:%2.2f, Cb:%2.2f, Cr:%2.2f, All:%2.2f\n",
+ psnr(lavc_venc_context->error[0]/f),
diff -Nru mplayer-1.4+ds1/debian/patches/r38312.patch mplayer-1.4+ds1/debian/patches/r38312.patch
--- mplayer-1.4+ds1/debian/patches/r38312.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38312.patch 2022-08-19 17:02:23.000000000 +0200
@@ -0,0 +1,129 @@
+Description: libmpcodecs/ve_lavc: Port to avcodec_send_frame/avcodec_receive_packet
+ Previously avcodec_encode_video2 used, but that got removed
+ in libavcodec major 59.
+Origin: upstream, commit: r38312
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/libmpcodecs/ve_lavc.c
+===================================================================
+--- a/libmpcodecs/ve_lavc.c 2022-08-19 16:52:04.215664203 +0200
++++ b/libmpcodecs/ve_lavc.c 2022-08-19 16:52:04.211664234 +0200
+@@ -297,7 +297,8 @@
+ AVCodecContext *context;
+ AVFrame *pic;
+ int coded_picture_number;
+- AVCodec *codec;
++ const AVCodec *codec;
++ AVPacket *pkt;
+ FILE *stats_file;
+ };
+
+@@ -736,8 +737,8 @@
+ static int encode_frame(struct vf_instance *vf, AVFrame *pic, double pts){
+ const char pict_type_char[5]= {'?', 'I', 'P', 'B', 'S'};
+ double dts;
+- AVPacket pkt;
+- int res, got_pkt;
++ AVPacket *pkt= vf->priv->pkt;
++ int res;
+
+ if(pts == MP_NOPTS_VALUE)
+ pts= lavc_venc_context->frame_number * av_q2d(lavc_venc_context->time_base);
+@@ -753,10 +754,12 @@
+ pic->pts= MP_NOPTS_VALUE;
+ #endif
+ }
+- av_init_packet(&pkt);
+- pkt.data = mux_v->buffer;
+- pkt.size = mux_v->buffer_size;
+- res = avcodec_encode_video2(lavc_venc_context, &pkt, pic, &got_pkt);
++ res = avcodec_send_frame(lavc_venc_context, pic);
++ if (res < 0 && res != AVERROR(EAGAIN) && res != AVERROR_EOF)
++ return res;
++ res = avcodec_receive_packet(lavc_venc_context, pkt);
++ if (res < 0 && res != AVERROR(EAGAIN))
++ return res == AVERROR_EOF ? 0 : res;
+
+ /* store stats if there are any */
+ if(lavc_venc_context->stats_out && stats_file) {
+@@ -765,20 +768,20 @@
+ lavc_venc_context->stats_out[0] = 0;
+ }
+
+- if (res < 0)
+- return 0;
+- if(!got_pkt && lavc_param_skip_threshold==0 && lavc_param_skip_factor==0){
++ if(res == AVERROR(EAGAIN) && lavc_param_skip_threshold==0 && lavc_param_skip_factor==0){
+ ++mux_v->encoder_delay;
+ return 0;
+ }
+
+ dts = pts = MP_NOPTS_VALUE;
+- if (pkt.pts != AV_NOPTS_VALUE)
+- pts = pkt.pts * av_q2d(lavc_venc_context->time_base);
+- if (pkt.dts != AV_NOPTS_VALUE)
+- dts = pkt.dts * av_q2d(lavc_venc_context->time_base);
+-
+- muxer_write_chunk(mux_v,pkt.size,pkt.flags & AV_PKT_FLAG_KEY ?0x10:0,
++ if (pkt->pts != AV_NOPTS_VALUE)
++ pts = pkt->pts * av_q2d(lavc_venc_context->time_base);
++ if (pkt->dts != AV_NOPTS_VALUE)
++ dts = pkt->dts * av_q2d(lavc_venc_context->time_base);
++
++ mux_v->buffer = pkt->data; // use ref-counted packet
++ mux_v->buffer_size = pkt->size; // update size for consistency
++ muxer_write_chunk(mux_v,pkt->size,pkt->flags & AV_PKT_FLAG_KEY ?0x10:0,
+ dts, pts);
+
+ /* store psnr / pict size / type / qscale */
+@@ -787,7 +790,7 @@
+ char filename[20];
+ double f= lavc_venc_context->width*lavc_venc_context->height*255.0*255.0;
+ double quality=0.0;
+- uint8_t *sd = av_packet_get_side_data(&pkt, AV_PKT_DATA_QUALITY_STATS, NULL);
++ uint8_t *sd = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS, NULL);
+
+ if(!fvstats) {
+ time_t today2;
+@@ -816,7 +819,7 @@
+ fprintf(fvstats, "%6d, %2.2f, %6d, %2.2f, %2.2f, %2.2f, %2.2f %c\n",
+ vf->priv->coded_picture_number,
+ quality,
+- pkt.size,
++ pkt->size,
+ psnr(error[0]/f),
+ psnr(error[1]*4/f),
+ psnr(error[2]*4/f),
+@@ -825,10 +828,9 @@
+ );
+ }
+ }
+- vf->priv->coded_picture_number++;
+ ++vf->priv->coded_picture_number;
+- res = pkt.size;
+- av_packet_unref(&pkt);
++ res = pkt->size;
++ av_packet_unref(pkt);
+ return res;
+ }
+
+@@ -846,6 +848,8 @@
+ );
+ }
+
++ av_packet_free(&vf->priv->pkt);
++
+ av_freep(&lavc_venc_context->intra_matrix);
+ av_freep(&lavc_venc_context->inter_matrix);
+
+@@ -977,6 +981,7 @@
+ return 0;
+ }
+
++ vf->priv->pkt = av_packet_alloc();
+ vf->priv->pic = av_frame_alloc();
+ vf->priv->context = avcodec_alloc_context3(vf->priv->codec);
+ vf->priv->context->codec_id = vf->priv->codec->id;
diff -Nru mplayer-1.4+ds1/debian/patches/r38361.patch mplayer-1.4+ds1/debian/patches/r38361.patch
--- mplayer-1.4+ds1/debian/patches/r38361.patch 1970-01-01 01:00:00.000000000 +0100
+++ mplayer-1.4+ds1/debian/patches/r38361.patch 2022-08-19 17:01:04.000000000 +0200
@@ -0,0 +1,62 @@
+Description: configure, av_helpers.c: Fix compilation against latest FFmpeg.
+Origin: upstream, commit: r38361
+Bug: <URL to the upstream bug report if any, implies patch has been forwarded, optional>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004579
+Forwarded: no
+Last-Update: 2022-08-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: b/av_helpers.c
+===================================================================
+--- a/av_helpers.c 2022-08-19 16:52:04.247663957 +0200
++++ b/av_helpers.c 2022-08-19 16:52:04.239664018 +0200
+@@ -51,11 +51,9 @@
+ AVCodecContext *s= ptr;
+ if(s->codec){
+ if(s->codec->type == AVMEDIA_TYPE_AUDIO){
+- if(s->codec->decode)
+- type= MSGT_DECAUDIO;
++ type= MSGT_DECAUDIO;
+ }else if(s->codec->type == AVMEDIA_TYPE_VIDEO){
+- if(s->codec->decode)
+- type= MSGT_DECVIDEO;
++ type= MSGT_DECVIDEO;
+ }
+ //FIXME subtitles, encoders (what msgt for them? there is no appropriate ...)
+ }
+Index: b/configure
+===================================================================
+--- a/configure 2022-08-19 16:52:04.247663957 +0200
++++ b/configure 2022-08-19 16:52:04.243663987 +0200
+@@ -1553,8 +1553,8 @@
+ }
+
+ echocheck "ffmpeg/libavcodec/allcodecs.c"
+-libavdecoders_all=$(list_subparts_extern AVCodec decoder codec/allcodecs.c)
+-libavencoders_all=$(list_subparts_extern AVCodec encoder codec/allcodecs.c)
++libavdecoders_all=$(list_subparts_extern FFCodec decoder codec/allcodecs.c)
++libavencoders_all=$(list_subparts_extern FFCodec encoder codec/allcodecs.c)
+ libavparsers_all=$(list_subparts_extern AVCodecParser parser codec/parsers.c)
+ test $? -eq 0 && _list_subparts=found || _list_subparts="not found"
+ echores "$_list_subparts"
+@@ -1572,7 +1572,7 @@
+ echores "$_list_subparts"
+
+ echocheck "ffmpeg/libavcodec/bitsteram_filters.c"
+-libavbsfs_all=$(list_subparts_extern AVBitStreamFilter bsf codec/bitstream_filters.c)
++libavbsfs_all=$(list_subparts_extern FFBitStreamFilter bsf codec/bitstream_filters.c)
+ test $? -eq 0 && _list_subparts_extern=found || _list_subparts_extern="not found"
+ echores "$_list_subparts_extern"
+
+@@ -9527,9 +9527,9 @@
+ cp $TMPH ffmpeg/$file
+ }
+
+-print_enabled_components libavcodec/codec_list.c AVCodec codec_list $libavdecoders $libavencoders
++print_enabled_components libavcodec/codec_list.c FFCodec codec_list $libavdecoders $libavencoders
+ print_enabled_components libavcodec/parser_list.c AVCodecParser parser_list $libavparsers
+-print_enabled_components libavcodec/bsf_list.c AVBitStreamFilter bitstream_filters $libavbsfs
++print_enabled_components libavcodec/bsf_list.c FFBitStreamFilter bitstream_filters $libavbsfs
+ print_enabled_components libavdevice/indev_list.c AVInputFormat indev_list ""
+ print_enabled_components libavdevice/outdev_list.c AVOutputFormat outdev_list ""
+ print_enabled_components libavformat/demuxer_list.c AVInputFormat demuxer_list $libavdemuxers
diff -Nru mplayer-1.4+ds1/debian/patches/series mplayer-1.4+ds1/debian/patches/series
--- mplayer-1.4+ds1/debian/patches/series 2021-09-09 23:05:55.000000000 +0200
+++ mplayer-1.4+ds1/debian/patches/series 2022-08-19 17:11:49.000000000 +0200
@@ -5,3 +5,15 @@
0202_glibc-2.27.patch
0203_generic-arch-fallback.patch
0007-ad_spdif-Use-avformat_free_context-to-free-context.patch
+r38215.patch
+r38216.patch
+r38217.patch
+r38219.patch
+r38246.patch
+r38306.patch
+r38307.patch
+r38309.patch
+r38310.patch
+r38311.patch
+r38312.patch
+r38361.patch
Reply to: