mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-01-04 13:20:01 +01:00
avcodec/internal: Allow receive_frame codecs to use decode_simple pkt
Decoders implementing the receive_frame API currently mostly use stack packets to temporarily hold the packet they receive from ff_decode_get_packet(). This role directly parallels the role of in_pkt, the spare packet used in decode_simple_internal for the decoders implementing the traditional decoding API. Said packet is unused by the generic code for the decoders implementing the receive_frame API, so allow them to use it to fulfill the function it already fulfills for the traditional API for both APIs. There is only one caveat in this: The packet is automatically unreferenced in avcodec_flush_buffers(). But this is actually positive as it means the decoders don't have to do this themselves (in case the packet is preserved between receive_frame calls). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -181,11 +181,11 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
|
||||
avci->buffer_frame = av_frame_alloc();
|
||||
avci->buffer_pkt = av_packet_alloc();
|
||||
avci->es.in_frame = av_frame_alloc();
|
||||
avci->ds.in_pkt = av_packet_alloc();
|
||||
avci->in_pkt = av_packet_alloc();
|
||||
avci->last_pkt_props = av_packet_alloc();
|
||||
avci->pkt_props = av_fifo_alloc(sizeof(*avci->last_pkt_props));
|
||||
if (!avci->buffer_frame || !avci->buffer_pkt ||
|
||||
!avci->es.in_frame || !avci->ds.in_pkt ||
|
||||
!avci->es.in_frame || !avci->in_pkt ||
|
||||
!avci->last_pkt_props || !avci->pkt_props) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto free_and_end;
|
||||
@@ -408,7 +408,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
|
||||
av_fifo_reset(avci->pkt_props);
|
||||
|
||||
av_frame_unref(avci->es.in_frame);
|
||||
av_packet_unref(avci->ds.in_pkt);
|
||||
av_packet_unref(avci->in_pkt);
|
||||
|
||||
if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
|
||||
ff_thread_flush(avctx);
|
||||
@@ -473,7 +473,7 @@ av_cold int avcodec_close(AVCodecContext *avctx)
|
||||
}
|
||||
av_packet_free(&avci->last_pkt_props);
|
||||
|
||||
av_packet_free(&avci->ds.in_pkt);
|
||||
av_packet_free(&avci->in_pkt);
|
||||
av_frame_free(&avci->es.in_frame);
|
||||
|
||||
av_buffer_unref(&avci->pool);
|
||||
|
||||
Reference in New Issue
Block a user