Mercurial > libavcodec.hg
annotate cavs_parser.c @ 7351:1502ba3beb72 libavcodec
The codebook generator algorithm involves picking three
different codebook centroids ("high utility", "low
utility" and "closest to the low utility one"). This
change avoid the corner case of choosing two times the
same centroid.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:54:31 +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 }; |