From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Subject: [FFmpeg-devel] [PATCH 29/42] avcodec/vp3: Switch to ProgressFrames Date: Tue, 19 Sep 2023 21:57:21 +0200 Message-ID: <AS8P250MB07447CCC722EE0B75FB643A08FFAA@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <AS8P250MB074487CAD933FE4F6325C8EB8FFAA@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> Avoids implicit av_frame_ref() and therefore allocations and error checks. It also avoids explicitly allocating the AVFrames (done implicitly when getting the buffer) and it also allows to reuse the flushing code for freeing the ProgressFrames. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/vp3.c | 148 +++++++++++++++++------------------------------ 1 file changed, 54 insertions(+), 94 deletions(-) diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 98dabfc907..e8e1ebff56 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -46,8 +46,8 @@ #include "hpeldsp.h" #include "jpegquanttables.h" #include "mathops.h" +#include "progressframe.h" #include "thread.h" -#include "threadframe.h" #include "videodsp.h" #include "vp3data.h" #include "vp4data.h" @@ -180,9 +180,9 @@ typedef struct Vp3DecodeContext { int version; int width, height; int chroma_x_shift, chroma_y_shift; - ThreadFrame golden_frame; - ThreadFrame last_frame; - ThreadFrame current_frame; + ProgressFrame golden_frame; + ProgressFrame last_frame; + ProgressFrame current_frame; int keyframe; uint8_t idct_permutation[64]; uint8_t idct_scantable[64]; @@ -336,12 +336,9 @@ static void vp3_decode_flush(AVCodecContext *avctx) { Vp3DecodeContext *s = avctx->priv_data; - if (s->golden_frame.f) - ff_thread_release_ext_buffer(avctx, &s->golden_frame); - if (s->last_frame.f) - ff_thread_release_ext_buffer(avctx, &s->last_frame); - if (s->current_frame.f) - ff_thread_release_ext_buffer(avctx, &s->current_frame); + ff_thread_progress_unref(avctx, &s->golden_frame); + ff_thread_progress_unref(avctx, &s->last_frame); + ff_thread_progress_unref(avctx, &s->current_frame); } static av_cold int vp3_decode_end(AVCodecContext *avctx) @@ -355,9 +352,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx) /* release all frames */ vp3_decode_flush(avctx); - av_frame_free(&s->current_frame.f); - av_frame_free(&s->last_frame.f); - av_frame_free(&s->golden_frame.f); for (int i = 0; i < FF_ARRAY_ELEMS(s->coeff_vlc); i++) ff_vlc_free(&s->coeff_vlc[i]); @@ -1899,10 +1893,9 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y) /* At the end of the frame, report INT_MAX instead of the height of * the frame. This makes the other threads' ff_thread_await_progress() * calls cheaper, because they don't have to clip their values. */ - ff_thread_report_progress(&s->current_frame, + ff_thread_progress_report(&s->current_frame, y_flipped == s->height ? INT_MAX - : y_flipped - 1, - 0); + : y_flipped - 1); } if (!s->avctx->draw_horiz_band) @@ -1933,7 +1926,7 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y) static void await_reference_row(Vp3DecodeContext *s, const Vp3Fragment *fragment, int motion_y, int y) { - const ThreadFrame *ref_frame; + const ProgressFrame *ref_frame; int ref_row; int border = motion_y & 1; @@ -1946,7 +1939,7 @@ static void await_reference_row(Vp3DecodeContext *s, const Vp3Fragment *fragment ref_row = y + (motion_y >> 1); ref_row = FFMAX(FFABS(ref_row), ref_row + 8 + border); - ff_thread_await_progress(ref_frame, ref_row, 0); + ff_thread_progress_await(ref_frame, ref_row); } #if CONFIG_VP4_DECODER @@ -2057,12 +2050,12 @@ static void render_slice(Vp3DecodeContext *s, int slice) int16_t *block = s->block; int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef; /* When decoding keyframes, the earlier frames may not be available, - * so to avoid using undefined pointer arithmetic on them we just - * use the current frame instead. Nothing is ever read from these - * frames in case of a keyframe. */ - const AVFrame *last_frame = s->last_frame.f->data[0] ? + * so we just use the current frame in this case instead; + * it also avoid using undefined pointer arithmetic. Nothing is + * ever read from these frames in case of a keyframe. */ + const AVFrame *last_frame = s->last_frame.f ? s->last_frame.f : s->current_frame.f; - const AVFrame *golden_frame = s->golden_frame.f->data[0] ? + const AVFrame *golden_frame = s->golden_frame.f ? s->golden_frame.f : s->current_frame.f; int motion_halfpel_index; int first_pixel; @@ -2302,18 +2295,6 @@ static av_cold int allocate_tables(AVCodecContext *avctx) return 0; } -static av_cold int init_frames(Vp3DecodeContext *s) -{ - s->current_frame.f = av_frame_alloc(); - s->last_frame.f = av_frame_alloc(); - s->golden_frame.f = av_frame_alloc(); - - if (!s->current_frame.f || !s->last_frame.f || !s->golden_frame.f) - return AVERROR(ENOMEM); - - return 0; -} - static av_cold int vp3_decode_init(AVCodecContext *avctx) { Vp3DecodeContext *s = avctx->priv_data; @@ -2322,10 +2303,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) int c_height; int y_fragment_count, c_fragment_count; - ret = init_frames(s); - if (ret < 0) - return ret; - if (avctx->codec_tag == MKTAG('V', 'P', '4', '0')) { s->version = 3; #if !CONFIG_VP4_DECODER @@ -2493,59 +2470,43 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) } /// Release and shuffle frames after decode finishes -static int update_frames(AVCodecContext *avctx) +static void update_frames(AVCodecContext *avctx) { Vp3DecodeContext *s = avctx->priv_data; - int ret = 0; - if (s->keyframe) { - ff_thread_release_ext_buffer(avctx, &s->golden_frame); - ret = ff_thread_ref_frame(&s->golden_frame, &s->current_frame); - } - /* shuffle frames */ - ff_thread_release_ext_buffer(avctx, &s->last_frame); - FFSWAP(ThreadFrame, s->last_frame, s->current_frame); + if (s->keyframe) + ff_thread_progress_replace(avctx, &s->golden_frame, &s->current_frame); - return ret; + /* shuffle frames */ + ff_thread_progress_unref(avctx, &s->last_frame); + FFSWAP(ProgressFrame, s->last_frame, s->current_frame); } #if HAVE_THREADS -static int ref_frame(Vp3DecodeContext *s, ThreadFrame *dst, const ThreadFrame *src) -{ - ff_thread_release_ext_buffer(s->avctx, dst); - if (src->f->data[0]) - return ff_thread_ref_frame(dst, src); - return 0; -} - -static int ref_frames(Vp3DecodeContext *dst, const Vp3DecodeContext *src) +static void ref_frames(AVCodecContext *avctx, + Vp3DecodeContext *dst, const Vp3DecodeContext *src) { - int ret; - if ((ret = ref_frame(dst, &dst->current_frame, &src->current_frame)) < 0 || - (ret = ref_frame(dst, &dst->golden_frame, &src->golden_frame)) < 0 || - (ret = ref_frame(dst, &dst->last_frame, &src->last_frame)) < 0) - return ret; - return 0; + ff_thread_progress_replace(avctx, &dst->current_frame, &src->current_frame); + ff_thread_progress_replace(avctx, &dst->golden_frame, &src->golden_frame); + ff_thread_progress_replace(avctx, &dst->last_frame, &src->last_frame); } static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { Vp3DecodeContext *s = dst->priv_data; const Vp3DecodeContext *s1 = src->priv_data; - int qps_changed = 0, err; + int qps_changed = 0; - if (!s1->current_frame.f->data[0] || + if (s != s1) { + // copy previous frame data + ref_frames(dst, s, s1); + } + if (!s1->current_frame.f || s->width != s1->width || s->height != s1->height) { - if (s != s1) - ref_frames(s, s1); return -1; } if (s != s1) { - // copy previous frame data - if ((err = ref_frames(s, s1)) < 0) - return err; - s->keyframe = s1->keyframe; // copy qscale data if necessary @@ -2567,7 +2528,8 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext * } } - return update_frames(dst); + update_frames(dst); + return 0; } #endif @@ -2658,15 +2620,18 @@ static int vp3_decode_frame(AVCodecContext *avctx, AVFrame *frame, if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe) return buf_size; + if ((ret = ff_thread_progress_get_buffer(avctx, &s->current_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) { + // Don't goto error here, as one can't report progress on or + // unref a non-existent frame. + return ret; + } s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; if (s->keyframe) s->current_frame.f->flags |= AV_FRAME_FLAG_KEY; else s->current_frame.f->flags &= ~AV_FRAME_FLAG_KEY; - if ((ret = ff_thread_get_ext_buffer(avctx, &s->current_frame, - AV_GET_BUFFER_FLAG_REF)) < 0) - goto error; if (!s->edge_emu_buffer) { s->edge_emu_buffer = av_malloc(9 * FFABS(s->current_frame.f->linesize[0])); @@ -2724,19 +2689,16 @@ static int vp3_decode_frame(AVCodecContext *avctx, AVFrame *frame, #endif } } else { - if (!s->golden_frame.f->data[0]) { + if (!s->golden_frame.f) { av_log(s->avctx, AV_LOG_WARNING, "vp3: first frame not a keyframe\n"); - s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I; - if ((ret = ff_thread_get_ext_buffer(avctx, &s->golden_frame, - AV_GET_BUFFER_FLAG_REF)) < 0) + if ((ret = ff_thread_progress_get_buffer(avctx, &s->golden_frame, + AV_GET_BUFFER_FLAG_REF)) < 0) goto error; - ff_thread_release_ext_buffer(avctx, &s->last_frame); - if ((ret = ff_thread_ref_frame(&s->last_frame, - &s->golden_frame)) < 0) - goto error; - ff_thread_report_progress(&s->last_frame, INT_MAX, 0); + s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I; + ff_thread_progress_replace(avctx, &s->last_frame, &s->golden_frame); + ff_thread_progress_report(&s->golden_frame, INT_MAX); } } ff_thread_finish_setup(avctx); @@ -2814,16 +2776,13 @@ static int vp3_decode_frame(AVCodecContext *avctx, AVFrame *frame, *got_frame = 1; - if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME)) { - ret = update_frames(avctx); - if (ret < 0) - return ret; - } + if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME)) + update_frames(avctx); return buf_size; error: - ff_thread_report_progress(&s->current_frame, INT_MAX, 0); + ff_thread_progress_report(&s->current_frame, INT_MAX); if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME)) av_frame_unref(s->current_frame.f); @@ -3173,7 +3132,8 @@ const FFCodec ff_theora_decoder = { .flush = vp3_decode_flush, UPDATE_THREAD_CONTEXT(vp3_update_thread_context), .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | - FF_CODEC_CAP_EXPORTS_CROPPING | FF_CODEC_CAP_ALLOCATE_PROGRESS, + FF_CODEC_CAP_EXPORTS_CROPPING | + FF_CODEC_CAP_USES_PROGRESSFRAMES, }; #endif @@ -3191,7 +3151,7 @@ const FFCodec ff_vp3_decoder = { .flush = vp3_decode_flush, UPDATE_THREAD_CONTEXT(vp3_update_thread_context), .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | - FF_CODEC_CAP_ALLOCATE_PROGRESS, + FF_CODEC_CAP_USES_PROGRESSFRAMES, }; #if CONFIG_VP4_DECODER @@ -3209,6 +3169,6 @@ const FFCodec ff_vp4_decoder = { .flush = vp3_decode_flush, UPDATE_THREAD_CONTEXT(vp3_update_thread_context), .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | - FF_CODEC_CAP_ALLOCATE_PROGRESS, + FF_CODEC_CAP_USES_PROGRESSFRAMES, }; #endif -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-09-19 20:01 UTC|newest] Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-19 19:38 [FFmpeg-devel] [PATCH 00/42] New API for reference counting and ThreadFrames Andreas Rheinhardt 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 01/42] tests/fate-run: Ensure that THREADS=random is actually random Andreas Rheinhardt 2023-09-25 20:01 ` Andreas Rheinhardt 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 02/42] avcodec/refstruct: Add simple API for refcounted objects Andreas Rheinhardt 2023-09-21 19:58 ` Nicolas George 2023-09-21 23:07 ` Andreas Rheinhardt 2023-10-06 18:24 ` Andreas Rheinhardt 2023-10-06 19:43 ` Nicolas George 2023-10-06 20:20 ` Andreas Rheinhardt 2023-10-06 20:37 ` Nicolas George 2023-10-06 20:50 ` Andreas Rheinhardt 2023-10-06 21:22 ` Nicolas George 2023-10-07 21:03 ` James Almer 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 03/42] avcodec/get_buffer: Use RefStruct API for FramePool Andreas Rheinhardt 2023-09-28 12:36 ` Anton Khirnov 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 04/42] avcodec/h264_ps: Use RefStruct API for SPS/PPS Andreas Rheinhardt 2023-09-28 13:03 ` Anton Khirnov 2023-09-28 15:49 ` Andreas Rheinhardt 2023-10-02 9:39 ` Anton Khirnov 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 05/42] avcodec/hevc_ps: Use RefStruct API for parameter sets Andreas Rheinhardt 2023-09-28 13:13 ` Anton Khirnov 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 06/42] avcodec/vp8: Use RefStruct API for seg_map Andreas Rheinhardt 2023-10-02 9:44 ` Anton Khirnov 2023-10-02 10:04 ` Andreas Rheinhardt 2023-10-02 10:14 ` Anton Khirnov 2023-09-19 19:56 ` [FFmpeg-devel] [PATCH 07/42] avcodec/wavpack: Use RefStruct API for DSD context Andreas Rheinhardt 2023-10-02 9:46 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 08/42] avcodec/dovi_rpu: Use RefStruct API for Vdr data Andreas Rheinhardt 2023-10-02 9:51 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 09/42] avcodec/refstruct: Allow checking for exclusive ownership Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 10/42] avcodec/cbs: Use RefStruct-API for unit content Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 11/42] avcodec/cbs_sei: Use RefStruct API for SEI messages Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 12/42] avcodec/decode: Use RefStruct API for hwaccel_picture_private Andreas Rheinhardt 2023-10-02 10:39 ` Anton Khirnov 2023-10-02 12:30 ` Lynne 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 13/42] avcodec/vulkan_decode: Use RefStruct API for shared_ref Andreas Rheinhardt 2023-10-02 12:31 ` Lynne 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 14/42] avcodec/hevcdec: Use RefStruct API for RefPicListTap buffer Andreas Rheinhardt 2023-10-02 10:47 ` Anton Khirnov 2023-10-02 11:07 ` Andreas Rheinhardt 2023-10-04 8:10 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 15/42] avcodec/pthread_frame: Use RefStruct API for ThreadFrame.progress Andreas Rheinhardt 2023-10-02 11:01 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 16/42] avcodec/nvdec: Use RefStruct API for decoder_ref Andreas Rheinhardt 2023-10-02 10:58 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 17/42] avcodec/refstruct: Add RefStruct pool API Andreas Rheinhardt 2023-09-20 19:58 ` Michael Niedermayer 2023-09-21 0:28 ` Andreas Rheinhardt 2023-10-04 8:39 ` Anton Khirnov 2023-10-04 11:09 ` Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 18/42] avcodec/h264dec: Use RefStruct-pool API instead of AVBufferPool API Andreas Rheinhardt 2023-10-04 14:07 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 19/42] avcodec/hevcdec: " Andreas Rheinhardt 2023-10-04 14:12 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 20/42] avcodec/nvdec: Use RefStruct-pool API for decoder pool Andreas Rheinhardt 2023-10-04 14:28 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 21/42] avcodec/refstruct: Allow to always return zeroed pool entries Andreas Rheinhardt 2023-10-12 12:45 ` Anton Khirnov 2023-10-12 13:25 ` Andreas Rheinhardt 2023-10-12 13:56 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 22/42] avcodec/vp9: Use RefStruct-pool API for extradata Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 23/42] avcodec/vaapi_encode: Use RefStruct pool API, stop abusing AVBuffer API Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 24/42] avcodec/refstruct: Allow to share pools Andreas Rheinhardt 2023-10-12 13:04 ` Anton Khirnov 2023-10-12 13:51 ` Andreas Rheinhardt 2023-10-12 14:04 ` Anton Khirnov 2023-10-12 14:10 ` Andreas Rheinhardt 2023-10-12 17:09 ` Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 25/42] avcodec/vp9: Join extradata buffer pools Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 26/42] avcodec/refstruct: Allow to use a dynamic opaque Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 27/42] avcodec/pthread_frame: Add new progress API Andreas Rheinhardt 2023-10-21 10:34 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 28/42] avcodec/mimic: Switch to ProgressFrames Andreas Rheinhardt 2023-10-21 10:38 ` Anton Khirnov 2023-09-19 19:57 ` Andreas Rheinhardt [this message] 2023-10-21 10:48 ` [FFmpeg-devel] [PATCH 29/42] avcodec/vp3: " Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 30/42] avcodec/vp9: " Andreas Rheinhardt 2023-10-21 11:04 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 31/42] avcodec/vp9: Fix race when attaching side-data for show-existing frame Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 32/42] avcodec/vp9: Reduce wait times Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 33/42] avcodec/vp9: Simplify replacing VP9Frame Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 34/42] avcodec/vp9: Replace atomic_store() by atomic_init() Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 35/42] avcodec/threadprogress: Add new API for frame-threaded progress Andreas Rheinhardt 2023-09-20 19:44 ` Michael Niedermayer 2023-09-21 0:28 ` Andreas Rheinhardt 2023-10-25 13:25 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 36/42] avcodec/wavpack: Use ThreadProgress API Andreas Rheinhardt 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 37/42] avcodec/vp8: Convert to ProgressFrame API Andreas Rheinhardt 2023-10-25 13:35 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 38/42] avcodec/codec_internal: Remove FF_CODEC_CAP_ALLOCATE_PROGRESS Andreas Rheinhardt 2023-10-25 13:38 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 39/42] avcodec/hevcdec: Move collocated_ref to HEVCContext Andreas Rheinhardt 2023-10-25 13:42 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 40/42] avcodec/hevcdec: Switch to ProgressFrames Andreas Rheinhardt 2023-11-09 9:50 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 41/42] avcodec/pngdec: " Andreas Rheinhardt 2023-11-09 9:52 ` Anton Khirnov 2023-09-19 19:57 ` [FFmpeg-devel] [PATCH 42/42] avcodec/ffv1dec: " Andreas Rheinhardt 2023-11-09 9:56 ` Anton Khirnov 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 43/49] avcodec/qsv: Use RefStruct API for memory id (mids) array Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 44/49] avcodec/rkmppdec: Fix double-free on error Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 45/49] avcodec/rkmppdec: Check av_buffer_ref() Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 46/49] avcodec/rkmppdec: Use RefStruct API for references to decoder itself Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 47/49] avcodec/rkmppdec: Allocate AVDRMFrameDescriptor and frame ctx jointly Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 48/49] avcodec/v4l2_m2m: Remove redundant av_frame_unref() Andreas Rheinhardt 2023-10-02 18:13 ` [FFmpeg-devel] [PATCH 49/49] avcodec/v4l2_(m2m|buffers): Use RefStruct API for context references Andreas Rheinhardt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=AS8P250MB07447CCC722EE0B75FB643A08FFAA@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git