[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