Mercurial > libavcodec.hg
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 |
rev | line source |
---|---|
3380
1f47e26323bc
new files for the CAVS decoder by (Stefan Gehrer <stefan gehrer gmx de)
michael
parents:
diff
changeset
|
1 /* |
4945 | 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 | 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 | 22 /** |
4945 | 23 * @file cavs_parser.c |
24 * Chinese AVS video (AVS1-P2, JiZhun profile) parser | |
3402 | 25 * @author Stefan Gehrer <stefan.gehrer@gmx.de> |
26 */ | |
27 | |
4945 | 28 #include "parser.h" |
4944 | 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 | 32 /** |
33 * finds 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_MIN_START_CODE || 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, | |
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 | 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 | |
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 | 90 *poutbuf = NULL; |
91 *poutbuf_size = 0; | |
92 return buf_size; | |
93 } | |
94 } | |
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4918
diff
changeset
|
95 *poutbuf = buf; |
4177 | 96 *poutbuf_size = buf_size; |
97 return next; | |
98 } | |
99 | |
100 AVCodecParser cavsvideo_parser = { | |
101 { CODEC_ID_CAVS }, | |
102 sizeof(ParseContext1), | |
103 NULL, | |
104 cavsvideo_parse, | |
105 ff_parse1_close, | |
106 ff_mpeg4video_split, | |
107 }; |