123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- # HG changeset patch
- # User Torsten Jager <t.jager@gmx.de>
- # Date 1715160885 -7200
- # Wed May 08 11:34:45 2024 +0200
- # Node ID 73b833e7fe356cd2d9490dda4ebc9bfe16fce958
- # Parent 1e7b184008860c8be2289c3cefd9dee57f06193a
- ffmpeg compatibility update 2.
- diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_audio_decoder.c
- --- a/src/combined/ffmpeg/ff_audio_decoder.c Mon May 06 21:55:55 2024 +0200
- +++ b/src/combined/ffmpeg/ff_audio_decoder.c Wed May 08 11:34:45 2024 +0200
- @@ -1393,6 +1393,9 @@
- XFF_FREE_FRAME (this->av_frame);
- }
- #endif
- +#if 1
- + avcodec_flush_buffers (this->context);
- +#else
- pthread_mutex_lock (&ffmpeg_lock);
- {
- uint8_t *ed = this->context->extradata;
- @@ -1410,6 +1413,7 @@
- if (XFF_AVCODEC_OPEN (this->context, this->codec) >= 0)
- this->decoder_ok = 1;
- pthread_mutex_unlock (&ffmpeg_lock);
- +#endif
- }
-
- ff_audio_reset_parser(this);
- diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_video_decoder.c
- --- a/src/combined/ffmpeg/ff_video_decoder.c Mon May 06 21:55:55 2024 +0200
- +++ b/src/combined/ffmpeg/ff_video_decoder.c Wed May 08 11:34:45 2024 +0200
- @@ -89,6 +89,11 @@
- # define ENABLE_EMMS
- #endif
-
- +/*
- +#undef XFF_AVCODEC_SLICE_TABLE
- +#define XFF_AVCODEC_SLICE_TABLE 1
- +*/
- +
- #define VIDEOBUFSIZE (128*1024)
- #define SLICE_BUFFER_SIZE (1194*1024)
-
- @@ -148,11 +153,11 @@
- int bufsize;
- int size;
- int skipframes;
- -
- +#if XFF_AVCODEC_SLICE_TABLE == 1
- int *slice_offset_table;
- int slice_offset_size;
- int slice_offset_pos;
- -
- +#endif
- AVFrame *av_frame;
- AVFrame *av_frame2;
- AVCodecContext *context;
- @@ -238,6 +243,13 @@
- #if XFF_VIDEO > 1
- XFF_PACKET_DECL (avpkt);
- #endif
- +
- +#if XFF_AVCODEC_SLICE_TABLE == 2
- + uint8_t *temp_buf;
- + uint32_t temp_size;
- + int slice_num;
- + uint8_t slice_table[1 + 256 * 8];
- +#endif
- };
-
- /* import color matrix names */
- @@ -1783,10 +1795,9 @@
- this->size += buf->size;
-
- if (buf->decoder_flags & BUF_FLAG_FRAME_END) {
- - int codec_type;
- + uint32_t codec_type = buf->type & 0xFFFF0000;
-
- lprintf ("header complete\n");
- - codec_type = buf->type & 0xFFFF0000;
-
- if (buf->decoder_flags & BUF_FLAG_STDHEADER) {
-
- @@ -1912,33 +1923,44 @@
- #endif
- }
- else if (buf->decoder_info[1] == BUF_SPECIAL_RV_CHUNK_TABLE) {
- - /* o dear. Multiple decoding threads use individual contexts.
- - av_decode_video2 () does only copy the _pointer_ to the offsets,
- - not the offsets themselves. So we must not overwrite anything
- - that another thread has not yet read. */
- - int i, l, total;
- -
- - lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n");
- - l = buf->decoder_info[2] + 1;
- -
- - total = l * this->class->thread_count;
- - if (total < SLICE_OFFSET_SIZE)
- - total = SLICE_OFFSET_SIZE;
- - if (total > this->slice_offset_size) {
- - this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int));
- - this->slice_offset_size = total;
- - }
- -
- - if (this->slice_offset_pos + l > this->slice_offset_size)
- - this->slice_offset_pos = 0;
- - this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos;
- - this->context->slice_count = l;
- -
- - lprintf ("slice_count=%d\n", l);
- - for (i = 0; i < l; i++) {
- - this->slice_offset_table[this->slice_offset_pos++] =
- - ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1];
- - lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]);
- + {
- +#if XFF_AVCODEC_SLICE_TABLE == 1
- + /* o dear. Multiple decoding threads use individual contexts.
- + * av_decode_video2 () does only copy the _pointer_ to the offsets,
- + * not the offsets themselves. So we must not overwrite anything
- + * that another thread has not yet read. */
- + int i, l, total;
- +
- + lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n");
- + l = buf->decoder_info[2] + 1;
- +
- + total = l * this->class->thread_count;
- + if (total < SLICE_OFFSET_SIZE)
- + total = SLICE_OFFSET_SIZE;
- + if (total > this->slice_offset_size) {
- + this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int));
- + this->slice_offset_size = total;
- + }
- +
- + if (this->slice_offset_pos + l > this->slice_offset_size)
- + this->slice_offset_pos = 0;
- + this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos;
- + this->context->slice_count = l;
- +
- + lprintf ("slice_count=%d\n", l);
- + for (i = 0; i < l; i++) {
- + this->slice_offset_table[this->slice_offset_pos++] =
- + ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1];
- + lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]);
- + }
- +#elif XFF_AVCODEC_SLICE_TABLE == 2
- + /* (count-1):1, 1:4, (offs[0]):4, 1:4, (offs[1]:4, ... just in front of the frame bitstream.
- + * reverse engineered from ffmpeg/libavcodec/rv34.c. they seem to expect no
- + * external use of rv decoders, and did not document this. */
- + this->slice_table[0] = buf->decoder_info[2];
- + this->slice_num = this->slice_table[0] + 1;
- + memcpy (this->slice_table + 1, buf->decoder_info_ptr[2], 8 * this->slice_num);
- +#endif
- }
- }
- }
- @@ -2004,6 +2026,7 @@
-
- static int decode_video_wrapper (ff_video_decoder_t *this,
- AVFrame *av_frame, int *err, void *buf, size_t buf_size) {
- + uint32_t tsize = 0;
- int len;
-
- #if ENABLE_VAAPI
- @@ -2013,9 +2036,32 @@
- }
- #endif /* ENABLE_VAAPI */
-
- +#if XFF_AVCODEC_SLICE_TABLE == 2
- + if ((this->slice_num > 0) && buf) {
- + uint32_t nsize;
- + tsize = 1 + this->slice_num * 8;
- + nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE;
- + if (this->temp_size < nsize) {
- + nsize = nsize * 3 / 2;
- + free (this->temp_buf);
- + this->temp_buf = malloc (nsize);
- + if (!this->temp_buf)
- + nsize = 0;
- + this->temp_size = nsize;
- + nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE;
- + }
- + if (this->temp_size >= nsize) {
- + memcpy (this->temp_buf, this->slice_table, tsize);
- + memcpy (this->temp_buf + tsize, buf, buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
- + buf = this->temp_buf;
- + }
- + this->slice_num = 0;
- + }
- +#endif
- +
- #if XFF_VIDEO > 1
- this->avpkt->data = buf;
- - this->avpkt->size = buf_size;
- + this->avpkt->size = buf_size + tsize;
- this->avpkt->flags = AV_PKT_FLAG_KEY;
- # ifdef XFF_AVCODEC_FRAME_PTS
- this->avpkt->pts = this->tagged_pts;
- @@ -2486,7 +2532,6 @@
- this->size -= len;
-
- if (this->size > 0) {
- - ff_check_bufsize(this, this->size);
- memmove (this->buf, &chunk_buf[offset], this->size);
- chunk_buf = this->buf;
- /* take over pts for next access unit */
- @@ -2615,8 +2660,8 @@
-
- img->pts = ff_untag_pts(this, this->av_frame);
-
- - /* workaround for weird 120fps streams */
- - if( video_step_to_use == 750 ) {
- + /* workaround for weird 120fps streams, as well as some rv20 with frame duration 3pts. */
- + if (video_step_to_use <= 750) {
- /* fallback to the VIDEO_PTS_MODE */
- video_step_to_use = 0;
- }
- @@ -2837,7 +2882,7 @@
-
- img->pts = ff_untag_pts (this, this->av_frame2);
-
- - if (video_step_to_use == 750)
- + if (video_step_to_use <= 750)
- video_step_to_use = 0;
- img->duration = this->av_frame2->repeat_pict ? video_step_to_use * 3 / 2 : video_step_to_use;
- img->progressive_frame = !this->av_frame2->interlaced_frame;
- @@ -2941,6 +2986,9 @@
- mpeg_parser_reset(this->mpeg_parser);
-
- /* this->pts_tag_pass = 0; */
- +#if XFF_AVCODEC_SLICE_TABLE == 2
- + this->slice_num = 0;
- +#endif
- }
-
- static void ff_dispose (video_decoder_t *this_gen) {
- @@ -2953,12 +3001,15 @@
- rgb2yuy2_free (this->rgb2yuy2);
-
- if (this->decoder_ok) {
- + uint8_t *ed;
-
- pthread_mutex_lock(&ffmpeg_lock);
- - _x_freep (&this->context->extradata);
- + ed = this->context->extradata;
- + this->context->extradata = NULL;
- this->context->extradata_size = 0;
- XFF_FREE_CONTEXT (this->context);
- pthread_mutex_unlock(&ffmpeg_lock);
- + _x_freep (&ed);
-
- #ifdef ENABLE_DIRECT_RENDERING
- ff_free_dr1_frames (this, 1);
- @@ -2972,9 +3023,11 @@
- XFF_FREE_CONTEXT (this->context);
- }
-
- - if (this->slice_offset_table)
- - free (this->slice_offset_table);
- -
- +#if XFF_AVCODEC_SLICE_TABLE == 1
- + free (this->slice_offset_table);
- +#elif XFF_AVCODEC_SLICE_TABLE == 2
- + free (this->temp_buf);
- +#endif
-
- #if XFF_VIDEO > 1
- XFF_PACKET_UNREF (this->avpkt);
- @@ -3062,21 +3115,25 @@
- this->decoder_ok = 0;
- this->aspect_ratio = 0;
- this->pts_tag_pass = 0;
- -#ifdef HAVE_POSTPROC
- +# ifdef HAVE_POSTPROC
- this->pp_quality = 0;
- this->our_context = NULL;
- this->our_mode = NULL;
- -#endif
- +# endif
- this->mpeg_parser = NULL;
- this->set_stream_info = 0;
- this->rgb2yuy2 = NULL;
- -#ifdef ENABLE_VAAPI
- +# ifdef ENABLE_VAAPI
- this->accel = NULL;
- this->accel_img = NULL;
- -#endif
- -#if XFF_VIDEO == 3
- +# endif
- +# if XFF_VIDEO == 3
- this->flush_packet_sent = 0;
- -#endif
- +# endif
- +# if XFF_AVCODEC_SLICE_TABLE == 2
- + this->temp_size = 0;
- + this->temp_buf = NULL;
- +# endif
- #endif
-
- this->video_decoder.decode_data = ff_decode_data;
- diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ffmpeg_compat.h
- --- a/src/combined/ffmpeg/ffmpeg_compat.h Mon May 06 21:55:55 2024 +0200
- +++ b/src/combined/ffmpeg/ffmpeg_compat.h Wed May 08 11:34:45 2024 +0200
- @@ -139,6 +139,14 @@
- # define XFF_PALETTE 3
- #endif
-
- +#if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,42,100)
- +/* AVCodecContext.slice_{offset,count} */
- +# define XFF_AVCODEC_SLICE_TABLE 1
- +#else
- +/* inline offset table before the frame. */
- +# define XFF_AVCODEC_SLICE_TABLE 2
- +#endif
- +
- #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,0,100) /** << revise this */
- # define XFF_VAAPI 1 /** << libavcodec/vaapi.h */
- #else
|