1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

fftools/ffmpeg_dec: add decoder private data

Move InputStream.decoded_frame to it.

Analogous to what has been previously done for all the other major
components.
This commit is contained in:
Anton Khirnov
2023-05-18 05:39:39 +02:00
parent 335688a3d3
commit dadeb28e25
3 changed files with 51 additions and 7 deletions

View File

@@ -324,6 +324,8 @@ typedef struct FilterGraph {
int nb_outputs; int nb_outputs;
} FilterGraph; } FilterGraph;
typedef struct Decoder Decoder;
typedef struct InputStream { typedef struct InputStream {
const AVClass *class; const AVClass *class;
@@ -343,10 +345,10 @@ typedef struct InputStream {
* concurrently by the demuxing thread. * concurrently by the demuxing thread.
*/ */
AVCodecParameters *par; AVCodecParameters *par;
Decoder *decoder;
AVCodecContext *dec_ctx; AVCodecContext *dec_ctx;
const AVCodec *dec; const AVCodec *dec;
const AVCodecDescriptor *codec_desc; const AVCodecDescriptor *codec_desc;
AVFrame *decoded_frame;
AVPacket *pkt; AVPacket *pkt;
AVRational framerate_guessed; AVRational framerate_guessed;
@@ -812,6 +814,7 @@ AVBufferRef *hw_device_for_filter(void);
int hwaccel_decode_init(AVCodecContext *avctx); int hwaccel_decode_init(AVCodecContext *avctx);
int dec_open(InputStream *ist); int dec_open(InputStream *ist);
void dec_free(Decoder **pdec);
/** /**
* Submit a packet for decoding * Submit a packet for decoding

View File

@@ -31,6 +31,45 @@
#include "ffmpeg.h" #include "ffmpeg.h"
struct Decoder {
AVFrame *frame;
};
void dec_free(Decoder **pdec)
{
Decoder *dec = *pdec;
if (!dec)
return;
av_frame_free(&dec->frame);
av_freep(pdec);
}
static int dec_alloc(Decoder **pdec)
{
Decoder *dec;
*pdec = NULL;
dec = av_mallocz(sizeof(*dec));
if (!dec)
return AVERROR(ENOMEM);
dec->frame = av_frame_alloc();
if (!dec->frame)
goto fail;
*pdec = dec;
return 0;
fail:
dec_free(&dec);
return AVERROR(ENOMEM);
}
static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame) static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame)
{ {
int i, ret; int i, ret;
@@ -373,6 +412,7 @@ static int send_filter_eof(InputStream *ist)
int dec_packet(InputStream *ist, const AVPacket *pkt, int no_eof) int dec_packet(InputStream *ist, const AVPacket *pkt, int no_eof)
{ {
Decoder *d = ist->decoder;
AVCodecContext *dec = ist->dec_ctx; AVCodecContext *dec = ist->dec_ctx;
const char *type_desc = av_get_media_type_string(dec->codec_type); const char *type_desc = av_get_media_type_string(dec->codec_type);
int ret; int ret;
@@ -407,7 +447,7 @@ int dec_packet(InputStream *ist, const AVPacket *pkt, int no_eof)
} }
while (1) { while (1) {
AVFrame *frame = ist->decoded_frame; AVFrame *frame = d->frame;
update_benchmark(NULL); update_benchmark(NULL);
ret = avcodec_receive_frame(dec, frame); ret = avcodec_receive_frame(dec, frame);
@@ -690,6 +730,10 @@ int dec_open(InputStream *ist)
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
ret = dec_alloc(&ist->decoder);
if (ret < 0)
return ret;
ist->dec_ctx->opaque = ist; ist->dec_ctx->opaque = ist;
ist->dec_ctx->get_format = get_format; ist->dec_ctx->get_format = get_format;

View File

@@ -815,7 +815,8 @@ static void ist_free(InputStream **pist)
if (!ist) if (!ist)
return; return;
av_frame_free(&ist->decoded_frame); dec_free(&ist->decoder);
av_packet_free(&ist->pkt); av_packet_free(&ist->pkt);
av_dict_free(&ist->decoder_opts); av_dict_free(&ist->decoder_opts);
avsubtitle_free(&ist->prev_sub.subtitle); avsubtitle_free(&ist->prev_sub.subtitle);
@@ -1196,10 +1197,6 @@ static void add_input_streams(const OptionsContext *o, Demuxer *d)
exit_program(1); exit_program(1);
} }
ist->decoded_frame = av_frame_alloc();
if (!ist->decoded_frame)
report_and_exit(AVERROR(ENOMEM));
ist->pkt = av_packet_alloc(); ist->pkt = av_packet_alloc();
if (!ist->pkt) if (!ist->pkt)
report_and_exit(AVERROR(ENOMEM)); report_and_exit(AVERROR(ENOMEM));