comparison roqvideodec.c @ 5088:8e206208db1f libavcodec

fix skipped blocks fixes decoding of (http://samples.mplayerhq.hu/game-formats/idroq/bf2introseg.roq)
author michael
date Fri, 01 Jun 2007 21:17:05 +0000
parents e72265f4e518
children 20914da7d71b
comparison
equal deleted inserted replaced
5087:6c7f4ece59ed 5088:8e206208db1f
90 frame_stats[0][vqid]++; 90 frame_stats[0][vqid]++;
91 vqflg_pos--; 91 vqflg_pos--;
92 92
93 switch(vqid) { 93 switch(vqid) {
94 case RoQ_ID_MOT: 94 case RoQ_ID_MOT:
95 ff_apply_motion_8x8(ri, xp, yp, 0, 0);
96 break; 95 break;
97 case RoQ_ID_FCC: 96 case RoQ_ID_FCC:
98 mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8)); 97 mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8));
99 my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg); 98 my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg);
100 ff_apply_motion_8x8(ri, xp, yp, mx, my); 99 ff_apply_motion_8x8(ri, xp, yp, mx, my);
120 vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; 119 vqid = (vqflg >> (vqflg_pos * 2)) & 0x3;
121 frame_stats[1][vqid]++; 120 frame_stats[1][vqid]++;
122 vqflg_pos--; 121 vqflg_pos--;
123 switch(vqid) { 122 switch(vqid) {
124 case RoQ_ID_MOT: 123 case RoQ_ID_MOT:
125 ff_apply_motion_4x4(ri, x, y, 0, 0);
126 break; 124 break;
127 case RoQ_ID_FCC: 125 case RoQ_ID_FCC:
128 mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8)); 126 mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8));
129 my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg); 127 my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg);
130 ff_apply_motion_4x4(ri, x, y, mx, my); 128 ff_apply_motion_4x4(ri, x, y, mx, my);
165 static int roq_decode_init(AVCodecContext *avctx) 163 static int roq_decode_init(AVCodecContext *avctx)
166 { 164 {
167 RoqContext *s = avctx->priv_data; 165 RoqContext *s = avctx->priv_data;
168 166
169 s->avctx = avctx; 167 s->avctx = avctx;
170 s->first_frame = 1;
171 s->last_frame = &s->frames[0]; 168 s->last_frame = &s->frames[0];
172 s->current_frame = &s->frames[1]; 169 s->current_frame = &s->frames[1];
173 avctx->pix_fmt = PIX_FMT_YUV420P; 170 avctx->pix_fmt = PIX_FMT_YUV420P;
174 dsputil_init(&s->dsp, avctx); 171 dsputil_init(&s->dsp, avctx);
175 172
180 void *data, int *data_size, 177 void *data, int *data_size,
181 uint8_t *buf, int buf_size) 178 uint8_t *buf, int buf_size)
182 { 179 {
183 RoqContext *s = avctx->priv_data; 180 RoqContext *s = avctx->priv_data;
184 181
185 if (avctx->get_buffer(avctx, s->current_frame)) { 182 if (avctx->reget_buffer(avctx, s->current_frame)) {
186 av_log(avctx, AV_LOG_ERROR, " RoQ: get_buffer() failed\n"); 183 av_log(avctx, AV_LOG_ERROR, " RoQ: get_buffer() failed\n");
187 return -1; 184 return -1;
188 } 185 }
189 s->y_stride = s->current_frame->linesize[0]; 186 s->y_stride = s->current_frame->linesize[0];
190 s->c_stride = s->current_frame->linesize[1]; 187 s->c_stride = s->current_frame->linesize[1];
191 188
192 s->buf = buf; 189 s->buf = buf;
193 s->size = buf_size; 190 s->size = buf_size;
194 roqvideo_decode_frame(s); 191 roqvideo_decode_frame(s);
195 192
196 /* release the last frame if it is allocated */
197 if (s->first_frame)
198 s->first_frame = 0;
199 else
200 avctx->release_buffer(avctx, s->last_frame);
201
202 *data_size = sizeof(AVFrame); 193 *data_size = sizeof(AVFrame);
203 *(AVFrame*)data = *s->current_frame; 194 *(AVFrame*)data = *s->current_frame;
204 195
205 /* shuffle frames */ 196 /* shuffle frames */
206 FFSWAP(AVFrame *, s->current_frame, s->last_frame); 197 FFSWAP(AVFrame *, s->current_frame, s->last_frame);
213 RoqContext *s = avctx->priv_data; 204 RoqContext *s = avctx->priv_data;
214 205
215 /* release the last frame */ 206 /* release the last frame */
216 if (s->last_frame->data[0]) 207 if (s->last_frame->data[0])
217 avctx->release_buffer(avctx, s->last_frame); 208 avctx->release_buffer(avctx, s->last_frame);
209 if (s->current_frame->data[0])
210 avctx->release_buffer(avctx, s->current_frame);
218 211
219 return 0; 212 return 0;
220 } 213 }
221 214
222 AVCodec roq_decoder = { 215 AVCodec roq_decoder = {