FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
bmv.c
Go to the documentation of this file.
1
/*
2
* Discworld II BMV demuxer
3
* Copyright (c) 2011 Konstantin Shishkov.
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/channel_layout.h
"
23
#include "
avformat.h
"
24
#include "
internal.h
"
25
26
enum
BMVFlags
{
27
BMV_NOP
= 0,
28
BMV_END
,
29
BMV_DELTA
,
30
BMV_INTRA
,
31
32
BMV_AUDIO
= 0x20,
33
};
34
35
typedef
struct
BMVContext
{
36
uint8_t
*
packet
;
37
int
size
;
38
int
get_next
;
39
int64_t
audio_pos
;
40
}
BMVContext
;
41
42
static
int
bmv_read_header
(
AVFormatContext
*
s
)
43
{
44
AVStream
*st, *ast;
45
BMVContext
*
c
= s->
priv_data
;
46
47
st =
avformat_new_stream
(s, 0);
48
if
(!st)
49
return
AVERROR
(ENOMEM);
50
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
51
st->
codec
->
codec_id
=
AV_CODEC_ID_BMV_VIDEO
;
52
st->
codec
->
width
= 640;
53
st->
codec
->
height
= 429;
54
st->
codec
->
pix_fmt
=
AV_PIX_FMT_PAL8
;
55
avpriv_set_pts_info
(st, 16, 1, 12);
56
ast =
avformat_new_stream
(s, 0);
57
if
(!ast)
58
return
AVERROR
(ENOMEM);
59
ast->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
60
ast->
codec
->
codec_id
=
AV_CODEC_ID_BMV_AUDIO
;
61
ast->
codec
->
channels
= 2;
62
ast->
codec
->
channel_layout
=
AV_CH_LAYOUT_STEREO
;
63
ast->
codec
->
sample_rate
= 22050;
64
avpriv_set_pts_info
(ast, 16, 1, 22050);
65
66
c->
get_next
= 1;
67
c->
audio_pos
= 0;
68
return
0;
69
}
70
71
static
int
bmv_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
72
{
73
BMVContext
*
c
= s->
priv_data
;
74
int
type
;
75
void
*tmp;
76
77
while
(c->
get_next
) {
78
if
(s->
pb
->
eof_reached
)
79
return
AVERROR_EOF
;
80
type =
avio_r8
(s->
pb
);
81
if
(type ==
BMV_NOP
)
82
continue
;
83
if
(type ==
BMV_END
)
84
return
AVERROR_EOF
;
85
c->
size
=
avio_rl24
(s->
pb
);
86
if
(!c->
size
)
87
return
AVERROR_INVALIDDATA
;
88
tmp =
av_realloc
(c->
packet
, c->
size
+ 1);
89
if
(!tmp)
90
return
AVERROR
(ENOMEM);
91
c->
packet
= tmp;
92
c->
packet
[0] = type;
93
if
(
avio_read
(s->
pb
, c->
packet
+ 1, c->
size
) != c->
size
)
94
return
AVERROR
(EIO);
95
if
(type &
BMV_AUDIO
) {
96
int
audio_size
= c->
packet
[1] * 65 + 1;
97
if
(audio_size >= c->
size
) {
98
av_log
(s,
AV_LOG_ERROR
,
"Reported audio size %d is bigger than packet size (%d)\n"
,
99
audio_size, c->
size
);
100
return
AVERROR_INVALIDDATA
;
101
}
102
if
(
av_new_packet
(pkt, audio_size) < 0)
103
return
AVERROR
(ENOMEM);
104
memcpy(pkt->
data
, c->
packet
+ 1, pkt->
size
);
105
pkt->
stream_index
= 1;
106
pkt->
pts
= c->
audio_pos
;
107
pkt->
duration
= c->
packet
[1] * 32;
108
c->
audio_pos
+= pkt->
duration
;
109
c->
get_next
= 0;
110
return
pkt->
size
;
111
}
else
112
break
;
113
}
114
if
(
av_new_packet
(pkt, c->
size
+ 1) < 0)
115
return
AVERROR
(ENOMEM);
116
pkt->
stream_index
= 0;
117
c->
get_next
= 1;
118
memcpy(pkt->
data
, c->
packet
, pkt->
size
);
119
return
pkt->
size
;
120
}
121
122
static
int
bmv_read_close
(
AVFormatContext
*
s
)
123
{
124
BMVContext
*
c
= s->
priv_data
;
125
126
av_freep
(&c->
packet
);
127
128
return
0;
129
}
130
131
AVInputFormat
ff_bmv_demuxer
= {
132
.
name
=
"bmv"
,
133
.long_name =
NULL_IF_CONFIG_SMALL
(
"Discworld II BMV"
),
134
.priv_data_size =
sizeof
(
BMVContext
),
135
.
read_header
=
bmv_read_header
,
136
.
read_packet
=
bmv_read_packet
,
137
.
read_close
=
bmv_read_close
,
138
.extensions =
"bmv"
,
139
};
Generated on Wed Jul 10 2013 23:47:56 for FFmpeg by
1.8.2