[FFmpeg-devel] [PATCH 2/3] Add muxer/demuxer for raw codec2 and .c2 files

Michael Niedermayer michael at niedermayer.cc
Fri Jan 12 22:21:39 EET 2018


On Sat, Dec 23, 2017 at 11:15:35PM +0100, Tomas Härdin wrote:
> 

[...]
> +static int codec2_read_header_common(AVFormatContext *s, AVStream *st)
> +{
> +    int mode = avpriv_codec2_mode_from_extradata(st->codecpar->extradata);
> +
> +    st->codecpar->codec_type        = AVMEDIA_TYPE_AUDIO;
> +    st->codecpar->codec_id          = AV_CODEC_ID_CODEC2;
> +    st->codecpar->sample_rate       = 8000;
> +    st->codecpar->channels          = 1;
> +    st->codecpar->format            = AV_SAMPLE_FMT_S16;
> +    st->codecpar->channel_layout    = AV_CH_LAYOUT_MONO;
> +    st->codecpar->bit_rate          = avpriv_codec2_mode_bit_rate(s, mode);
> +    st->codecpar->frame_size        = avpriv_codec2_mode_frame_size(s, mode);
> +    st->codecpar->block_align       = avpriv_codec2_mode_block_align(s, mode);
> +

> +    if (st->codecpar->bit_rate <= 0 ||
> +        st->codecpar->frame_size <= 0 ||
> +        st->codecpar->block_align <= 0) {
> +        return AVERROR(EINVAL);
> +    }

This should be AVERROR_INVALIDDATA i think


> +
> +    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
> +
> +    //replicating estimate_timings_from_bit_rate() in utils.c to avoid warnings
> +    if (s->pb && st->codecpar->bit_rate > 0) {
> +        int64_t filesize = avio_size(s->pb);
> +        if (filesize > s->internal->data_offset) {
> +            filesize -= s->internal->data_offset;
> +            st->duration = av_rescale(8 * filesize,
> +                                      st->time_base.den,
> +                                      st->codecpar->bit_rate * (int64_t) st->time_base.num);
> +        }
> +    }

Is this exact ?
or is a calculation from frame_size / block_align more accurate ?
the most accurate one should be used


> +
> +    return 0;
> +}
> +
> +static int codec2_read_header(AVFormatContext *s)
> +{
> +    AVStream *st = avformat_new_stream(s, NULL);
> +    int ret, version;
> +    uint8_t magic[3];
> +
> +    if (!st) {
> +        return AVERROR(ENOMEM);
> +    }
> +

> +    avio_read(s->pb, magic, 3);
> +    if (check_magic(magic)) {
> +        av_log(s, AV_LOG_ERROR, "not a .c2 file\n");
> +        return AVERROR_INVALIDDATA;
> +    }
> +
> +    ret = ff_alloc_extradata(st->codecpar, AVPRIV_CODEC2_EXTRADATA_SIZE);
> +    if (ret) {
> +        return ret;
> +    }
> +
> +    avio_read(s->pb, st->codecpar->extradata, AVPRIV_CODEC2_EXTRADATA_SIZE);

The return codes from avio_read and not checked

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180112/ce484c66/attachment.sig>


More information about the ffmpeg-devel mailing list