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
filmstripdec.c
Go to the documentation of this file.
1
/*
2
* Adobe Filmstrip demuxer
3
* Copyright (c) 2010 Peter Ross
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
24
* Adobe Filmstrip demuxer
25
*/
26
27
#include "
libavutil/intreadwrite.h
"
28
#include "
avformat.h
"
29
#include "
internal.h
"
30
31
#define RAND_TAG MKBETAG('R','a','n','d')
32
33
typedef
struct
FilmstripDemuxContext
{
34
int
leading
;
35
}
FilmstripDemuxContext
;
36
37
static
int
read_header
(
AVFormatContext
*
s
)
38
{
39
FilmstripDemuxContext
*film = s->
priv_data
;
40
AVIOContext
*pb = s->
pb
;
41
AVStream
*st;
42
43
if
(!s->
pb
->
seekable
)
44
return
AVERROR
(EIO);
45
46
avio_seek
(pb,
avio_size
(pb) - 36, SEEK_SET);
47
if
(
avio_rb32
(pb) !=
RAND_TAG
) {
48
av_log
(s,
AV_LOG_ERROR
,
"magic number not found\n"
);
49
return
AVERROR_INVALIDDATA
;
50
}
51
52
st =
avformat_new_stream
(s,
NULL
);
53
if
(!st)
54
return
AVERROR
(ENOMEM);
55
56
st->
nb_frames
=
avio_rb32
(pb);
57
if
(
avio_rb16
(pb) != 0) {
58
avpriv_request_sample
(s,
"Unsupported packing method"
);
59
return
AVERROR_PATCHWELCOME
;
60
}
61
62
avio_skip
(pb, 2);
63
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
64
st->
codec
->
codec_id
=
AV_CODEC_ID_RAWVIDEO
;
65
st->
codec
->
pix_fmt
=
AV_PIX_FMT_RGBA
;
66
st->
codec
->
codec_tag
= 0;
/* no fourcc */
67
st->
codec
->
width
=
avio_rb16
(pb);
68
st->
codec
->
height
=
avio_rb16
(pb);
69
film->
leading
=
avio_rb16
(pb);
70
71
if
(st->
codec
->
width
* 4LL * st->
codec
->
height
>= INT_MAX) {
72
av_log
(s,
AV_LOG_ERROR
,
"dimensions too large\n"
);
73
return
AVERROR_PATCHWELCOME
;
74
}
75
76
avpriv_set_pts_info
(st, 64, 1,
avio_rb16
(pb));
77
78
avio_seek
(pb, 0, SEEK_SET);
79
80
return
0;
81
}
82
83
static
int
read_packet
(
AVFormatContext
*
s
,
84
AVPacket
*
pkt
)
85
{
86
FilmstripDemuxContext
*film = s->
priv_data
;
87
AVStream
*st = s->
streams
[0];
88
89
if
(
avio_feof
(s->
pb
))
90
return
AVERROR
(EIO);
91
pkt->
dts
=
avio_tell
(s->
pb
) / (st->
codec
->
width
* (int64_t)(st->
codec
->
height
+ film->
leading
) * 4);
92
pkt->
size
=
av_get_packet
(s->
pb
, pkt, st->
codec
->
width
* st->
codec
->
height
* 4);
93
avio_skip
(s->
pb
, st->
codec
->
width
* (int64_t) film->
leading
* 4);
94
if
(pkt->
size
< 0)
95
return
pkt->
size
;
96
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
97
return
0;
98
}
99
100
static
int
read_seek
(
AVFormatContext
*
s
,
int
stream_index, int64_t timestamp,
int
flags
)
101
{
102
AVStream
*st = s->
streams
[stream_index];
103
if
(
avio_seek
(s->
pb
,
FFMAX
(timestamp, 0) * st->
codec
->
width
* st->
codec
->
height
* 4, SEEK_SET) < 0)
104
return
-1;
105
return
0;
106
}
107
108
AVInputFormat
ff_filmstrip_demuxer
= {
109
.
name
=
"filmstrip"
,
110
.long_name =
NULL_IF_CONFIG_SMALL
(
"Adobe Filmstrip"
),
111
.priv_data_size =
sizeof
(
FilmstripDemuxContext
),
112
.
read_header
=
read_header
,
113
.
read_packet
=
read_packet
,
114
.
read_seek
=
read_seek
,
115
.extensions =
"flm"
,
116
};
Generated on Sun Mar 8 2015 02:35:09 for FFmpeg by
1.8.2