[FFmpeg-devel] [PATCH] avformat/aiffenc: add aiff_init()
James Almer
jamrial at gmail.com
Sat Jun 17 17:35:57 EEST 2017
On 6/17/2017 6:43 AM, Paul B Mahol wrote:
> On 5/28/17, James Almer <jamrial at gmail.com> wrote:
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> libavformat/aiffenc.c | 45 +++++++++++++++++++++++++++++----------------
>> 1 file changed, 29 insertions(+), 16 deletions(-)
>>
>> diff --git a/libavformat/aiffenc.c b/libavformat/aiffenc.c
>> index fcadf149a0..1e0c5b11a0 100644
>> --- a/libavformat/aiffenc.c
>> +++ b/libavformat/aiffenc.c
>> @@ -98,13 +98,11 @@ static void put_meta(AVFormatContext *s, const char
>> *key, uint32_t id)
>> }
>> }
>>
>> -static int aiff_write_header(AVFormatContext *s)
>> +static int aiff_init(AVFormatContext *s)
>> {
>> AIFFOutputContext *aiff = s->priv_data;
>> - AVIOContext *pb = s->pb;
>> AVCodecParameters *par;
>> - uint64_t sample_rate;
>> - int i, aifc = 0;
>> + int i;
>>
>> aiff->audio_stream_idx = -1;
>> for (i = 0; i < s->nb_streams; i++) {
>> @@ -126,6 +124,32 @@ static int aiff_write_header(AVFormatContext *s)
>> /* First verify if format is ok */
>> if (!par->codec_tag)
>> return -1;
>> +
>> + if (!par->bits_per_coded_sample)
>> + par->bits_per_coded_sample = av_get_bits_per_sample(par->codec_id);
>> + if (!par->bits_per_coded_sample) {
>> + av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
>> + return -1;
>> + }
>> + if (!par->block_align)
>> + par->block_align = (par->bits_per_coded_sample * par->channels) >>
>> 3;
>> +
>> + avpriv_set_pts_info(s->streams[aiff->audio_stream_idx], 64, 1,
>> +
>> s->streams[aiff->audio_stream_idx]->codecpar->sample_rate);
>> +
>> + return 0;
>> +}
>> +
>> +static int aiff_write_header(AVFormatContext *s)
>> +{
>> + AIFFOutputContext *aiff = s->priv_data;
>> + AVIOContext *pb = s->pb;
>> + AVCodecParameters *par;
>> + uint64_t sample_rate;
>> + int aifc = 0;
>> +
>> + par = s->streams[aiff->audio_stream_idx]->codecpar;
>> +
>> if (par->codec_tag != MKTAG('N','O','N','E'))
>> aifc = 1;
>>
>> @@ -165,15 +189,6 @@ static int aiff_write_header(AVFormatContext *s)
>> aiff->frames = avio_tell(pb);
>> avio_wb32(pb, 0); /* Number of frames */
>>
>> - if (!par->bits_per_coded_sample)
>> - par->bits_per_coded_sample = av_get_bits_per_sample(par->codec_id);
>> - if (!par->bits_per_coded_sample) {
>> - av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
>> - return -1;
>> - }
>> - if (!par->block_align)
>> - par->block_align = (par->bits_per_coded_sample * par->channels) >>
>> 3;
>> -
>> avio_wb16(pb, par->bits_per_coded_sample); /* Sample size */
>>
>> sample_rate = av_double2int(par->sample_rate);
>> @@ -199,9 +214,6 @@ static int aiff_write_header(AVFormatContext *s)
>> avio_wb32(pb, 0); /* Data offset */
>> avio_wb32(pb, 0); /* Block-size (block align) */
>>
>> - avpriv_set_pts_info(s->streams[aiff->audio_stream_idx], 64, 1,
>> -
>> s->streams[aiff->audio_stream_idx]->codecpar->sample_rate);
>> -
>> /* Data is starting here */
>> avio_flush(pb);
>>
>> @@ -327,6 +339,7 @@ AVOutputFormat ff_aiff_muxer = {
>> .priv_data_size = sizeof(AIFFOutputContext),
>> .audio_codec = AV_CODEC_ID_PCM_S16BE,
>> .video_codec = AV_CODEC_ID_PNG,
>> + .init = aiff_init,
>> .write_header = aiff_write_header,
>> .write_packet = aiff_write_packet,
>> .write_trailer = aiff_write_trailer,
>> --
>> 2.12.1
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>
> Could you explain in detail what this patch does?
This, as well as the previous patch and every other patch that i haven't
yet sent, adds the missing init() function to the muxers so that
initialization is complete without the need to call write_header().
In this specific case, this is achieved by calling
avpriv_set_pts_info(), setting missing AVCodecParameters values and
doing some basic checks in init() instead of in write_header().
With this, calls to avformat_init_output() will return 1 (init complete)
rather than 0 (write_header needed) on most if not all muxers.
The idea is that, eventually, avformat_init_output() will become more
useful and used in ffmpeg.c rather than having it implicitly called from
within avformat_write_header(), to potentially simplify the code in that
file.
Is it useful and will help ffmpeg.c? I don't know, but it's worth a try.
Besides, it's proper to fully initialize the muxer in AVFormat.init()
when possible.
More information about the ffmpeg-devel
mailing list