3 * Copyright (c) 2006-2007 Konstantin Shishkov
4 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * @file libavcodec/vc1_parser.c
25 * VC-1 and WMV3 parser
32 * finds the end of the current frame in the bitstream.
33 * @return the position of the first byte of the next frame, or -1
35 static int vc1_find_frame_end(ParseContext
*pc
, const uint8_t *buf
,
40 pic_found
= pc
->frame_start_found
;
45 for(i
=0; i
<buf_size
; i
++){
46 state
= (state
<<8) | buf
[i
];
47 if(state
== VC1_CODE_FRAME
|| state
== VC1_CODE_FIELD
){
56 /* EOF considered as end of frame */
59 for(; i
<buf_size
; i
++){
60 state
= (state
<<8) | buf
[i
];
61 if(IS_MARKER(state
) && state
!= VC1_CODE_FIELD
&& state
!= VC1_CODE_SLICE
){
62 pc
->frame_start_found
=0;
68 pc
->frame_start_found
= pic_found
;
73 static int vc1_parse(AVCodecParserContext
*s
,
74 AVCodecContext
*avctx
,
75 const uint8_t **poutbuf
, int *poutbuf_size
,
76 const uint8_t *buf
, int buf_size
)
78 ParseContext
*pc
= s
->priv_data
;
81 if(s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
){
84 next
= vc1_find_frame_end(pc
, buf
, buf_size
);
86 if (ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
93 *poutbuf_size
= buf_size
;
97 static int vc1_split(AVCodecContext
*avctx
,
98 const uint8_t *buf
, int buf_size
)
103 for(i
=0; i
<buf_size
; i
++){
104 state
= (state
<<8) | buf
[i
];
105 if(IS_MARKER(state
) && state
!= VC1_CODE_SEQHDR
&& state
!= VC1_CODE_ENTRYPOINT
)
111 AVCodecParser vc1_parser
= {
113 sizeof(ParseContext1
),