Mercurial > libavcodec.hg
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 = { |