annotate cavs_parser.c @ 6018:9d1654835629 libavcodec

Ensure that our total reference frame count does not exceed the SPS max frame count, which is limited to less than the size of the reference buffers, thereby preventing overflow. Part of fix for issue 281.
author heydowns
date Fri, 14 Dec 2007 06:25:23 +0000
parents 2b72f9bc4f06
children e9d9d946f213
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
1 /*
4945
64ca10777164 move cavs parser in it's own file
aurel
parents: 4944
diff changeset
2 * Chinese AVS video (AVS1-P2, JiZhun profile) parser.
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
16 *
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3524
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4945
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
20 */
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
21
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
22 /**
4945
64ca10777164 move cavs parser in it's own file
aurel
parents: 4944
diff changeset
23 * @file cavs_parser.c
64ca10777164 move cavs parser in it's own file
aurel
parents: 4944
diff changeset
24 * Chinese AVS video (AVS1-P2, JiZhun profile) parser
3402
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de>
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
26 */
34d3e497e310 cosmetic patch:
stefang
parents: 3395
diff changeset
27
4945
64ca10777164 move cavs parser in it's own file
aurel
parents: 4944
diff changeset
28 #include "parser.h"
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents: 4931
diff changeset
29 #include "cavs.h"
3380
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
30
1f47e26323bc new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff changeset
31
4177
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
32 /**
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
33 * finds the end of the current frame in the bitstream.
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
34 * @return the position of the first byte of the next frame, or -1
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
35 */
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
36 static int cavs_find_frame_end(ParseContext *pc, const uint8_t *buf,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
37 int buf_size) {
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
38 int pic_found, i;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
39 uint32_t state;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
40
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
41 pic_found= pc->frame_start_found;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
42 state= pc->state;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
43
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
44 i=0;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
45 if(!pic_found){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
46 for(i=0; i<buf_size; i++){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
47 state= (state<<8) | buf[i];
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
48 if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
49 i++;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
50 pic_found=1;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
51 break;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
52 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
53 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
54 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
55
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
56 if(pic_found){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
57 /* EOF considered as end of frame */
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
58 if (buf_size == 0)
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
59 return 0;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
60 for(; i<buf_size; i++){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
61 state= (state<<8) | buf[i];
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
62 if((state&0xFFFFFF00) == 0x100){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
63 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
64 pc->frame_start_found=0;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
65 pc->state=-1;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
66 return i-3;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
67 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
68 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
69 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
70 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
71 pc->frame_start_found= pic_found;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
72 pc->state= state;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
73 return END_NOT_FOUND;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
74 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
75
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
76 static int cavsvideo_parse(AVCodecParserContext *s,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
77 AVCodecContext *avctx,
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4918
diff changeset
78 const uint8_t **poutbuf, int *poutbuf_size,
4177
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
79 const uint8_t *buf, int buf_size)
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
80 {
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
81 ParseContext *pc = s->priv_data;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
82 int next;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
83
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
84 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
85 next= buf_size;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
86 }else{
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
87 next= cavs_find_frame_end(pc, buf, buf_size);
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
88
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4918
diff changeset
89 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
4177
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
90 *poutbuf = NULL;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
91 *poutbuf_size = 0;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
92 return buf_size;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
93 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
94 }
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4918
diff changeset
95 *poutbuf = buf;
4177
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
96 *poutbuf_size = buf_size;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
97 return next;
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
98 }
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
99
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
100 AVCodecParser cavsvideo_parser = {
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
101 { CODEC_ID_CAVS },
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
102 sizeof(ParseContext1),
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
103 NULL,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
104 cavsvideo_parse,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
105 ff_parse1_close,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
106 ff_mpeg4video_split,
127d84a4c8e0 move all cavs-parsing to cavs.c
stefang
parents: 4176
diff changeset
107 };