annotate ffmpeg/libavformat/vc1test.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * VC1 Test Bitstreams Format Demuxer
yading@11 3 * Copyright (c) 2006, 2008 Konstantin Shishkov
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 /**
yading@11 23 * @file
yading@11 24 * VC1 test bitstream file demuxer
yading@11 25 * by Konstantin Shishkov
yading@11 26 * Format specified in SMPTE standard 421 Annex L
yading@11 27 */
yading@11 28
yading@11 29 #include "libavutil/intreadwrite.h"
yading@11 30 #include "avformat.h"
yading@11 31 #include "internal.h"
yading@11 32
yading@11 33 #define VC1_EXTRADATA_SIZE 4
yading@11 34
yading@11 35 static int vc1t_probe(AVProbeData *p)
yading@11 36 {
yading@11 37 if (p->buf_size < 24)
yading@11 38 return 0;
yading@11 39 if (p->buf[3] != 0xC5 || AV_RL32(&p->buf[4]) != 4 || AV_RL32(&p->buf[20]) != 0xC)
yading@11 40 return 0;
yading@11 41
yading@11 42 return AVPROBE_SCORE_MAX/2;
yading@11 43 }
yading@11 44
yading@11 45 static int vc1t_read_header(AVFormatContext *s)
yading@11 46 {
yading@11 47 AVIOContext *pb = s->pb;
yading@11 48 AVStream *st;
yading@11 49 int frames;
yading@11 50 uint32_t fps;
yading@11 51
yading@11 52 frames = avio_rl24(pb);
yading@11 53 if(avio_r8(pb) != 0xC5 || avio_rl32(pb) != 4)
yading@11 54 return -1;
yading@11 55
yading@11 56 /* init video codec */
yading@11 57 st = avformat_new_stream(s, NULL);
yading@11 58 if (!st)
yading@11 59 return -1;
yading@11 60
yading@11 61 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
yading@11 62 st->codec->codec_id = AV_CODEC_ID_WMV3;
yading@11 63
yading@11 64 st->codec->extradata = av_malloc(VC1_EXTRADATA_SIZE);
yading@11 65 st->codec->extradata_size = VC1_EXTRADATA_SIZE;
yading@11 66 avio_read(pb, st->codec->extradata, VC1_EXTRADATA_SIZE);
yading@11 67 st->codec->height = avio_rl32(pb);
yading@11 68 st->codec->width = avio_rl32(pb);
yading@11 69 if(avio_rl32(pb) != 0xC)
yading@11 70 return -1;
yading@11 71 avio_skip(pb, 8);
yading@11 72 fps = avio_rl32(pb);
yading@11 73 if(fps == 0xFFFFFFFF)
yading@11 74 avpriv_set_pts_info(st, 32, 1, 1000);
yading@11 75 else{
yading@11 76 if (!fps) {
yading@11 77 av_log(s, AV_LOG_ERROR, "Zero FPS specified, defaulting to 1 FPS\n");
yading@11 78 fps = 1;
yading@11 79 }
yading@11 80 avpriv_set_pts_info(st, 24, 1, fps);
yading@11 81 st->duration = frames;
yading@11 82 }
yading@11 83
yading@11 84 return 0;
yading@11 85 }
yading@11 86
yading@11 87 static int vc1t_read_packet(AVFormatContext *s,
yading@11 88 AVPacket *pkt)
yading@11 89 {
yading@11 90 AVIOContext *pb = s->pb;
yading@11 91 int frame_size;
yading@11 92 int keyframe = 0;
yading@11 93 uint32_t pts;
yading@11 94
yading@11 95 if(url_feof(pb))
yading@11 96 return AVERROR(EIO);
yading@11 97
yading@11 98 frame_size = avio_rl24(pb);
yading@11 99 if(avio_r8(pb) & 0x80)
yading@11 100 keyframe = 1;
yading@11 101 pts = avio_rl32(pb);
yading@11 102 if(av_get_packet(pb, pkt, frame_size) < 0)
yading@11 103 return AVERROR(EIO);
yading@11 104 if(s->streams[0]->time_base.den == 1000)
yading@11 105 pkt->pts = pts;
yading@11 106 pkt->flags |= keyframe ? AV_PKT_FLAG_KEY : 0;
yading@11 107 pkt->pos -= 8;
yading@11 108
yading@11 109 return pkt->size;
yading@11 110 }
yading@11 111
yading@11 112 AVInputFormat ff_vc1t_demuxer = {
yading@11 113 .name = "vc1test",
yading@11 114 .long_name = NULL_IF_CONFIG_SMALL("VC-1 test bitstream"),
yading@11 115 .read_probe = vc1t_probe,
yading@11 116 .read_header = vc1t_read_header,
yading@11 117 .read_packet = vc1t_read_packet,
yading@11 118 .flags = AVFMT_GENERIC_INDEX,
yading@11 119 };