Pass AVCodecContext to packet sinks

Create the codec context from the demuxer, so that it can fill context
data for the decoder and recorder.
This commit is contained in:
Romain Vimont
2023-03-10 19:25:45 +01:00
parent 4db50ddbb7
commit 4bdf632dfa
9 changed files with 52 additions and 60 deletions

View File

@@ -7,8 +7,6 @@
#include <stdbool.h>
#include <libavcodec/avcodec.h>
typedef struct AVFrame AVFrame;
/**
* Frame sink trait.
*
@@ -19,6 +17,7 @@ struct sc_frame_sink {
};
struct sc_frame_sink_ops {
/* The codec context is valid until the sink is closed */
bool (*open)(struct sc_frame_sink *sink, const AVCodecContext *ctx);
void (*close)(struct sc_frame_sink *sink);
bool (*push)(struct sc_frame_sink *sink, const AVFrame *frame);

View File

@@ -5,9 +5,7 @@
#include <assert.h>
#include <stdbool.h>
typedef struct AVCodec AVCodec;
typedef struct AVPacket AVPacket;
#include <libavcodec/avcodec.h>
/**
* Packet sink trait.
@@ -19,8 +17,8 @@ struct sc_packet_sink {
};
struct sc_packet_sink_ops {
/* The codec instance is static, it is valid until the end of the program */
bool (*open)(struct sc_packet_sink *sink, const AVCodec *codec);
/* The codec context is valid until the sink is closed */
bool (*open)(struct sc_packet_sink *sink, AVCodecContext *ctx);
void (*close)(struct sc_packet_sink *sink);
bool (*push)(struct sc_packet_sink *sink, const AVPacket *packet);

View File

@@ -25,11 +25,11 @@ sc_packet_source_sinks_close_firsts(struct sc_packet_source *source,
bool
sc_packet_source_sinks_open(struct sc_packet_source *source,
const AVCodec *codec) {
AVCodecContext *ctx) {
assert(source->sink_count);
for (unsigned i = 0; i < source->sink_count; ++i) {
struct sc_packet_sink *sink = source->sinks[i];
if (!sink->ops->open(sink, codec)) {
if (!sink->ops->open(sink, ctx)) {
sc_packet_source_sinks_close_firsts(source, i);
return false;
}

View File

@@ -26,7 +26,7 @@ sc_packet_source_add_sink(struct sc_packet_source *source,
bool
sc_packet_source_sinks_open(struct sc_packet_source *source,
const AVCodec *codec);
AVCodecContext *ctx);
void
sc_packet_source_sinks_close(struct sc_packet_source *source);