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
libavcodec
dpx_parser.c
Go to the documentation of this file.
1
/*
2
* DPX parser
3
* Copyright (c) 2013 Paul B Mahol
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
* DPX parser
25
*/
26
27
#include "
libavutil/bswap.h
"
28
#include "
libavutil/common.h
"
29
30
#include "
parser.h
"
31
32
typedef
struct
DPXParseContext
{
33
ParseContext
pc
;
34
uint32_t
index
;
35
uint32_t
fsize
;
36
uint32_t
remaining_size
;
37
int
is_be
;
38
}
DPXParseContext
;
39
40
static
int
dpx_parse
(
AVCodecParserContext
*
s
,
AVCodecContext
*avctx,
41
const
uint8_t
**poutbuf,
int
*poutbuf_size,
42
const
uint8_t
*
buf
,
int
buf_size)
43
{
44
DPXParseContext
*d = s->
priv_data
;
45
uint32_t
state
= d->
pc
.
state
;
46
int
next =
END_NOT_FOUND
;
47
int
i = 0;
48
49
s->
pict_type
=
AV_PICTURE_TYPE_I
;
50
51
*poutbuf_size = 0;
52
if
(buf_size == 0)
53
next = 0;
54
55
if
(!d->
pc
.
frame_start_found
) {
56
for
(; i < buf_size; i++) {
57
state = (state << 8) | buf[i];
58
if
(state ==
MKBETAG
(
'S'
,
'D'
,
'P'
,
'X'
) ||
59
state ==
MKTAG
(
'S'
,
'D'
,
'P'
,
'X'
)) {
60
d->
pc
.
frame_start_found
= 1;
61
d->
is_be
= state ==
MKBETAG
(
'S'
,
'D'
,
'P'
,
'X'
);
62
d->
index
= 0;
63
break
;
64
}
65
}
66
d->
pc
.
state
=
state
;
67
}
else
{
68
if
(d->
remaining_size
) {
69
i =
FFMIN
(d->
remaining_size
, buf_size);
70
d->
remaining_size
-= i;
71
if
(d->
remaining_size
)
72
goto
flush
;
73
}
74
}
75
76
for
(; d->
pc
.
frame_start_found
&& i < buf_size; i++) {
77
d->
pc
.
state
= (d->
pc
.
state
<< 8) | buf[i];
78
d->
index
++;
79
if
(d->
index
== 17) {
80
d->
fsize
= d->
is_be
? d->
pc
.
state
:
av_bswap32
(d->
pc
.
state
);
81
if
(d->
fsize
<= 1664) {
82
d->
pc
.
frame_start_found
= 0;
83
goto
flush
;
84
}
85
if
(d->
fsize
> buf_size - i + 19)
86
d->
remaining_size
= d->
fsize
- buf_size + i - 19;
87
else
88
i += d->
fsize
- 19;
89
90
break
;
91
}
else
if
(d->
index
> 17) {
92
if
(d->
pc
.
state
==
MKBETAG
(
'S'
,
'D'
,
'P'
,
'X'
) ||
93
d->
pc
.
state
==
MKTAG
(
'S'
,
'D'
,
'P'
,
'X'
)) {
94
next = i - 3;
95
break
;
96
}
97
}
98
}
99
100
flush
:
101
if
(
ff_combine_frame
(&d->
pc
, next, &buf, &buf_size) < 0)
102
return
buf_size;
103
104
d->
pc
.
frame_start_found
= 0;
105
106
*poutbuf =
buf
;
107
*poutbuf_size = buf_size;
108
return
next;
109
}
110
111
AVCodecParser
ff_dpx_parser
= {
112
.
codec_ids
= {
AV_CODEC_ID_DPX
},
113
.priv_data_size =
sizeof
(
DPXParseContext
),
114
.parser_parse =
dpx_parse
,
115
.parser_close =
ff_parse_close
,
116
};
Generated on Sun Mar 8 2015 02:34:50 for FFmpeg by
1.8.2