FFMPEG: Является ли определение контекста для кодека обязательным?

У меня есть код декодера. Я пытаюсь интегрировать его в ffmpeg framework.

Я имею в виду КАК, данное здесь: http://wiki.multimedia.cx/index.php?title=FFmpeg_codec_howto

Согласно этой статье мне нужно определить структуру в моем файле decoder_name.c.

Примерная структура показана ниже:

AVCodec sample_decoder =
{
    .name           = "sample",
    .type           = AVCODEC_TYPE_VIDEO,
    .id             = AVCODEC_ID_SAMPLE,
   // .priv_data_size = sizeof(COOKContext),
    .init           = sample_decode_init,
    .close          = sample_decode_close,
    .decode         = sample_decode_frame,
};

Где,

.name -> specifies the short name of my decoder.

.type -> is used to specify that it is a video decoder.

.id -> is an unique id that i'm assigning to my video decoder.

.init -> is a function pointer to the function in my decoder code that performs decoder related initializations

.decode -> is a function pointer to the function in my decoder code that decodes a single frame, given the input data (elementary stream).

.close -> is a function pointer to the function in my decoder that frees all allocated memory i.e. the memory allocated in init.

Однако я сомневаюсь, что согласно вышеупомянутой статье есть еще одно поле с именем .priv_data_size, которое содержит размер некоторого контекста.

Обязательно ли иметь это поле .priv_data_size, потому что, согласно приведенной выше статье, мне не нужно определять все параметры структуры AVCodec. Кроме того, у меня нет такого контекста для моего декодера.

Однако, когда я просматриваю код других доступных декодеров в libavcodec ffmpeg, я обнаруживаю, что каждый декодер определил это. Будет ли мой декодер работать, если я не укажу это? Я не могу продолжить из-за этого. пожалуйста, предоставьте некоторые рекомендации по переоценке того же самого.

--Заранее спасибо.


person sam    schedule 28.11.2013    source источник


Ответы (1)


Я поддерживаю MultimediaWiki, на которую вы ссылаетесь, и я могу засвидетельствовать, что кодек HOWTO устарел, тем более что FFmpeg всегда развивает свои внутренние интерфейсы. Было бы лучше начать свое путешествие с получения последнего исходного кода FFmpeg и изучения нескольких простейших кодеков, чтобы понять интерфейс (похоже, вы уже делали это).

О priv_data_size: установите ли вы это, полностью зависит от того, заботится ли ваш кодек о сохранении какого-либо состояния между вызовами. Большинство кодеков заботятся об этом и определяют структуру в своем основном исходном файле с именем, например, MyCodecContext. Затем sizeof() эта структура передается как priv_data_size. В примере, который вы разместили, это было sizeof(COOKContext), потому что этот пример явно скопирован из файла кодека RealAudio COOK.

Большинству кодеков необходимо поддерживать какое-либо состояние (например, указатели на предыдущие кадры или различные таблицы). Элемент priv_data_size сообщает основному движку, сколько места нужно выделить для этой структуры, а затем ядро ​​передает эту структуру всем вызовам кодека.

person Multimedia Mike    schedule 28.11.2013
comment
Приятно слышать, что именно вы поддерживаете этот пост. Это действительно помогает таким людям, как я, начать работу с интеграцией кодеков. Прежде всего спасибо за пост и ваш ответ. Во-вторых, если у вас есть похожие посты, укажите ссылки на них в этом разделе. Это будет полезно для всех. Спасибо :) - person sam; 29.11.2013
comment
Вот еще один пост, который я написал в ответ на множество вопросов, связанных с мультимедиа, которые могут представлять интерес: stackoverflow.com/a/9958424/475067 - person Multimedia Mike; 29.11.2013