]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavformat/vc1test.c
frsh: Export information about the last RTP contract and VRES
[frescor/ffmpeg.git] / libavformat / vc1test.c
1 /*
2  * VC1 Test Bitstreams Format Demuxer
3  * Copyright (c) 2006, 2008 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file libavformat/vc1test.c
24  * VC1 test bitstream file demuxer
25  * by Konstantin Shishkov
26  * Format specified in SMPTE standard 421 Annex L
27  */
28
29 #include "libavutil/intreadwrite.h"
30 #include "avformat.h"
31
32 #define VC1_EXTRADATA_SIZE 4
33
34 static int vc1t_probe(AVProbeData *p)
35 {
36     if (p->buf[3] != 0xC5 && AV_RL32(&p->buf[4]) != 4)
37         return 0;
38
39     return AVPROBE_SCORE_MAX/2;
40 }
41
42 static int vc1t_read_header(AVFormatContext *s,
43                            AVFormatParameters *ap)
44 {
45     ByteIOContext *pb = s->pb;
46     AVStream *st;
47     int fps, frames;
48
49     frames = get_le24(pb);
50     if(get_byte(pb) != 0xC5 || get_le32(pb) != 4)
51         return -1;
52
53     /* init video codec */
54     st = av_new_stream(s, 0);
55     if (!st)
56         return -1;
57
58     st->codec->codec_type = CODEC_TYPE_VIDEO;
59     st->codec->codec_id = CODEC_ID_WMV3;
60
61     st->codec->extradata = av_malloc(VC1_EXTRADATA_SIZE);
62     st->codec->extradata_size = VC1_EXTRADATA_SIZE;
63     get_buffer(pb, st->codec->extradata, VC1_EXTRADATA_SIZE);
64     st->codec->height = get_le32(pb);
65     st->codec->width = get_le32(pb);
66     if(get_le32(pb) != 0xC)
67         return -1;
68     url_fskip(pb, 8);
69     fps = get_le32(pb);
70     if(fps == -1)
71         av_set_pts_info(st, 32, 1, 1000);
72     else{
73         av_set_pts_info(st, 24, 1, fps);
74         st->duration = frames;
75     }
76
77     return 0;
78 }
79
80 static int vc1t_read_packet(AVFormatContext *s,
81                            AVPacket *pkt)
82 {
83     ByteIOContext *pb = s->pb;
84     int frame_size;
85     int keyframe = 0;
86     uint32_t pts;
87
88     if(url_feof(pb))
89         return AVERROR(EIO);
90
91     frame_size = get_le24(pb);
92     if(get_byte(pb) & 0x80)
93         keyframe = 1;
94     pts = get_le32(pb);
95     if(av_get_packet(pb, pkt, frame_size) < 0)
96         return AVERROR(EIO);
97     if(s->streams[0]->time_base.den == 1000)
98         pkt->pts = pts;
99     pkt->flags |= keyframe ? PKT_FLAG_KEY : 0;
100     pkt->pos -= 8;
101
102     return pkt->size;
103 }
104
105 AVInputFormat vc1t_demuxer = {
106     "vc1test",
107     NULL_IF_CONFIG_SMALL("VC-1 test bitstream format"),
108     0,
109     vc1t_probe,
110     vc1t_read_header,
111     vc1t_read_packet,
112     .flags = AVFMT_GENERIC_INDEX,
113 };