Technology sharing

Post ffmpeg contextus cod. et cod. invenit, quomodo initializat codicem specificum? Aac initialization processus proxime sequitur

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Cum usura avcodec_find_encoder_by_name ad inveniendum encoder;
const AVCodec * aacencoder = avcodec_find_encoder_by_name("libx264");

Valores encoder sunt:
id AV_CODEC_ID_H264 (27)
long_name libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
nomen libx264
pix_fmts AV_PIX_FMT_YUV420P (0)

typus AVMEDIA_TYPE_VIDEO (0)


2. Post vocatum AVCodecContext *aacencodercontext = avcodec_alloc_context3(aacencoder);
Encoder idem est quod supra, nullas mutationes


Contentum in contextu encoder est:
Codec_id et codec_type in contextu encoder valores habent, et alii eorum defectui repositi sunt.
codec_id AV_CODEC_ID_H264 (27)
codec_type AVMEDIA_TYPE_VIDEO (0)
Valores default tales sunt:

s->time_base = (AVRational){0,1};
s->framerate = (AVRational){ 0, 1 };
s->pkt_timebase = (AVRational){ 0, 1 };


3. Cum methodus avcodec_open2(encoderAVCodecContext, encoderAVCodec, NULL) appellatur, plures parametri statuentur.

Possumus fingere encoder sumendo esse AAC, qui parametri ponentur?
Prima est quot specimen tabulae avframe habet.

3.1 Committitur cum avcodec_find_encoder vel avcodec_find_decoder in initio.
Modus est in tabella D: Ctoolyinshipinffmpeg-6.0sourcelibavcodecallcodecs.c.


const AVCodec * avcodec_find_encoder(enum AVCodecID id)
{
return find_codec(id, av_codec_is_encoder);
}

const AVCodec * avcodec_find_decoder(enum AVCodecID id)
{
return find_codec(id, av_codec_is_decoder);
}


3.2 Media methodi methodi inveniendi av_codec_iterate est methodus

static const AVCodec *find_codec(enum AVCodecID id, int (*x)(const AVCodec*))
{
const AVCodec *p, *experimental = NULL;
void *i=0;

id = remap_deprecated_codec_id(id);

dum ((p = av_codec_iterate(&i))){
si (! x(p))
pergere;
sin (p-> id == id) {
si facultatum & AV_CODEC_CAP_EXPERIMENTAL && !experimental) {
experimentum = p;
} aliud
remittere p;
        }
    }

experimentum reddidit;
}

3.3 Methodus av_codec_iterata reapse respondentem codicem e codice c_list invenit.
const AVCodec *av_codec_iterate(inanis **opacum)
{
uintptr_t i = (uintptr_t)*opaque;
const FFCodec *c = codec_list[i];

ff_thread_once(&av_codec_static_init, av_codec_init_static);

si (c) {
*opaque = (void*)(i + 1);
return &c->p;
    }
NULL redire;
}


Videre possumus plures esse aacs cum codicec_list respondentes, et ff_aac_encoder ad illustrandum utimur.
Codicem quaesito inveni definitionem ff_aac_encoder esse in aacenc.c, quod continet.


Sequentia indicia videri possunt ex D: Ctoolyinshipinffmpeg-6.0sourcelibavcodecaacenc.c.
Field.init = aac_encode_init, munus esse debet;
Ut videre potes ex functione aac_encode_init, frame_size est 1024
avctx->frame_size = 1024;


const FFCodec ff_aac_encoder = {
.p.name = "aac",
CODEX_LONG_NAME ("AAC (Provectus Audio Coding)"),
.p.type = AVMEDIA_TYPE_AUDIO,
.p.id = AV_CODEC_ID_AAC,
.p.capaces = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_SMALL_LAST_FRAME,
.priv_data_size = sizeof(AACEncContext);
.init = aac_encode_init,
FF_CODEC_ENCODE_CB(aac_encode_frame);
.close = aac_encode_end,
.defaults = aac_encode_defaults,
.p.supported_samplerates = ff_mpeg4audio_sample_rates,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
.p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE },
.p.priv_class = & aacenc_class,
};

Hic, adhuc quaestio est: quando initialized ff_aac_encoder?
Revera, ret = avcodec_open2(avcodecContext,nullptr, nullptr);
Core in codice est

if (codec2->init) {
        
Nam, vocabitur;
static av_cold int aac_encode_init(AVCodecContext *avctx)