annotate ffmpeg/libavcodec/svq3.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (c) 2003 The FFmpeg Project
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 /*
yading@10 22 * How to use this decoder:
yading@10 23 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
yading@10 24 * have stsd atoms to describe media trak properties. A stsd atom for a
yading@10 25 * video trak contains 1 or more ImageDescription atoms. These atoms begin
yading@10 26 * with the 4-byte length of the atom followed by the codec fourcc. Some
yading@10 27 * decoders need information in this atom to operate correctly. Such
yading@10 28 * is the case with SVQ3. In order to get the best use out of this decoder,
yading@10 29 * the calling app must make the SVQ3 ImageDescription atom available
yading@10 30 * via the AVCodecContext's extradata[_size] field:
yading@10 31 *
yading@10 32 * AVCodecContext.extradata = pointer to ImageDescription, first characters
yading@10 33 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
yading@10 34 * AVCodecContext.extradata_size = size of ImageDescription atom memory
yading@10 35 * buffer (which will be the same as the ImageDescription atom size field
yading@10 36 * from the QT file, minus 4 bytes since the length is missing)
yading@10 37 *
yading@10 38 * You will know you have these parameters passed correctly when the decoder
yading@10 39 * correctly decodes this file:
yading@10 40 * http://samples.mplayerhq.hu/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
yading@10 41 */
yading@10 42 #include "internal.h"
yading@10 43 #include "avcodec.h"
yading@10 44 #include "mpegvideo.h"
yading@10 45 #include "h264.h"
yading@10 46
yading@10 47 #include "h264data.h" // FIXME FIXME FIXME
yading@10 48
yading@10 49 #include "h264_mvpred.h"
yading@10 50 #include "golomb.h"
yading@10 51 #include "hpeldsp.h"
yading@10 52 #include "rectangle.h"
yading@10 53 #include "vdpau_internal.h"
yading@10 54
yading@10 55 #if CONFIG_ZLIB
yading@10 56 #include <zlib.h>
yading@10 57 #endif
yading@10 58
yading@10 59 #include "svq1.h"
yading@10 60 #include "svq3.h"
yading@10 61
yading@10 62 /**
yading@10 63 * @file
yading@10 64 * svq3 decoder.
yading@10 65 */
yading@10 66
yading@10 67 typedef struct {
yading@10 68 H264Context h;
yading@10 69 HpelDSPContext hdsp;
yading@10 70 Picture *cur_pic;
yading@10 71 Picture *next_pic;
yading@10 72 Picture *last_pic;
yading@10 73 int halfpel_flag;
yading@10 74 int thirdpel_flag;
yading@10 75 int unknown_flag;
yading@10 76 int next_slice_index;
yading@10 77 uint32_t watermark_key;
yading@10 78 uint8_t *buf;
yading@10 79 int buf_size;
yading@10 80 int adaptive_quant;
yading@10 81 int next_p_frame_damaged;
yading@10 82 int h_edge_pos;
yading@10 83 int v_edge_pos;
yading@10 84 int last_frame_output;
yading@10 85 } SVQ3Context;
yading@10 86
yading@10 87 #define FULLPEL_MODE 1
yading@10 88 #define HALFPEL_MODE 2
yading@10 89 #define THIRDPEL_MODE 3
yading@10 90 #define PREDICT_MODE 4
yading@10 91
yading@10 92 /* dual scan (from some older h264 draft)
yading@10 93 * o-->o-->o o
yading@10 94 * | /|
yading@10 95 * o o o / o
yading@10 96 * | / | |/ |
yading@10 97 * o o o o
yading@10 98 * /
yading@10 99 * o-->o-->o-->o
yading@10 100 */
yading@10 101 static const uint8_t svq3_scan[16] = {
yading@10 102 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
yading@10 103 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
yading@10 104 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
yading@10 105 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
yading@10 106 };
yading@10 107
yading@10 108 static const uint8_t svq3_pred_0[25][2] = {
yading@10 109 { 0, 0 },
yading@10 110 { 1, 0 }, { 0, 1 },
yading@10 111 { 0, 2 }, { 1, 1 }, { 2, 0 },
yading@10 112 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
yading@10 113 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
yading@10 114 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
yading@10 115 { 2, 4 }, { 3, 3 }, { 4, 2 },
yading@10 116 { 4, 3 }, { 3, 4 },
yading@10 117 { 4, 4 }
yading@10 118 };
yading@10 119
yading@10 120 static const int8_t svq3_pred_1[6][6][5] = {
yading@10 121 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
yading@10 122 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
yading@10 123 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
yading@10 124 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
yading@10 125 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
yading@10 126 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
yading@10 127 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
yading@10 128 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
yading@10 129 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
yading@10 130 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
yading@10 131 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
yading@10 132 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
yading@10 133 };
yading@10 134
yading@10 135 static const struct {
yading@10 136 uint8_t run;
yading@10 137 uint8_t level;
yading@10 138 } svq3_dct_tables[2][16] = {
yading@10 139 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
yading@10 140 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
yading@10 141 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
yading@10 142 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
yading@10 143 };
yading@10 144
yading@10 145 static const uint32_t svq3_dequant_coeff[32] = {
yading@10 146 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
yading@10 147 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
yading@10 148 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
yading@10 149 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
yading@10 150 };
yading@10 151
yading@10 152 void ff_svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
yading@10 153 {
yading@10 154 const int qmul = svq3_dequant_coeff[qp];
yading@10 155 #define stride 16
yading@10 156 int i;
yading@10 157 int temp[16];
yading@10 158 static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
yading@10 159
yading@10 160 for (i = 0; i < 4; i++) {
yading@10 161 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
yading@10 162 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
yading@10 163 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
yading@10 164 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
yading@10 165
yading@10 166 temp[4 * i + 0] = z0 + z3;
yading@10 167 temp[4 * i + 1] = z1 + z2;
yading@10 168 temp[4 * i + 2] = z1 - z2;
yading@10 169 temp[4 * i + 3] = z0 - z3;
yading@10 170 }
yading@10 171
yading@10 172 for (i = 0; i < 4; i++) {
yading@10 173 const int offset = x_offset[i];
yading@10 174 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
yading@10 175 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
yading@10 176 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
yading@10 177 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
yading@10 178
yading@10 179 output[stride * 0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20;
yading@10 180 output[stride * 2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20;
yading@10 181 output[stride * 8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20;
yading@10 182 output[stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20;
yading@10 183 }
yading@10 184 }
yading@10 185 #undef stride
yading@10 186
yading@10 187 void ff_svq3_add_idct_c(uint8_t *dst, int16_t *block,
yading@10 188 int stride, int qp, int dc)
yading@10 189 {
yading@10 190 const int qmul = svq3_dequant_coeff[qp];
yading@10 191 int i;
yading@10 192
yading@10 193 if (dc) {
yading@10 194 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
yading@10 195 : qmul * (block[0] >> 3) / 2);
yading@10 196 block[0] = 0;
yading@10 197 }
yading@10 198
yading@10 199 for (i = 0; i < 4; i++) {
yading@10 200 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
yading@10 201 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
yading@10 202 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
yading@10 203 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
yading@10 204
yading@10 205 block[0 + 4 * i] = z0 + z3;
yading@10 206 block[1 + 4 * i] = z1 + z2;
yading@10 207 block[2 + 4 * i] = z1 - z2;
yading@10 208 block[3 + 4 * i] = z0 - z3;
yading@10 209 }
yading@10 210
yading@10 211 for (i = 0; i < 4; i++) {
yading@10 212 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
yading@10 213 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
yading@10 214 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
yading@10 215 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
yading@10 216 const int rr = (dc + 0x80000);
yading@10 217
yading@10 218 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
yading@10 219 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
yading@10 220 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
yading@10 221 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
yading@10 222 }
yading@10 223
yading@10 224 memset(block, 0, 16 * sizeof(int16_t));
yading@10 225 }
yading@10 226
yading@10 227 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
yading@10 228 int index, const int type)
yading@10 229 {
yading@10 230 static const uint8_t *const scan_patterns[4] =
yading@10 231 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
yading@10 232
yading@10 233 int run, level, sign, limit;
yading@10 234 unsigned vlc;
yading@10 235 const int intra = 3 * type >> 2;
yading@10 236 const uint8_t *const scan = scan_patterns[type];
yading@10 237
yading@10 238 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
yading@10 239 for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
yading@10 240 if ((int32_t)vlc < 0)
yading@10 241 return -1;
yading@10 242
yading@10 243 sign = (vlc & 1) ? 0 : -1;
yading@10 244 vlc = vlc + 1 >> 1;
yading@10 245
yading@10 246 if (type == 3) {
yading@10 247 if (vlc < 3) {
yading@10 248 run = 0;
yading@10 249 level = vlc;
yading@10 250 } else if (vlc < 4) {
yading@10 251 run = 1;
yading@10 252 level = 1;
yading@10 253 } else {
yading@10 254 run = vlc & 0x3;
yading@10 255 level = (vlc + 9 >> 2) - run;
yading@10 256 }
yading@10 257 } else {
yading@10 258 if (vlc < 16U) {
yading@10 259 run = svq3_dct_tables[intra][vlc].run;
yading@10 260 level = svq3_dct_tables[intra][vlc].level;
yading@10 261 } else if (intra) {
yading@10 262 run = vlc & 0x7;
yading@10 263 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
yading@10 264 } else {
yading@10 265 run = vlc & 0xF;
yading@10 266 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
yading@10 267 }
yading@10 268 }
yading@10 269
yading@10 270
yading@10 271 if ((index += run) >= limit)
yading@10 272 return -1;
yading@10 273
yading@10 274 block[scan[index]] = (level ^ sign) - sign;
yading@10 275 }
yading@10 276
yading@10 277 if (type != 2) {
yading@10 278 break;
yading@10 279 }
yading@10 280 }
yading@10 281
yading@10 282 return 0;
yading@10 283 }
yading@10 284
yading@10 285 static inline void svq3_mc_dir_part(SVQ3Context *s,
yading@10 286 int x, int y, int width, int height,
yading@10 287 int mx, int my, int dxy,
yading@10 288 int thirdpel, int dir, int avg)
yading@10 289 {
yading@10 290 H264Context *h = &s->h;
yading@10 291 const Picture *pic = (dir == 0) ? s->last_pic : s->next_pic;
yading@10 292 uint8_t *src, *dest;
yading@10 293 int i, emu = 0;
yading@10 294 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
yading@10 295
yading@10 296 mx += x;
yading@10 297 my += y;
yading@10 298
yading@10 299 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
yading@10 300 my < 0 || my >= s->v_edge_pos - height - 1) {
yading@10 301 emu = 1;
yading@10 302 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
yading@10 303 my = av_clip(my, -16, s->v_edge_pos - height + 15);
yading@10 304 }
yading@10 305
yading@10 306 /* form component predictions */
yading@10 307 dest = h->cur_pic.f.data[0] + x + y * h->linesize;
yading@10 308 src = pic->f.data[0] + mx + my * h->linesize;
yading@10 309
yading@10 310 if (emu) {
yading@10 311 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src, h->linesize,
yading@10 312 width + 1, height + 1,
yading@10 313 mx, my, s->h_edge_pos, s->v_edge_pos);
yading@10 314 src = h->edge_emu_buffer;
yading@10 315 }
yading@10 316 if (thirdpel)
yading@10 317 (avg ? h->dsp.avg_tpel_pixels_tab
yading@10 318 : h->dsp.put_tpel_pixels_tab)[dxy](dest, src, h->linesize,
yading@10 319 width, height);
yading@10 320 else
yading@10 321 (avg ? s->hdsp.avg_pixels_tab
yading@10 322 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, h->linesize,
yading@10 323 height);
yading@10 324
yading@10 325 if (!(h->flags & CODEC_FLAG_GRAY)) {
yading@10 326 mx = mx + (mx < (int) x) >> 1;
yading@10 327 my = my + (my < (int) y) >> 1;
yading@10 328 width = width >> 1;
yading@10 329 height = height >> 1;
yading@10 330 blocksize++;
yading@10 331
yading@10 332 for (i = 1; i < 3; i++) {
yading@10 333 dest = h->cur_pic.f.data[i] + (x >> 1) + (y >> 1) * h->uvlinesize;
yading@10 334 src = pic->f.data[i] + mx + my * h->uvlinesize;
yading@10 335
yading@10 336 if (emu) {
yading@10 337 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src, h->uvlinesize,
yading@10 338 width + 1, height + 1,
yading@10 339 mx, my, (s->h_edge_pos >> 1),
yading@10 340 s->v_edge_pos >> 1);
yading@10 341 src = h->edge_emu_buffer;
yading@10 342 }
yading@10 343 if (thirdpel)
yading@10 344 (avg ? h->dsp.avg_tpel_pixels_tab
yading@10 345 : h->dsp.put_tpel_pixels_tab)[dxy](dest, src,
yading@10 346 h->uvlinesize,
yading@10 347 width, height);
yading@10 348 else
yading@10 349 (avg ? s->hdsp.avg_pixels_tab
yading@10 350 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
yading@10 351 h->uvlinesize,
yading@10 352 height);
yading@10 353 }
yading@10 354 }
yading@10 355 }
yading@10 356
yading@10 357 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
yading@10 358 int dir, int avg)
yading@10 359 {
yading@10 360 int i, j, k, mx, my, dx, dy, x, y;
yading@10 361 H264Context *h = &s->h;
yading@10 362 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
yading@10 363 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
yading@10 364 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
yading@10 365 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
yading@10 366 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
yading@10 367
yading@10 368 for (i = 0; i < 16; i += part_height)
yading@10 369 for (j = 0; j < 16; j += part_width) {
yading@10 370 const int b_xy = (4 * h->mb_x + (j >> 2)) +
yading@10 371 (4 * h->mb_y + (i >> 2)) * h->b_stride;
yading@10 372 int dxy;
yading@10 373 x = 16 * h->mb_x + j;
yading@10 374 y = 16 * h->mb_y + i;
yading@10 375 k = (j >> 2 & 1) + (i >> 1 & 2) +
yading@10 376 (j >> 1 & 4) + (i & 8);
yading@10 377
yading@10 378 if (mode != PREDICT_MODE) {
yading@10 379 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
yading@10 380 } else {
yading@10 381 mx = s->next_pic->motion_val[0][b_xy][0] << 1;
yading@10 382 my = s->next_pic->motion_val[0][b_xy][1] << 1;
yading@10 383
yading@10 384 if (dir == 0) {
yading@10 385 mx = mx * h->frame_num_offset /
yading@10 386 h->prev_frame_num_offset + 1 >> 1;
yading@10 387 my = my * h->frame_num_offset /
yading@10 388 h->prev_frame_num_offset + 1 >> 1;
yading@10 389 } else {
yading@10 390 mx = mx * (h->frame_num_offset - h->prev_frame_num_offset) /
yading@10 391 h->prev_frame_num_offset + 1 >> 1;
yading@10 392 my = my * (h->frame_num_offset - h->prev_frame_num_offset) /
yading@10 393 h->prev_frame_num_offset + 1 >> 1;
yading@10 394 }
yading@10 395 }
yading@10 396
yading@10 397 /* clip motion vector prediction to frame border */
yading@10 398 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
yading@10 399 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
yading@10 400
yading@10 401 /* get (optional) motion vector differential */
yading@10 402 if (mode == PREDICT_MODE) {
yading@10 403 dx = dy = 0;
yading@10 404 } else {
yading@10 405 dy = svq3_get_se_golomb(&h->gb);
yading@10 406 dx = svq3_get_se_golomb(&h->gb);
yading@10 407
yading@10 408 if (dx == INVALID_VLC || dy == INVALID_VLC) {
yading@10 409 av_log(h->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
yading@10 410 return -1;
yading@10 411 }
yading@10 412 }
yading@10 413
yading@10 414 /* compute motion vector */
yading@10 415 if (mode == THIRDPEL_MODE) {
yading@10 416 int fx, fy;
yading@10 417 mx = (mx + 1 >> 1) + dx;
yading@10 418 my = (my + 1 >> 1) + dy;
yading@10 419 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
yading@10 420 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
yading@10 421 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
yading@10 422
yading@10 423 svq3_mc_dir_part(s, x, y, part_width, part_height,
yading@10 424 fx, fy, dxy, 1, dir, avg);
yading@10 425 mx += mx;
yading@10 426 my += my;
yading@10 427 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
yading@10 428 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
yading@10 429 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
yading@10 430 dxy = (mx & 1) + 2 * (my & 1);
yading@10 431
yading@10 432 svq3_mc_dir_part(s, x, y, part_width, part_height,
yading@10 433 mx >> 1, my >> 1, dxy, 0, dir, avg);
yading@10 434 mx *= 3;
yading@10 435 my *= 3;
yading@10 436 } else {
yading@10 437 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
yading@10 438 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
yading@10 439
yading@10 440 svq3_mc_dir_part(s, x, y, part_width, part_height,
yading@10 441 mx, my, 0, 0, dir, avg);
yading@10 442 mx *= 6;
yading@10 443 my *= 6;
yading@10 444 }
yading@10 445
yading@10 446 /* update mv_cache */
yading@10 447 if (mode != PREDICT_MODE) {
yading@10 448 int32_t mv = pack16to32(mx, my);
yading@10 449
yading@10 450 if (part_height == 8 && i < 8) {
yading@10 451 AV_WN32A(h->mv_cache[dir][scan8[k] + 1 * 8], mv);
yading@10 452
yading@10 453 if (part_width == 8 && j < 8)
yading@10 454 AV_WN32A(h->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
yading@10 455 }
yading@10 456 if (part_width == 8 && j < 8)
yading@10 457 AV_WN32A(h->mv_cache[dir][scan8[k] + 1], mv);
yading@10 458 if (part_width == 4 || part_height == 4)
yading@10 459 AV_WN32A(h->mv_cache[dir][scan8[k]], mv);
yading@10 460 }
yading@10 461
yading@10 462 /* write back motion vectors */
yading@10 463 fill_rectangle(h->cur_pic.motion_val[dir][b_xy],
yading@10 464 part_width >> 2, part_height >> 2, h->b_stride,
yading@10 465 pack16to32(mx, my), 4);
yading@10 466 }
yading@10 467
yading@10 468 return 0;
yading@10 469 }
yading@10 470
yading@10 471 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
yading@10 472 {
yading@10 473 H264Context *h = &s->h;
yading@10 474 int i, j, k, m, dir, mode;
yading@10 475 int cbp = 0;
yading@10 476 uint32_t vlc;
yading@10 477 int8_t *top, *left;
yading@10 478 const int mb_xy = h->mb_xy;
yading@10 479 const int b_xy = 4 * h->mb_x + 4 * h->mb_y * h->b_stride;
yading@10 480
yading@10 481 h->top_samples_available = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
yading@10 482 h->left_samples_available = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
yading@10 483 h->topright_samples_available = 0xFFFF;
yading@10 484
yading@10 485 if (mb_type == 0) { /* SKIP */
yading@10 486 if (h->pict_type == AV_PICTURE_TYPE_P ||
yading@10 487 s->next_pic->mb_type[mb_xy] == -1) {
yading@10 488 svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
yading@10 489 0, 0, 0, 0, 0, 0);
yading@10 490
yading@10 491 if (h->pict_type == AV_PICTURE_TYPE_B)
yading@10 492 svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
yading@10 493 0, 0, 0, 0, 1, 1);
yading@10 494
yading@10 495 mb_type = MB_TYPE_SKIP;
yading@10 496 } else {
yading@10 497 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
yading@10 498 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
yading@10 499 return -1;
yading@10 500 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
yading@10 501 return -1;
yading@10 502
yading@10 503 mb_type = MB_TYPE_16x16;
yading@10 504 }
yading@10 505 } else if (mb_type < 8) { /* INTER */
yading@10 506 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&h->gb))
yading@10 507 mode = THIRDPEL_MODE;
yading@10 508 else if (s->halfpel_flag &&
yading@10 509 s->thirdpel_flag == !get_bits1(&h->gb))
yading@10 510 mode = HALFPEL_MODE;
yading@10 511 else
yading@10 512 mode = FULLPEL_MODE;
yading@10 513
yading@10 514 /* fill caches */
yading@10 515 /* note ref_cache should contain here:
yading@10 516 * ????????
yading@10 517 * ???11111
yading@10 518 * N??11111
yading@10 519 * N??11111
yading@10 520 * N??11111
yading@10 521 */
yading@10 522
yading@10 523 for (m = 0; m < 2; m++) {
yading@10 524 if (h->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) {
yading@10 525 for (i = 0; i < 4; i++)
yading@10 526 AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i * 8],
yading@10 527 h->cur_pic.motion_val[m][b_xy - 1 + i * h->b_stride]);
yading@10 528 } else {
yading@10 529 for (i = 0; i < 4; i++)
yading@10 530 AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i * 8]);
yading@10 531 }
yading@10 532 if (h->mb_y > 0) {
yading@10 533 memcpy(h->mv_cache[m][scan8[0] - 1 * 8],
yading@10 534 h->cur_pic.motion_val[m][b_xy - h->b_stride],
yading@10 535 4 * 2 * sizeof(int16_t));
yading@10 536 memset(&h->ref_cache[m][scan8[0] - 1 * 8],
yading@10 537 (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
yading@10 538
yading@10 539 if (h->mb_x < h->mb_width - 1) {
yading@10 540 AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8],
yading@10 541 h->cur_pic.motion_val[m][b_xy - h->b_stride + 4]);
yading@10 542 h->ref_cache[m][scan8[0] + 4 - 1 * 8] =
yading@10 543 (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride + 1] + 6] == -1 ||
yading@10 544 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
yading@10 545 } else
yading@10 546 h->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
yading@10 547 if (h->mb_x > 0) {
yading@10 548 AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1 * 8],
yading@10 549 h->cur_pic.motion_val[m][b_xy - h->b_stride - 1]);
yading@10 550 h->ref_cache[m][scan8[0] - 1 - 1 * 8] =
yading@10 551 (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
yading@10 552 } else
yading@10 553 h->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
yading@10 554 } else
yading@10 555 memset(&h->ref_cache[m][scan8[0] - 1 * 8 - 1],
yading@10 556 PART_NOT_AVAILABLE, 8);
yading@10 557
yading@10 558 if (h->pict_type != AV_PICTURE_TYPE_B)
yading@10 559 break;
yading@10 560 }
yading@10 561
yading@10 562 /* decode motion vector(s) and form prediction(s) */
yading@10 563 if (h->pict_type == AV_PICTURE_TYPE_P) {
yading@10 564 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
yading@10 565 return -1;
yading@10 566 } else { /* AV_PICTURE_TYPE_B */
yading@10 567 if (mb_type != 2) {
yading@10 568 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
yading@10 569 return -1;
yading@10 570 } else {
yading@10 571 for (i = 0; i < 4; i++)
yading@10 572 memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
yading@10 573 0, 4 * 2 * sizeof(int16_t));
yading@10 574 }
yading@10 575 if (mb_type != 1) {
yading@10 576 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
yading@10 577 return -1;
yading@10 578 } else {
yading@10 579 for (i = 0; i < 4; i++)
yading@10 580 memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
yading@10 581 0, 4 * 2 * sizeof(int16_t));
yading@10 582 }
yading@10 583 }
yading@10 584
yading@10 585 mb_type = MB_TYPE_16x16;
yading@10 586 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
yading@10 587 memset(h->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
yading@10 588
yading@10 589 if (mb_type == 8) {
yading@10 590 if (h->mb_x > 0) {
yading@10 591 for (i = 0; i < 4; i++)
yading@10 592 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i];
yading@10 593 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
yading@10 594 h->left_samples_available = 0x5F5F;
yading@10 595 }
yading@10 596 if (h->mb_y > 0) {
yading@10 597 h->intra4x4_pred_mode_cache[4 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 0];
yading@10 598 h->intra4x4_pred_mode_cache[5 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 1];
yading@10 599 h->intra4x4_pred_mode_cache[6 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 2];
yading@10 600 h->intra4x4_pred_mode_cache[7 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 3];
yading@10 601
yading@10 602 if (h->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
yading@10 603 h->top_samples_available = 0x33FF;
yading@10 604 }
yading@10 605
yading@10 606 /* decode prediction codes for luma blocks */
yading@10 607 for (i = 0; i < 16; i += 2) {
yading@10 608 vlc = svq3_get_ue_golomb(&h->gb);
yading@10 609
yading@10 610 if (vlc >= 25U) {
yading@10 611 av_log(h->avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
yading@10 612 return -1;
yading@10 613 }
yading@10 614
yading@10 615 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
yading@10 616 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
yading@10 617
yading@10 618 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
yading@10 619 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
yading@10 620
yading@10 621 if (left[1] == -1 || left[2] == -1) {
yading@10 622 av_log(h->avctx, AV_LOG_ERROR, "weird prediction\n");
yading@10 623 return -1;
yading@10 624 }
yading@10 625 }
yading@10 626 } else { /* mb_type == 33, DC_128_PRED block type */
yading@10 627 for (i = 0; i < 4; i++)
yading@10 628 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
yading@10 629 }
yading@10 630
yading@10 631 write_back_intra_pred_mode(h);
yading@10 632
yading@10 633 if (mb_type == 8) {
yading@10 634 ff_h264_check_intra4x4_pred_mode(h);
yading@10 635
yading@10 636 h->top_samples_available = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
yading@10 637 h->left_samples_available = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
yading@10 638 } else {
yading@10 639 for (i = 0; i < 4; i++)
yading@10 640 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
yading@10 641
yading@10 642 h->top_samples_available = 0x33FF;
yading@10 643 h->left_samples_available = 0x5F5F;
yading@10 644 }
yading@10 645
yading@10 646 mb_type = MB_TYPE_INTRA4x4;
yading@10 647 } else { /* INTRA16x16 */
yading@10 648 dir = i_mb_type_info[mb_type - 8].pred_mode;
yading@10 649 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
yading@10 650
yading@10 651 if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1) {
yading@10 652 av_log(h->avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
yading@10 653 return -1;
yading@10 654 }
yading@10 655
yading@10 656 cbp = i_mb_type_info[mb_type - 8].cbp;
yading@10 657 mb_type = MB_TYPE_INTRA16x16;
yading@10 658 }
yading@10 659
yading@10 660 if (!IS_INTER(mb_type) && h->pict_type != AV_PICTURE_TYPE_I) {
yading@10 661 for (i = 0; i < 4; i++)
yading@10 662 memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
yading@10 663 0, 4 * 2 * sizeof(int16_t));
yading@10 664 if (h->pict_type == AV_PICTURE_TYPE_B) {
yading@10 665 for (i = 0; i < 4; i++)
yading@10 666 memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
yading@10 667 0, 4 * 2 * sizeof(int16_t));
yading@10 668 }
yading@10 669 }
yading@10 670 if (!IS_INTRA4x4(mb_type)) {
yading@10 671 memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8);
yading@10 672 }
yading@10 673 if (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B) {
yading@10 674 memset(h->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
yading@10 675 }
yading@10 676
yading@10 677 if (!IS_INTRA16x16(mb_type) &&
yading@10 678 (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B)) {
yading@10 679 if ((vlc = svq3_get_ue_golomb(&h->gb)) >= 48U){
yading@10 680 av_log(h->avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
yading@10 681 return -1;
yading@10 682 }
yading@10 683
yading@10 684 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc]
yading@10 685 : golomb_to_inter_cbp[vlc];
yading@10 686 }
yading@10 687 if (IS_INTRA16x16(mb_type) ||
yading@10 688 (h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
yading@10 689 h->qscale += svq3_get_se_golomb(&h->gb);
yading@10 690
yading@10 691 if (h->qscale > 31u) {
yading@10 692 av_log(h->avctx, AV_LOG_ERROR, "qscale:%d\n", h->qscale);
yading@10 693 return -1;
yading@10 694 }
yading@10 695 }
yading@10 696 if (IS_INTRA16x16(mb_type)) {
yading@10 697 AV_ZERO128(h->mb_luma_dc[0] + 0);
yading@10 698 AV_ZERO128(h->mb_luma_dc[0] + 8);
yading@10 699 if (svq3_decode_block(&h->gb, h->mb_luma_dc[0], 0, 1)) {
yading@10 700 av_log(h->avctx, AV_LOG_ERROR,
yading@10 701 "error while decoding intra luma dc\n");
yading@10 702 return -1;
yading@10 703 }
yading@10 704 }
yading@10 705
yading@10 706 if (cbp) {
yading@10 707 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
yading@10 708 const int type = ((h->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
yading@10 709
yading@10 710 for (i = 0; i < 4; i++)
yading@10 711 if ((cbp & (1 << i))) {
yading@10 712 for (j = 0; j < 4; j++) {
yading@10 713 k = index ? (1 * (j & 1) + 2 * (i & 1) +
yading@10 714 2 * (j & 2) + 4 * (i & 2))
yading@10 715 : (4 * i + j);
yading@10 716 h->non_zero_count_cache[scan8[k]] = 1;
yading@10 717
yading@10 718 if (svq3_decode_block(&h->gb, &h->mb[16 * k], index, type)) {
yading@10 719 av_log(h->avctx, AV_LOG_ERROR,
yading@10 720 "error while decoding block\n");
yading@10 721 return -1;
yading@10 722 }
yading@10 723 }
yading@10 724 }
yading@10 725
yading@10 726 if ((cbp & 0x30)) {
yading@10 727 for (i = 1; i < 3; ++i)
yading@10 728 if (svq3_decode_block(&h->gb, &h->mb[16 * 16 * i], 0, 3)) {
yading@10 729 av_log(h->avctx, AV_LOG_ERROR,
yading@10 730 "error while decoding chroma dc block\n");
yading@10 731 return -1;
yading@10 732 }
yading@10 733
yading@10 734 if ((cbp & 0x20)) {
yading@10 735 for (i = 1; i < 3; i++) {
yading@10 736 for (j = 0; j < 4; j++) {
yading@10 737 k = 16 * i + j;
yading@10 738 h->non_zero_count_cache[scan8[k]] = 1;
yading@10 739
yading@10 740 if (svq3_decode_block(&h->gb, &h->mb[16 * k], 1, 1)) {
yading@10 741 av_log(h->avctx, AV_LOG_ERROR,
yading@10 742 "error while decoding chroma ac block\n");
yading@10 743 return -1;
yading@10 744 }
yading@10 745 }
yading@10 746 }
yading@10 747 }
yading@10 748 }
yading@10 749 }
yading@10 750
yading@10 751 h->cbp = cbp;
yading@10 752 h->cur_pic.mb_type[mb_xy] = mb_type;
yading@10 753
yading@10 754 if (IS_INTRA(mb_type))
yading@10 755 h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
yading@10 756
yading@10 757 return 0;
yading@10 758 }
yading@10 759
yading@10 760 static int svq3_decode_slice_header(AVCodecContext *avctx)
yading@10 761 {
yading@10 762 SVQ3Context *s = avctx->priv_data;
yading@10 763 H264Context *h = &s->h;
yading@10 764 const int mb_xy = h->mb_xy;
yading@10 765 int i, header;
yading@10 766 unsigned slice_id;
yading@10 767
yading@10 768 header = get_bits(&h->gb, 8);
yading@10 769
yading@10 770 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
yading@10 771 /* TODO: what? */
yading@10 772 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
yading@10 773 return -1;
yading@10 774 } else {
yading@10 775 int length = header >> 5 & 3;
yading@10 776
yading@10 777 s->next_slice_index = get_bits_count(&h->gb) +
yading@10 778 8 * show_bits(&h->gb, 8 * length) +
yading@10 779 8 * length;
yading@10 780
yading@10 781 if (s->next_slice_index > h->gb.size_in_bits) {
yading@10 782 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
yading@10 783 return -1;
yading@10 784 }
yading@10 785
yading@10 786 h->gb.size_in_bits = s->next_slice_index - 8 * (length - 1);
yading@10 787 skip_bits(&h->gb, 8);
yading@10 788
yading@10 789 if (s->watermark_key) {
yading@10 790 uint32_t header = AV_RL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1]);
yading@10 791 AV_WL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1],
yading@10 792 header ^ s->watermark_key);
yading@10 793 }
yading@10 794 if (length > 0) {
yading@10 795 memmove((uint8_t *) &h->gb.buffer[get_bits_count(&h->gb) >> 3],
yading@10 796 &h->gb.buffer[h->gb.size_in_bits >> 3], length - 1);
yading@10 797 }
yading@10 798 skip_bits_long(&h->gb, 0);
yading@10 799 }
yading@10 800
yading@10 801 if ((slice_id = svq3_get_ue_golomb(&h->gb)) >= 3) {
yading@10 802 av_log(h->avctx, AV_LOG_ERROR, "illegal slice type %d \n", slice_id);
yading@10 803 return -1;
yading@10 804 }
yading@10 805
yading@10 806 h->slice_type = golomb_to_pict_type[slice_id];
yading@10 807
yading@10 808 if ((header & 0x9F) == 2) {
yading@10 809 i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1));
yading@10 810 h->mb_skip_run = get_bits(&h->gb, i) -
yading@10 811 (h->mb_y * h->mb_width + h->mb_x);
yading@10 812 } else {
yading@10 813 skip_bits1(&h->gb);
yading@10 814 h->mb_skip_run = 0;
yading@10 815 }
yading@10 816
yading@10 817 h->slice_num = get_bits(&h->gb, 8);
yading@10 818 h->qscale = get_bits(&h->gb, 5);
yading@10 819 s->adaptive_quant = get_bits1(&h->gb);
yading@10 820
yading@10 821 /* unknown fields */
yading@10 822 skip_bits1(&h->gb);
yading@10 823
yading@10 824 if (s->unknown_flag)
yading@10 825 skip_bits1(&h->gb);
yading@10 826
yading@10 827 skip_bits1(&h->gb);
yading@10 828 skip_bits(&h->gb, 2);
yading@10 829
yading@10 830 while (get_bits1(&h->gb))
yading@10 831 skip_bits(&h->gb, 8);
yading@10 832
yading@10 833 /* reset intra predictors and invalidate motion vector references */
yading@10 834 if (h->mb_x > 0) {
yading@10 835 memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3,
yading@10 836 -1, 4 * sizeof(int8_t));
yading@10 837 memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_x],
yading@10 838 -1, 8 * sizeof(int8_t) * h->mb_x);
yading@10 839 }
yading@10 840 if (h->mb_y > 0) {
yading@10 841 memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_stride],
yading@10 842 -1, 8 * sizeof(int8_t) * (h->mb_width - h->mb_x));
yading@10 843
yading@10 844 if (h->mb_x > 0)
yading@10 845 h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] = -1;
yading@10 846 }
yading@10 847
yading@10 848 return 0;
yading@10 849 }
yading@10 850
yading@10 851 static av_cold int svq3_decode_init(AVCodecContext *avctx)
yading@10 852 {
yading@10 853 SVQ3Context *s = avctx->priv_data;
yading@10 854 H264Context *h = &s->h;
yading@10 855 int m;
yading@10 856 unsigned char *extradata;
yading@10 857 unsigned char *extradata_end;
yading@10 858 unsigned int size;
yading@10 859 int marker_found = 0;
yading@10 860
yading@10 861 s->cur_pic = av_mallocz(sizeof(*s->cur_pic));
yading@10 862 s->last_pic = av_mallocz(sizeof(*s->last_pic));
yading@10 863 s->next_pic = av_mallocz(sizeof(*s->next_pic));
yading@10 864 if (!s->next_pic || !s->last_pic || !s->cur_pic) {
yading@10 865 av_freep(&s->cur_pic);
yading@10 866 av_freep(&s->last_pic);
yading@10 867 av_freep(&s->next_pic);
yading@10 868 return AVERROR(ENOMEM);
yading@10 869 }
yading@10 870
yading@10 871 if (ff_h264_decode_init(avctx) < 0)
yading@10 872 return -1;
yading@10 873
yading@10 874 ff_hpeldsp_init(&s->hdsp, avctx->flags);
yading@10 875 h->flags = avctx->flags;
yading@10 876 h->is_complex = 1;
yading@10 877 h->sps.chroma_format_idc = 1;
yading@10 878 h->picture_structure = PICT_FRAME;
yading@10 879 avctx->pix_fmt = avctx->codec->pix_fmts[0];
yading@10 880
yading@10 881 h->chroma_qp[0] = h->chroma_qp[1] = 4;
yading@10 882 h->chroma_x_shift = h->chroma_y_shift = 1;
yading@10 883
yading@10 884 s->halfpel_flag = 1;
yading@10 885 s->thirdpel_flag = 1;
yading@10 886 s->unknown_flag = 0;
yading@10 887
yading@10 888 /* prowl for the "SEQH" marker in the extradata */
yading@10 889 extradata = (unsigned char *)avctx->extradata;
yading@10 890 extradata_end = avctx->extradata + avctx->extradata_size;
yading@10 891 if (extradata) {
yading@10 892 for (m = 0; m + 8 < avctx->extradata_size; m++) {
yading@10 893 if (!memcmp(extradata, "SEQH", 4)) {
yading@10 894 marker_found = 1;
yading@10 895 break;
yading@10 896 }
yading@10 897 extradata++;
yading@10 898 }
yading@10 899 }
yading@10 900
yading@10 901 /* if a match was found, parse the extra data */
yading@10 902 if (marker_found) {
yading@10 903 GetBitContext gb;
yading@10 904 int frame_size_code;
yading@10 905
yading@10 906 size = AV_RB32(&extradata[4]);
yading@10 907 if (size > extradata_end - extradata - 8)
yading@10 908 return AVERROR_INVALIDDATA;
yading@10 909 init_get_bits(&gb, extradata + 8, size * 8);
yading@10 910
yading@10 911 /* 'frame size code' and optional 'width, height' */
yading@10 912 frame_size_code = get_bits(&gb, 3);
yading@10 913 switch (frame_size_code) {
yading@10 914 case 0:
yading@10 915 avctx->width = 160;
yading@10 916 avctx->height = 120;
yading@10 917 break;
yading@10 918 case 1:
yading@10 919 avctx->width = 128;
yading@10 920 avctx->height = 96;
yading@10 921 break;
yading@10 922 case 2:
yading@10 923 avctx->width = 176;
yading@10 924 avctx->height = 144;
yading@10 925 break;
yading@10 926 case 3:
yading@10 927 avctx->width = 352;
yading@10 928 avctx->height = 288;
yading@10 929 break;
yading@10 930 case 4:
yading@10 931 avctx->width = 704;
yading@10 932 avctx->height = 576;
yading@10 933 break;
yading@10 934 case 5:
yading@10 935 avctx->width = 240;
yading@10 936 avctx->height = 180;
yading@10 937 break;
yading@10 938 case 6:
yading@10 939 avctx->width = 320;
yading@10 940 avctx->height = 240;
yading@10 941 break;
yading@10 942 case 7:
yading@10 943 avctx->width = get_bits(&gb, 12);
yading@10 944 avctx->height = get_bits(&gb, 12);
yading@10 945 break;
yading@10 946 }
yading@10 947
yading@10 948 s->halfpel_flag = get_bits1(&gb);
yading@10 949 s->thirdpel_flag = get_bits1(&gb);
yading@10 950
yading@10 951 /* unknown fields */
yading@10 952 skip_bits1(&gb);
yading@10 953 skip_bits1(&gb);
yading@10 954 skip_bits1(&gb);
yading@10 955 skip_bits1(&gb);
yading@10 956
yading@10 957 h->low_delay = get_bits1(&gb);
yading@10 958
yading@10 959 /* unknown field */
yading@10 960 skip_bits1(&gb);
yading@10 961
yading@10 962 while (get_bits1(&gb))
yading@10 963 skip_bits(&gb, 8);
yading@10 964
yading@10 965 s->unknown_flag = get_bits1(&gb);
yading@10 966 avctx->has_b_frames = !h->low_delay;
yading@10 967 if (s->unknown_flag) {
yading@10 968 #if CONFIG_ZLIB
yading@10 969 unsigned watermark_width = svq3_get_ue_golomb(&gb);
yading@10 970 unsigned watermark_height = svq3_get_ue_golomb(&gb);
yading@10 971 int u1 = svq3_get_ue_golomb(&gb);
yading@10 972 int u2 = get_bits(&gb, 8);
yading@10 973 int u3 = get_bits(&gb, 2);
yading@10 974 int u4 = svq3_get_ue_golomb(&gb);
yading@10 975 unsigned long buf_len = watermark_width *
yading@10 976 watermark_height * 4;
yading@10 977 int offset = get_bits_count(&gb) + 7 >> 3;
yading@10 978 uint8_t *buf;
yading@10 979
yading@10 980 if (watermark_height <= 0 || (uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
yading@10 981 return -1;
yading@10 982
yading@10 983 buf = av_malloc(buf_len);
yading@10 984 av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n",
yading@10 985 watermark_width, watermark_height);
yading@10 986 av_log(avctx, AV_LOG_DEBUG,
yading@10 987 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
yading@10 988 u1, u2, u3, u4, offset);
yading@10 989 if (uncompress(buf, &buf_len, extradata + 8 + offset,
yading@10 990 size - offset) != Z_OK) {
yading@10 991 av_log(avctx, AV_LOG_ERROR,
yading@10 992 "could not uncompress watermark logo\n");
yading@10 993 av_free(buf);
yading@10 994 return -1;
yading@10 995 }
yading@10 996 s->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
yading@10 997 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
yading@10 998 av_log(avctx, AV_LOG_DEBUG,
yading@10 999 "watermark key %#x\n", s->watermark_key);
yading@10 1000 av_free(buf);
yading@10 1001 #else
yading@10 1002 av_log(avctx, AV_LOG_ERROR,
yading@10 1003 "this svq3 file contains watermark which need zlib support compiled in\n");
yading@10 1004 return -1;
yading@10 1005 #endif
yading@10 1006 }
yading@10 1007 }
yading@10 1008
yading@10 1009 h->width = avctx->width;
yading@10 1010 h->height = avctx->height;
yading@10 1011 h->mb_width = (h->width + 15) / 16;
yading@10 1012 h->mb_height = (h->height + 15) / 16;
yading@10 1013 h->mb_stride = h->mb_width + 1;
yading@10 1014 h->mb_num = h->mb_width * h->mb_height;
yading@10 1015 h->b_stride = 4 * h->mb_width;
yading@10 1016 s->h_edge_pos = h->mb_width * 16;
yading@10 1017 s->v_edge_pos = h->mb_height * 16;
yading@10 1018
yading@10 1019 if (ff_h264_alloc_tables(h) < 0) {
yading@10 1020 av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n");
yading@10 1021 return AVERROR(ENOMEM);
yading@10 1022 }
yading@10 1023
yading@10 1024 return 0;
yading@10 1025 }
yading@10 1026
yading@10 1027 static void free_picture(AVCodecContext *avctx, Picture *pic)
yading@10 1028 {
yading@10 1029 int i;
yading@10 1030 for (i = 0; i < 2; i++) {
yading@10 1031 av_buffer_unref(&pic->motion_val_buf[i]);
yading@10 1032 av_buffer_unref(&pic->ref_index_buf[i]);
yading@10 1033 }
yading@10 1034 av_buffer_unref(&pic->mb_type_buf);
yading@10 1035
yading@10 1036 av_frame_unref(&pic->f);
yading@10 1037 }
yading@10 1038
yading@10 1039 static int get_buffer(AVCodecContext *avctx, Picture *pic)
yading@10 1040 {
yading@10 1041 SVQ3Context *s = avctx->priv_data;
yading@10 1042 H264Context *h = &s->h;
yading@10 1043 const int big_mb_num = h->mb_stride * (h->mb_height + 1) + 1;
yading@10 1044 const int mb_array_size = h->mb_stride * h->mb_height;
yading@10 1045 const int b4_stride = h->mb_width * 4 + 1;
yading@10 1046 const int b4_array_size = b4_stride * h->mb_height * 4;
yading@10 1047 int ret;
yading@10 1048
yading@10 1049 if (!pic->motion_val_buf[0]) {
yading@10 1050 int i;
yading@10 1051
yading@10 1052 pic->mb_type_buf = av_buffer_allocz((big_mb_num + h->mb_stride) * sizeof(uint32_t));
yading@10 1053 if (!pic->mb_type_buf)
yading@10 1054 return AVERROR(ENOMEM);
yading@10 1055 pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * h->mb_stride + 1;
yading@10 1056
yading@10 1057 for (i = 0; i < 2; i++) {
yading@10 1058 pic->motion_val_buf[i] = av_buffer_allocz(2 * (b4_array_size + 4) * sizeof(int16_t));
yading@10 1059 pic->ref_index_buf[i] = av_buffer_allocz(4 * mb_array_size);
yading@10 1060 if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) {
yading@10 1061 ret = AVERROR(ENOMEM);
yading@10 1062 goto fail;
yading@10 1063 }
yading@10 1064
yading@10 1065 pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
yading@10 1066 pic->ref_index[i] = pic->ref_index_buf[i]->data;
yading@10 1067 }
yading@10 1068 }
yading@10 1069 pic->reference = !(h->pict_type == AV_PICTURE_TYPE_B);
yading@10 1070
yading@10 1071 ret = ff_get_buffer(avctx, &pic->f,
yading@10 1072 pic->reference ? AV_GET_BUFFER_FLAG_REF : 0);
yading@10 1073 if (ret < 0)
yading@10 1074 goto fail;
yading@10 1075
yading@10 1076 if (!h->edge_emu_buffer) {
yading@10 1077 h->edge_emu_buffer = av_mallocz(pic->f.linesize[0] * 17);
yading@10 1078 if (!h->edge_emu_buffer)
yading@10 1079 return AVERROR(ENOMEM);
yading@10 1080 }
yading@10 1081
yading@10 1082 h->linesize = pic->f.linesize[0];
yading@10 1083 h->uvlinesize = pic->f.linesize[1];
yading@10 1084
yading@10 1085 return 0;
yading@10 1086 fail:
yading@10 1087 free_picture(avctx, pic);
yading@10 1088 return ret;
yading@10 1089 }
yading@10 1090
yading@10 1091 static int svq3_decode_frame(AVCodecContext *avctx, void *data,
yading@10 1092 int *got_frame, AVPacket *avpkt)
yading@10 1093 {
yading@10 1094 SVQ3Context *s = avctx->priv_data;
yading@10 1095 H264Context *h = &s->h;
yading@10 1096 int buf_size = avpkt->size;
yading@10 1097 int left;
yading@10 1098 uint8_t *buf;
yading@10 1099 int ret, m, i;
yading@10 1100
yading@10 1101 /* special case for last picture */
yading@10 1102 if (buf_size == 0) {
yading@10 1103 if (s->next_pic->f.data[0] && !h->low_delay && !s->last_frame_output) {
yading@10 1104 ret = av_frame_ref(data, &s->next_pic->f);
yading@10 1105 if (ret < 0)
yading@10 1106 return ret;
yading@10 1107 s->last_frame_output = 1;
yading@10 1108 *got_frame = 1;
yading@10 1109 }
yading@10 1110 return 0;
yading@10 1111 }
yading@10 1112
yading@10 1113 h->mb_x = h->mb_y = h->mb_xy = 0;
yading@10 1114
yading@10 1115 if (s->watermark_key) {
yading@10 1116 av_fast_malloc(&s->buf, &s->buf_size,
yading@10 1117 buf_size+FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 1118 if (!s->buf)
yading@10 1119 return AVERROR(ENOMEM);
yading@10 1120 memcpy(s->buf, avpkt->data, buf_size);
yading@10 1121 buf = s->buf;
yading@10 1122 } else {
yading@10 1123 buf = avpkt->data;
yading@10 1124 }
yading@10 1125
yading@10 1126 init_get_bits(&h->gb, buf, 8 * buf_size);
yading@10 1127
yading@10 1128 if (svq3_decode_slice_header(avctx))
yading@10 1129 return -1;
yading@10 1130
yading@10 1131 h->pict_type = h->slice_type;
yading@10 1132
yading@10 1133 if (h->pict_type != AV_PICTURE_TYPE_B)
yading@10 1134 FFSWAP(Picture*, s->next_pic, s->last_pic);
yading@10 1135
yading@10 1136 av_frame_unref(&s->cur_pic->f);
yading@10 1137
yading@10 1138 /* for skipping the frame */
yading@10 1139 s->cur_pic->f.pict_type = h->pict_type;
yading@10 1140 s->cur_pic->f.key_frame = (h->pict_type == AV_PICTURE_TYPE_I);
yading@10 1141
yading@10 1142 ret = get_buffer(avctx, s->cur_pic);
yading@10 1143 if (ret < 0)
yading@10 1144 return ret;
yading@10 1145
yading@10 1146 h->cur_pic_ptr = s->cur_pic;
yading@10 1147 av_frame_unref(&h->cur_pic.f);
yading@10 1148 h->cur_pic = *s->cur_pic;
yading@10 1149 ret = av_frame_ref(&h->cur_pic.f, &s->cur_pic->f);
yading@10 1150 if (ret < 0)
yading@10 1151 return ret;
yading@10 1152
yading@10 1153 for (i = 0; i < 16; i++) {
yading@10 1154 h->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1155 h->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1156 }
yading@10 1157 for (i = 0; i < 16; i++) {
yading@10 1158 h->block_offset[16 + i] =
yading@10 1159 h->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1160 h->block_offset[48 + 16 + i] =
yading@10 1161 h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
yading@10 1162 }
yading@10 1163
yading@10 1164 if (h->pict_type != AV_PICTURE_TYPE_I) {
yading@10 1165 if (!s->last_pic->f.data[0]) {
yading@10 1166 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
yading@10 1167 ret = get_buffer(avctx, s->last_pic);
yading@10 1168 if (ret < 0)
yading@10 1169 return ret;
yading@10 1170 memset(s->last_pic->f.data[0], 0, avctx->height * s->last_pic->f.linesize[0]);
yading@10 1171 memset(s->last_pic->f.data[1], 0x80, (avctx->height / 2) *
yading@10 1172 s->last_pic->f.linesize[1]);
yading@10 1173 memset(s->last_pic->f.data[2], 0x80, (avctx->height / 2) *
yading@10 1174 s->last_pic->f.linesize[2]);
yading@10 1175 }
yading@10 1176
yading@10 1177 if (h->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f.data[0]) {
yading@10 1178 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
yading@10 1179 ret = get_buffer(avctx, s->next_pic);
yading@10 1180 if (ret < 0)
yading@10 1181 return ret;
yading@10 1182 memset(s->next_pic->f.data[0], 0, avctx->height * s->next_pic->f.linesize[0]);
yading@10 1183 memset(s->next_pic->f.data[1], 0x80, (avctx->height / 2) *
yading@10 1184 s->next_pic->f.linesize[1]);
yading@10 1185 memset(s->next_pic->f.data[2], 0x80, (avctx->height / 2) *
yading@10 1186 s->next_pic->f.linesize[2]);
yading@10 1187 }
yading@10 1188 }
yading@10 1189
yading@10 1190 if (avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1191 av_log(h->avctx, AV_LOG_DEBUG,
yading@10 1192 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
yading@10 1193 av_get_picture_type_char(h->pict_type),
yading@10 1194 s->halfpel_flag, s->thirdpel_flag,
yading@10 1195 s->adaptive_quant, h->qscale, h->slice_num);
yading@10 1196
yading@10 1197 if (avctx->skip_frame >= AVDISCARD_NONREF && h->pict_type == AV_PICTURE_TYPE_B ||
yading@10 1198 avctx->skip_frame >= AVDISCARD_NONKEY && h->pict_type != AV_PICTURE_TYPE_I ||
yading@10 1199 avctx->skip_frame >= AVDISCARD_ALL)
yading@10 1200 return 0;
yading@10 1201
yading@10 1202 if (s->next_p_frame_damaged) {
yading@10 1203 if (h->pict_type == AV_PICTURE_TYPE_B)
yading@10 1204 return 0;
yading@10 1205 else
yading@10 1206 s->next_p_frame_damaged = 0;
yading@10 1207 }
yading@10 1208
yading@10 1209 if (h->pict_type == AV_PICTURE_TYPE_B) {
yading@10 1210 h->frame_num_offset = h->slice_num - h->prev_frame_num;
yading@10 1211
yading@10 1212 if (h->frame_num_offset < 0)
yading@10 1213 h->frame_num_offset += 256;
yading@10 1214 if (h->frame_num_offset == 0 ||
yading@10 1215 h->frame_num_offset >= h->prev_frame_num_offset) {
yading@10 1216 av_log(h->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
yading@10 1217 return -1;
yading@10 1218 }
yading@10 1219 } else {
yading@10 1220 h->prev_frame_num = h->frame_num;
yading@10 1221 h->frame_num = h->slice_num;
yading@10 1222 h->prev_frame_num_offset = h->frame_num - h->prev_frame_num;
yading@10 1223
yading@10 1224 if (h->prev_frame_num_offset < 0)
yading@10 1225 h->prev_frame_num_offset += 256;
yading@10 1226 }
yading@10 1227
yading@10 1228 for (m = 0; m < 2; m++) {
yading@10 1229 int i;
yading@10 1230 for (i = 0; i < 4; i++) {
yading@10 1231 int j;
yading@10 1232 for (j = -1; j < 4; j++)
yading@10 1233 h->ref_cache[m][scan8[0] + 8 * i + j] = 1;
yading@10 1234 if (i < 3)
yading@10 1235 h->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
yading@10 1236 }
yading@10 1237 }
yading@10 1238
yading@10 1239 for (h->mb_y = 0; h->mb_y < h->mb_height; h->mb_y++) {
yading@10 1240 for (h->mb_x = 0; h->mb_x < h->mb_width; h->mb_x++) {
yading@10 1241 unsigned mb_type;
yading@10 1242 h->mb_xy = h->mb_x + h->mb_y * h->mb_stride;
yading@10 1243
yading@10 1244 if ((get_bits_count(&h->gb) + 7) >= h->gb.size_in_bits &&
yading@10 1245 ((get_bits_count(&h->gb) & 7) == 0 ||
yading@10 1246 show_bits(&h->gb, -get_bits_count(&h->gb) & 7) == 0)) {
yading@10 1247 skip_bits(&h->gb, s->next_slice_index - get_bits_count(&h->gb));
yading@10 1248 h->gb.size_in_bits = 8 * buf_size;
yading@10 1249
yading@10 1250 if (svq3_decode_slice_header(avctx))
yading@10 1251 return -1;
yading@10 1252
yading@10 1253 /* TODO: support s->mb_skip_run */
yading@10 1254 }
yading@10 1255
yading@10 1256 mb_type = svq3_get_ue_golomb(&h->gb);
yading@10 1257
yading@10 1258 if (h->pict_type == AV_PICTURE_TYPE_I)
yading@10 1259 mb_type += 8;
yading@10 1260 else if (h->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
yading@10 1261 mb_type += 4;
yading@10 1262 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
yading@10 1263 av_log(h->avctx, AV_LOG_ERROR,
yading@10 1264 "error while decoding MB %d %d\n", h->mb_x, h->mb_y);
yading@10 1265 return -1;
yading@10 1266 }
yading@10 1267
yading@10 1268 if (mb_type != 0 || h->cbp)
yading@10 1269 ff_h264_hl_decode_mb(h);
yading@10 1270
yading@10 1271 if (h->pict_type != AV_PICTURE_TYPE_B && !h->low_delay)
yading@10 1272 h->cur_pic.mb_type[h->mb_x + h->mb_y * h->mb_stride] =
yading@10 1273 (h->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
yading@10 1274 }
yading@10 1275
yading@10 1276 ff_draw_horiz_band(avctx, NULL, s->cur_pic, s->last_pic->f.data[0] ? s->last_pic : NULL,
yading@10 1277 16 * h->mb_y, 16, h->picture_structure, 0, 0,
yading@10 1278 h->low_delay, h->mb_height * 16, h->mb_width * 16);
yading@10 1279 }
yading@10 1280
yading@10 1281 left = buf_size*8 - get_bits_count(&h->gb);
yading@10 1282
yading@10 1283 if (h->mb_y != h->mb_height || h->mb_x != h->mb_width) {
yading@10 1284 av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, h->mb_y, h->mb_x, left);
yading@10 1285 //av_hex_dump(stderr, buf+buf_size-8, 8);
yading@10 1286 }
yading@10 1287
yading@10 1288 if (left < 0) {
yading@10 1289 av_log(avctx, AV_LOG_ERROR, "frame num %d left %d\n", avctx->frame_number, left);
yading@10 1290 return -1;
yading@10 1291 }
yading@10 1292
yading@10 1293 if (h->pict_type == AV_PICTURE_TYPE_B || h->low_delay)
yading@10 1294 ret = av_frame_ref(data, &s->cur_pic->f);
yading@10 1295 else if (s->last_pic->f.data[0])
yading@10 1296 ret = av_frame_ref(data, &s->last_pic->f);
yading@10 1297 if (ret < 0)
yading@10 1298 return ret;
yading@10 1299
yading@10 1300 /* Do not output the last pic after seeking. */
yading@10 1301 if (s->last_pic->f.data[0] || h->low_delay)
yading@10 1302 *got_frame = 1;
yading@10 1303
yading@10 1304 if (h->pict_type != AV_PICTURE_TYPE_B) {
yading@10 1305 FFSWAP(Picture*, s->cur_pic, s->next_pic);
yading@10 1306 } else {
yading@10 1307 av_frame_unref(&s->cur_pic->f);
yading@10 1308 }
yading@10 1309
yading@10 1310 return buf_size;
yading@10 1311 }
yading@10 1312
yading@10 1313 static int svq3_decode_end(AVCodecContext *avctx)
yading@10 1314 {
yading@10 1315 SVQ3Context *s = avctx->priv_data;
yading@10 1316 H264Context *h = &s->h;
yading@10 1317
yading@10 1318 free_picture(avctx, s->cur_pic);
yading@10 1319 free_picture(avctx, s->next_pic);
yading@10 1320 free_picture(avctx, s->last_pic);
yading@10 1321 av_freep(&s->cur_pic);
yading@10 1322 av_freep(&s->next_pic);
yading@10 1323 av_freep(&s->last_pic);
yading@10 1324
yading@10 1325 av_frame_unref(&h->cur_pic.f);
yading@10 1326
yading@10 1327 ff_h264_free_context(h);
yading@10 1328
yading@10 1329 av_freep(&s->buf);
yading@10 1330 s->buf_size = 0;
yading@10 1331 av_freep(&h->edge_emu_buffer);
yading@10 1332
yading@10 1333 return 0;
yading@10 1334 }
yading@10 1335
yading@10 1336 AVCodec ff_svq3_decoder = {
yading@10 1337 .name = "svq3",
yading@10 1338 .type = AVMEDIA_TYPE_VIDEO,
yading@10 1339 .id = AV_CODEC_ID_SVQ3,
yading@10 1340 .priv_data_size = sizeof(SVQ3Context),
yading@10 1341 .init = svq3_decode_init,
yading@10 1342 .close = svq3_decode_end,
yading@10 1343 .decode = svq3_decode_frame,
yading@10 1344 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND |
yading@10 1345 CODEC_CAP_DR1 |
yading@10 1346 CODEC_CAP_DELAY,
yading@10 1347 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
yading@10 1348 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P,
yading@10 1349 AV_PIX_FMT_NONE},
yading@10 1350 };