Statistics
| Branch: | Revision:

ffmpeg / libavformat / vc1test.c @ d7fb5a18

History | View | Annotate | Download (2.86 KB)

1 eda178d2 Kostya Shishkov
/*
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 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 "avformat.h"
30
31
#define VC1_EXTRADATA_SIZE 4
32
33
static int vc1t_probe(AVProbeData *p)
34
{
35
    if (p->buf[3] != 0xC5 && AV_RL32(&p->buf[4]) != 4)
36
        return 0;
37
38 a8f0c9c5 Michael Niedermayer
    return AVPROBE_SCORE_MAX/2;
39 eda178d2 Kostya Shishkov
}
40
41
static int vc1t_read_header(AVFormatContext *s,
42
                           AVFormatParameters *ap)
43
{
44
    ByteIOContext *pb = s->pb;
45
    AVStream *st;
46
    int fps, frames;
47
48
    frames = get_le24(pb);
49
    if(get_byte(pb) != 0xC5 || get_le32(pb) != 4)
50
        return -1;
51
52
    /* init video codec */
53
    st = av_new_stream(s, 0);
54
    if (!st)
55
        return -1;
56
57
    st->codec->codec_type = CODEC_TYPE_VIDEO;
58
    st->codec->codec_id = CODEC_ID_WMV3;
59
60
    st->codec->extradata = av_malloc(VC1_EXTRADATA_SIZE);
61
    st->codec->extradata_size = VC1_EXTRADATA_SIZE;
62
    get_buffer(pb, st->codec->extradata, VC1_EXTRADATA_SIZE);
63
    st->codec->height = get_le32(pb);
64
    st->codec->width = get_le32(pb);
65
    if(get_le32(pb) != 0xC)
66
        return -1;
67
    url_fskip(pb, 8);
68
    fps = get_le32(pb);
69
    if(fps == -1)
70
        av_set_pts_info(st, 32, 1, 1000);
71
    else{
72
        av_set_pts_info(st, 24, 1, fps);
73
        st->duration = frames;
74
    }
75
76
    return 0;
77
}
78
79
static int vc1t_read_packet(AVFormatContext *s,
80
                           AVPacket *pkt)
81
{
82
    ByteIOContext *pb = s->pb;
83
    int frame_size;
84
    int keyframe = 0;
85
    uint32_t pts;
86
87
    if(url_feof(pb))
88
        return AVERROR(EIO);
89
90
    frame_size = get_le24(pb);
91
    if(get_byte(pb) & 0x80)
92
        keyframe = 1;
93
    pts = get_le32(pb);
94
    if(av_get_packet(pb, pkt, frame_size) < 0)
95
        return AVERROR(EIO);
96
    if(s->streams[0]->time_base.den == 1000)
97
        pkt->pts = pts;
98
    pkt->flags |= keyframe ? PKT_FLAG_KEY : 0;
99
    pkt->pos -= 8;
100
101
    return pkt->size;
102
}
103
104
AVInputFormat vc1t_demuxer = {
105
    "vc1test",
106 bde15e74 Stefano Sabatini
    NULL_IF_CONFIG_SMALL("VC-1 test bitstream format"),
107 eda178d2 Kostya Shishkov
    0,
108
    vc1t_probe,
109
    vc1t_read_header,
110
    vc1t_read_packet,
111
    .flags = AVFMT_GENERIC_INDEX,
112
};