From eda178d273cd2558fd727e98c503dfa726621d6c Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Tue, 29 Jan 2008 09:25:49 +0000 Subject: [PATCH] SMPTE 421 Annex L format demuxer Originally committed as revision 11661 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/avformat.h | 4 +- libavformat/vc1test.c | 112 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 libavformat/vc1test.c diff --git a/libavformat/Makefile b/libavformat/Makefile index 2224ba0c27..9172c1b4d9 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -162,6 +162,7 @@ OBJS-$(CONFIG_TIERTEXSEQ_DEMUXER) += tiertexseq.o OBJS-$(CONFIG_TTA_DEMUXER) += tta.o OBJS-$(CONFIG_TXD_DEMUXER) += txd.o OBJS-$(CONFIG_VC1_DEMUXER) += raw.o +OBJS-$(CONFIG_VC1T_DEMUXER) += vc1test.o OBJS-$(CONFIG_VMD_DEMUXER) += sierravmd.o OBJS-$(CONFIG_VOC_DEMUXER) += vocdec.o voc.o OBJS-$(CONFIG_VOC_MUXER) += vocenc.o voc.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 5fdf3a03eb..be27055801 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -156,6 +156,7 @@ void av_register_all(void) REGISTER_DEMUXER (TTA, tta); REGISTER_DEMUXER (TXD, txd); REGISTER_DEMUXER (VC1, vc1); + REGISTER_DEMUXER (VC1T, vc1t); REGISTER_DEMUXER (VMD, vmd); REGISTER_MUXDEMUX (VOC, voc); REGISTER_MUXDEMUX (WAV, wav); diff --git a/libavformat/avformat.h b/libavformat/avformat.h index ddebb7714e..b28014895c 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -21,8 +21,8 @@ #ifndef FFMPEG_AVFORMAT_H #define FFMPEG_AVFORMAT_H -#define LIBAVFORMAT_VERSION_INT ((52<<16)+(6<<8)+0) -#define LIBAVFORMAT_VERSION 52.6.0 +#define LIBAVFORMAT_VERSION_INT ((52<<16)+(7<<8)+0) +#define LIBAVFORMAT_VERSION 52.7.0 #define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) diff --git a/libavformat/vc1test.c b/libavformat/vc1test.c new file mode 100644 index 0000000000..c8340179cf --- /dev/null +++ b/libavformat/vc1test.c @@ -0,0 +1,112 @@ +/* + * VC1 Test Bitstreams Format Demuxer + * Copyright (c) 2006, 2008 Konstantin Shishkov + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file vc1test.c + * VC1 test bitstream file demuxer + * by Konstantin Shishkov + * Format specified in SMPTE standard 421 Annex L + */ + +#include "avformat.h" + +#define VC1_EXTRADATA_SIZE 4 + +static int vc1t_probe(AVProbeData *p) +{ + if (p->buf[3] != 0xC5 && AV_RL32(&p->buf[4]) != 4) + return 0; + + return AVPROBE_SCORE_MAX; +} + +static int vc1t_read_header(AVFormatContext *s, + AVFormatParameters *ap) +{ + ByteIOContext *pb = s->pb; + AVStream *st; + int fps, frames; + + frames = get_le24(pb); + if(get_byte(pb) != 0xC5 || get_le32(pb) != 4) + return -1; + + /* init video codec */ + st = av_new_stream(s, 0); + if (!st) + return -1; + + st->codec->codec_type = CODEC_TYPE_VIDEO; + st->codec->codec_id = CODEC_ID_WMV3; + + st->codec->extradata = av_malloc(VC1_EXTRADATA_SIZE); + st->codec->extradata_size = VC1_EXTRADATA_SIZE; + get_buffer(pb, st->codec->extradata, VC1_EXTRADATA_SIZE); + st->codec->height = get_le32(pb); + st->codec->width = get_le32(pb); + if(get_le32(pb) != 0xC) + return -1; + url_fskip(pb, 8); + fps = get_le32(pb); + if(fps == -1) + av_set_pts_info(st, 32, 1, 1000); + else{ + av_set_pts_info(st, 24, 1, fps); + st->duration = frames; + } + + return 0; +} + +static int vc1t_read_packet(AVFormatContext *s, + AVPacket *pkt) +{ + ByteIOContext *pb = s->pb; + int frame_size; + int keyframe = 0; + uint32_t pts; + + if(url_feof(pb)) + return AVERROR(EIO); + + frame_size = get_le24(pb); + if(get_byte(pb) & 0x80) + keyframe = 1; + pts = get_le32(pb); + if(av_get_packet(pb, pkt, frame_size) < 0) + return AVERROR(EIO); + if(s->streams[0]->time_base.den == 1000) + pkt->pts = pts; + pkt->flags |= keyframe ? PKT_FLAG_KEY : 0; + pkt->pos -= 8; + + return pkt->size; +} + +AVInputFormat vc1t_demuxer = { + "vc1test", + "VC1 test bitstream format", + 0, + vc1t_probe, + vc1t_read_header, + vc1t_read_packet, + .flags = AVFMT_GENERIC_INDEX, +};