Mercurial > libavcodec.hg
annotate cljr.c @ 2134:8afd396fa198 libavcodec
- Support empty GOB's (no mb's) and skip all mb's
- Mb's were not skipped at the end of a GOB
- One value too much was used in iDCT
- Chroma_qscale was not updated for mquant
patch by ("Chris Flerackers" <cflerackers at androme dot be>)
author | michael |
---|---|
date | Thu, 22 Jul 2004 10:23:28 +0000 |
parents | 141a9539e270 |
children | f67b63ed036d |
rev | line source |
---|---|
1385 | 1 /* |
2 * Cirrus Logic AccuPak (CLJR) codec | |
3 * Copyright (c) 2003 Alex Beregszaszi | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 * | |
19 */ | |
20 | |
21 /** | |
22 * @file cljr.c | |
23 * Cirrus Logic AccuPak codec. | |
24 */ | |
25 | |
26 #include "avcodec.h" | |
27 #include "mpegvideo.h" | |
28 | |
29 typedef struct CLJRContext{ | |
30 AVCodecContext *avctx; | |
31 AVFrame picture; | |
32 int delta[16]; | |
33 int offset[4]; | |
34 GetBitContext gb; | |
35 } CLJRContext; | |
36 | |
37 static int decode_frame(AVCodecContext *avctx, | |
38 void *data, int *data_size, | |
39 uint8_t *buf, int buf_size) | |
40 { | |
41 CLJRContext * const a = avctx->priv_data; | |
42 AVFrame *picture = data; | |
43 AVFrame * const p= (AVFrame*)&a->picture; | |
1415 | 44 int x, y; |
1385 | 45 |
46 /* special case for last picture */ | |
47 if (buf_size == 0) { | |
48 return 0; | |
49 } | |
50 | |
51 if(p->data[0]) | |
52 avctx->release_buffer(avctx, p); | |
53 | |
54 p->reference= 0; | |
55 if(avctx->get_buffer(avctx, p) < 0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1415
diff
changeset
|
56 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
1385 | 57 return -1; |
58 } | |
59 p->pict_type= I_TYPE; | |
60 p->key_frame= 1; | |
61 | |
62 init_get_bits(&a->gb, buf, buf_size); | |
63 | |
64 for(y=0; y<avctx->height; y++){ | |
65 uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ]; | |
1386 | 66 uint8_t *cb= &a->picture.data[1][ y*a->picture.linesize[1] ]; |
67 uint8_t *cr= &a->picture.data[2][ y*a->picture.linesize[2] ]; | |
1385 | 68 for(x=0; x<avctx->width; x+=4){ |
69 luma[3] = get_bits(&a->gb, 5) << 3; | |
70 luma[2] = get_bits(&a->gb, 5) << 3; | |
71 luma[1] = get_bits(&a->gb, 5) << 3; | |
72 luma[0] = get_bits(&a->gb, 5) << 3; | |
73 luma+= 4; | |
74 *(cb++) = get_bits(&a->gb, 6) << 2; | |
75 *(cr++) = get_bits(&a->gb, 6) << 2; | |
76 } | |
77 } | |
78 | |
79 *picture= *(AVFrame*)&a->picture; | |
80 *data_size = sizeof(AVPicture); | |
81 | |
82 emms_c(); | |
83 | |
84 return buf_size; | |
85 } | |
86 | |
87 #if 0 | |
88 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
89 CLJRContext * const a = avctx->priv_data; | |
90 AVFrame *pict = data; | |
91 AVFrame * const p= (AVFrame*)&a->picture; | |
92 int size; | |
93 int mb_x, mb_y; | |
94 | |
95 *p = *pict; | |
96 p->pict_type= I_TYPE; | |
97 p->key_frame= 1; | |
98 | |
99 emms_c(); | |
100 | |
101 align_put_bits(&a->pb); | |
102 while(get_bit_count(&a->pb)&31) | |
103 put_bits(&a->pb, 8, 0); | |
104 | |
105 size= get_bit_count(&a->pb)/32; | |
106 | |
107 return size*4; | |
108 } | |
109 #endif | |
110 | |
111 static void common_init(AVCodecContext *avctx){ | |
112 CLJRContext * const a = avctx->priv_data; | |
113 | |
114 avctx->coded_frame= (AVFrame*)&a->picture; | |
115 a->avctx= avctx; | |
116 } | |
117 | |
118 static int decode_init(AVCodecContext *avctx){ | |
1415 | 119 |
1385 | 120 common_init(avctx); |
121 | |
1386 | 122 avctx->pix_fmt= PIX_FMT_YUV411P; |
1385 | 123 |
124 return 0; | |
125 } | |
126 | |
127 static int encode_init(AVCodecContext *avctx){ | |
1415 | 128 |
1385 | 129 common_init(avctx); |
130 | |
131 return 0; | |
132 } | |
133 | |
134 AVCodec cljr_decoder = { | |
135 "cljr", | |
136 CODEC_TYPE_VIDEO, | |
137 CODEC_ID_CLJR, | |
138 sizeof(CLJRContext), | |
139 decode_init, | |
140 NULL, | |
1994 | 141 NULL, |
1385 | 142 decode_frame, |
143 CODEC_CAP_DR1, | |
144 }; | |
145 #if 0 | |
146 #ifdef CONFIG_ENCODERS | |
147 | |
148 AVCodec cljr_encoder = { | |
149 "cljr", | |
150 CODEC_TYPE_VIDEO, | |
151 CODEC_ID_cljr, | |
152 sizeof(CLJRContext), | |
153 encode_init, | |
154 encode_frame, | |
155 //encode_end, | |
156 }; | |
157 | |
158 #endif //CONFIG_ENCODERS | |
159 #endif |