Mercurial > libavcodec.hg
annotate cavs_parser.c @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 7dd2a45249a9 |
children |
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 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
8791
diff
changeset
|
23 * @file |
4945 | 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){ | |
8791
7798afcf0b24
do not check for minimum slice start code, 0x00000100 is valid
stefang
parents:
8718
diff
changeset
|
63 if(state > SLICE_MAX_START_CODE){ |
4177 | 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 }; |