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 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
#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
, err;
75
76
while
(c->
get_next
) {
77
if
(s->
pb
->
eof_reached
)
78
return
AVERROR_EOF
;
79
type =
avio_r8
(s->
pb
);
80
if
(type ==
BMV_NOP
)
81
continue
;
82
if
(type ==
BMV_END
)
83
return
AVERROR_EOF
;
84
c->
size
=
avio_rl24
(s->
pb
);
85
if
(!c->
size
)
86
return
AVERROR_INVALIDDATA
;
87
if
((err =
av_reallocp
(&c->
packet
, c->
size
+ 1)) < 0)
88
return
err;
89
c->
packet
[0] = type;
90
if
(
avio_read
(s->
pb
, c->
packet
+ 1, c->
size
) != c->
size
)
91
return
AVERROR
(EIO);
92
if
(type &
BMV_AUDIO
) {
93
int
audio_size
= c->
packet
[1] * 65 + 1;
94
if
(audio_size >= c->
size
) {
95
av_log
(s,
AV_LOG_ERROR
,
"Reported audio size %d is bigger than packet size (%d)\n"
,
96
audio_size, c->
size
);
97
return
AVERROR_INVALIDDATA
;
98
}
99
if
(
av_new_packet
(pkt, audio_size) < 0)
100
return
AVERROR
(ENOMEM);
101
memcpy(pkt->
data
, c->
packet
+ 1, pkt->
size
);
102
pkt->
stream_index
= 1;
103
pkt->
pts
= c->
audio_pos
;
104
pkt->
duration
= c->
packet
[1] * 32;
105
c->
audio_pos
+= pkt->
duration
;
106
c->
get_next
= 0;
107
return
pkt->
size
;
108
}
else
109
break
;
110
}
111
if
(
av_new_packet
(pkt, c->
size
+ 1) < 0)
112
return
AVERROR
(ENOMEM);
113
pkt->
stream_index
= 0;
114
c->
get_next
= 1;
115
memcpy(pkt->
data
, c->
packet
, pkt->
size
);
116
return
pkt->
size
;
117
}
118
119
static
int
bmv_read_close
(
AVFormatContext
*
s
)
120
{
121
BMVContext
*
c
= s->
priv_data
;
122
123
av_freep
(&c->
packet
);
124
125
return
0;
126
}
127
128
AVInputFormat
ff_bmv_demuxer
= {
129
.
name
=
"bmv"
,
130
.long_name =
NULL_IF_CONFIG_SMALL
(
"Discworld II BMV"
),
131
.priv_data_size =
sizeof
(
BMVContext
),
132
.
read_header
=
bmv_read_header
,
133
.
read_packet
=
bmv_read_packet
,
134
.
read_close
=
bmv_read_close
,
135
.extensions =
"bmv"
,
136
};
Generated on Sat Jan 25 2014 19:51:45 for FFmpeg by
1.8.2