annotate cavs_parser.c @ 10255:b81ec4ac8f96 libavcodec

Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
author michael
date Wed, 23 Sep 2009 15:16:36 +0000
parents 7798afcf0b24
children 7dd2a45249a9
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 5215
diff changeset
23 * @file libavcodec/cavs_parser.c
4945
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){
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
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 };