[FFmpeg-devel] [PATCH] avformat: add vividas demuxer
Michael Niedermayer
michael at niedermayer.cc
Tue Dec 11 04:05:53 EET 2018
On Mon, Dec 10, 2018 at 01:05:05PM +0100, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
> libavformat/Makefile | 1 +
> libavformat/allformats.c | 1 +
> libavformat/vividas.c | 708 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 710 insertions(+)
> create mode 100644 libavformat/vividas.c
[...]
> +}
> +
> +static int viv_read_packet(AVFormatContext *s,
> + AVPacket *pkt)
> +{
> + VividasDemuxContext *viv = s->priv_data;
> + AVIOContext *pb;
> + int64_t off;
> +
> + if (avio_feof(viv->sb_pb))
> + return AVERROR_EOF;
> +
> + if (viv->current_audio_subpacket < viv->n_audio_subpackets) {
> + AVStream *astream;
> + int size = viv->audio_subpackets[viv->current_audio_subpacket+1].start - viv->audio_subpackets[viv->current_audio_subpacket].start;
> + pb = viv->sb_pb;
> + av_get_packet(pb, pkt, size);
missing failure check
> + pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
> +
> + pkt->stream_index = 1;
> + astream = s->streams[pkt->stream_index];
> +
> + pkt->pts = av_rescale(viv->audio_sample, astream->time_base.den, astream->time_base.num) / astream->codecpar->sample_rate;
> + viv->audio_sample += viv->audio_subpackets[viv->current_audio_subpacket].pcm_bytes / 2 / astream->codecpar->channels;
> + pkt->flags |= AV_PKT_FLAG_KEY;
> + viv->current_audio_subpacket++;
> + return 0;
> + }
> +
> + if (viv->current_sb_entry >= viv->n_sb_entries) {
> + if (viv->current_sb+1 >= viv->n_sb_blocks)
> + return AVERROR(EIO);
> + viv->current_sb++;
> +
> + load_sb_block(s, viv, 0);
> + viv->current_sb_entry = 0;
> + }
> +
> + pb = viv->sb_pb;
> + off = avio_tell(pb);
> + off += viv->sb_entries[viv->current_sb_entry].size;
> +
> + if (viv->sb_entries[viv->current_sb_entry].flag == 0) {
> + int i, v_size = ffio_read_varlen(pb);
> + ffio_read_varlen(pb);
> + av_get_packet(pb, pkt, v_size);
missing failure check
> + pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
> +
> + pkt->pts = viv->sb_blocks[viv->current_sb].packet_offset + viv->current_sb_entry;
> + pkt->flags |= (pkt->data[0]&0x80)?0:AV_PKT_FLAG_KEY;
> + pkt->stream_index = 0;
> +
> + for (i = 0; i < MAX_AUDIO_SUBPACKETS - 1; i++) {
> + int start, pcm_bytes;
> + start = ffio_read_varlen(pb);
> + pcm_bytes = ffio_read_varlen(pb);
> +
> + if (i > 0 && start == 0)
> + break;
> +
> + viv->n_audio_subpackets = i+1;
> + viv->audio_subpackets[i].start = start;
> + viv->audio_subpackets[i].pcm_bytes = pcm_bytes;
> + }
> + viv->audio_subpackets[viv->n_audio_subpackets].start = (int)(off - avio_tell(pb));
> + viv->current_audio_subpacket = 0;
> + //viv->n_audio_subpackets = 0;
> + //avio_seek(pb, off, SEEK_SET);
is that intended to be here ?
> +
> + } else {
> + int v_size = ffio_read_varlen(pb);
> + av_get_packet(pb, pkt, v_size);
missing error check
[...]
> +static int viv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
> +{
> + VividasDemuxContext *viv = s->priv_data;
> + int frame = 0;
> + int i;
> +
> + if (stream_index == 0)
> + frame = (int)timestamp;
> + else
> + frame = (int)timestamp * s->streams[stream_index]->time_base.den * s->streams[0]->time_base.num / s->streams[stream_index]->time_base.num / s->streams[0]->time_base.den;
timestamp is truncated which would lead to incorrect results if a timestamp
outside the int range is used
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
You can kill me, but you cannot change the truth.
-------------- 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/20181211/bcaac547/attachment.sig>
More information about the ffmpeg-devel
mailing list