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
cavs_parser.c
Go to the documentation of this file.
1
/*
2
* Chinese AVS video (AVS1-P2, JiZhun profile) parser.
3
* Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
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
* Chinese AVS video (AVS1-P2, JiZhun profile) parser
25
* @author Stefan Gehrer <stefan.gehrer@gmx.de>
26
*/
27
28
#include "
parser.h
"
29
#include "
cavs.h
"
30
31
32
/**
33
* Find the end of the current frame in the bitstream.
34
* @return the position of the first byte of the next frame, or -1
35
*/
36
static
int
cavs_find_frame_end
(
ParseContext
*pc,
const
uint8_t
*
buf
,
37
int
buf_size) {
38
int
pic_found, i;
39
uint32_t
state
;
40
41
pic_found= pc->
frame_start_found
;
42
state= pc->
state
;
43
44
i=0;
45
if
(!pic_found){
46
for
(i=0; i<buf_size; i++){
47
state= (state<<8) | buf[i];
48
if
(state ==
PIC_I_START_CODE
|| state ==
PIC_PB_START_CODE
){
49
i++;
50
pic_found=1;
51
break
;
52
}
53
}
54
}
55
56
if
(pic_found){
57
/* EOF considered as end of frame */
58
if
(buf_size == 0)
59
return
0;
60
for
(; i<buf_size; i++){
61
state= (state<<8) | buf[i];
62
if
((state&0xFFFFFF00) == 0x100){
63
if
(state >
SLICE_MAX_START_CODE
){
64
pc->
frame_start_found
=0;
65
pc->
state
=-1;
66
return
i-3;
67
}
68
}
69
}
70
}
71
pc->
frame_start_found
= pic_found;
72
pc->
state
=
state
;
73
return
END_NOT_FOUND
;
74
}
75
76
static
int
cavsvideo_parse
(
AVCodecParserContext
*
s
,
77
AVCodecContext
*avctx,
78
const
uint8_t
**poutbuf,
int
*poutbuf_size,
79
const
uint8_t
*
buf
,
int
buf_size)
80
{
81
ParseContext
*pc = s->
priv_data
;
82
int
next;
83
84
if
(s->
flags
&
PARSER_FLAG_COMPLETE_FRAMES
){
85
next= buf_size;
86
}
else
{
87
next=
cavs_find_frame_end
(pc, buf, buf_size);
88
89
if
(
ff_combine_frame
(pc, next, &buf, &buf_size) < 0) {
90
*poutbuf = NULL;
91
*poutbuf_size = 0;
92
return
buf_size;
93
}
94
}
95
*poutbuf =
buf
;
96
*poutbuf_size = buf_size;
97
return
next;
98
}
99
100
AVCodecParser
ff_cavsvideo_parser
= {
101
.
codec_ids
= {
AV_CODEC_ID_CAVS
},
102
.priv_data_size =
sizeof
(
ParseContext
),
103
.parser_parse =
cavsvideo_parse
,
104
.parser_close =
ff_parse_close
,
105
.
split
=
ff_mpeg4video_split
,
106
};
Generated on Sun Mar 23 2014 23:49:52 for FFmpeg by
1.8.2