You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4159 lines
154KB

  1. /*
  2. * VC-1 and WMV3 decoder
  3. * Copyright (c) 2006-2007 Konstantin Shishkov
  4. * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
  5. *
  6. * This file is part of FFmpeg.
  7. *
  8. * FFmpeg is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * FFmpeg is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with FFmpeg; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. /**
  23. * @file
  24. * VC-1 and WMV3 decoder
  25. *
  26. */
  27. #include "internal.h"
  28. #include "dsputil.h"
  29. #include "avcodec.h"
  30. #include "mpegvideo.h"
  31. #include "h263.h"
  32. #include "vc1.h"
  33. #include "vc1data.h"
  34. #include "vc1acdata.h"
  35. #include "msmpeg4data.h"
  36. #include "unary.h"
  37. #include "simple_idct.h"
  38. #include "mathops.h"
  39. #include "vdpau_internal.h"
  40. #undef NDEBUG
  41. #include <assert.h>
  42. #define MB_INTRA_VLC_BITS 9
  43. #define DC_VLC_BITS 9
  44. #define AC_VLC_BITS 9
  45. static const uint16_t vlc_offs[] = {
  46. 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436,
  47. 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8620,
  48. 9262, 10202, 10756, 11310, 12228, 15078
  49. };
  50. /**
  51. * Init VC-1 specific tables and VC1Context members
  52. * @param v The VC1Context to initialize
  53. * @return Status
  54. */
  55. static int vc1_init_common(VC1Context *v)
  56. {
  57. static int done = 0;
  58. int i = 0;
  59. static VLC_TYPE vlc_table[15078][2];
  60. v->hrd_rate = v->hrd_buffer = NULL;
  61. /* VLC tables */
  62. if(!done)
  63. {
  64. INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
  65. ff_vc1_bfraction_bits, 1, 1,
  66. ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
  67. INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
  68. ff_vc1_norm2_bits, 1, 1,
  69. ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
  70. INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
  71. ff_vc1_norm6_bits, 1, 1,
  72. ff_vc1_norm6_codes, 2, 2, 556);
  73. INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
  74. ff_vc1_imode_bits, 1, 1,
  75. ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
  76. for (i=0; i<3; i++)
  77. {
  78. ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i*3+0]];
  79. ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i*3+1] - vlc_offs[i*3+0];
  80. init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
  81. ff_vc1_ttmb_bits[i], 1, 1,
  82. ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
  83. ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i*3+1]];
  84. ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i*3+2] - vlc_offs[i*3+1];
  85. init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
  86. ff_vc1_ttblk_bits[i], 1, 1,
  87. ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
  88. ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i*3+2]];
  89. ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i*3+3] - vlc_offs[i*3+2];
  90. init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
  91. ff_vc1_subblkpat_bits[i], 1, 1,
  92. ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
  93. }
  94. for(i=0; i<4; i++)
  95. {
  96. ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i*3+9]];
  97. ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i*3+10] - vlc_offs[i*3+9];
  98. init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
  99. ff_vc1_4mv_block_pattern_bits[i], 1, 1,
  100. ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
  101. ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i*3+10]];
  102. ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i*3+11] - vlc_offs[i*3+10];
  103. init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
  104. ff_vc1_cbpcy_p_bits[i], 1, 1,
  105. ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
  106. ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i*3+11]];
  107. ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i*3+12] - vlc_offs[i*3+11];
  108. init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
  109. ff_vc1_mv_diff_bits[i], 1, 1,
  110. ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
  111. }
  112. for(i=0; i<8; i++){
  113. ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i+21]];
  114. ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i+22] - vlc_offs[i+21];
  115. init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
  116. &vc1_ac_tables[i][0][1], 8, 4,
  117. &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
  118. }
  119. done = 1;
  120. }
  121. /* Other defaults */
  122. v->pq = -1;
  123. v->mvrange = 0; /* 7.1.1.18, p80 */
  124. return 0;
  125. }
  126. /***********************************************************************/
  127. /**
  128. * @name VC-1 Bitplane decoding
  129. * @see 8.7, p56
  130. * @{
  131. */
  132. /**
  133. * Imode types
  134. * @{
  135. */
  136. enum Imode {
  137. IMODE_RAW,
  138. IMODE_NORM2,
  139. IMODE_DIFF2,
  140. IMODE_NORM6,
  141. IMODE_DIFF6,
  142. IMODE_ROWSKIP,
  143. IMODE_COLSKIP
  144. };
  145. /** @} */ //imode defines
  146. /** @} */ //Bitplane group
  147. static void vc1_put_signed_blocks_clamped(VC1Context *v)
  148. {
  149. MpegEncContext *s = &v->s;
  150. /* The put pixels loop is always one MB row behind the decoding loop,
  151. * because we can only put pixels when overlap filtering is done, and
  152. * for filtering of the bottom edge of a MB, we need the next MB row
  153. * present as well.
  154. * Within the row, the put pixels loop is also one MB col behind the
  155. * decoding loop. The reason for this is again, because for filtering
  156. * of the right MB edge, we need the next MB present. */
  157. if (!s->first_slice_line) {
  158. if (s->mb_x) {
  159. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
  160. s->dest[0] - 16 * s->linesize - 16,
  161. s->linesize);
  162. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
  163. s->dest[0] - 16 * s->linesize - 8,
  164. s->linesize);
  165. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
  166. s->dest[0] - 8 * s->linesize - 16,
  167. s->linesize);
  168. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
  169. s->dest[0] - 8 * s->linesize - 8,
  170. s->linesize);
  171. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
  172. s->dest[1] - 8 * s->uvlinesize - 8,
  173. s->uvlinesize);
  174. s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
  175. s->dest[2] - 8 * s->uvlinesize - 8,
  176. s->uvlinesize);
  177. }
  178. if (s->mb_x == s->mb_width - 1) {
  179. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
  180. s->dest[0] - 16 * s->linesize,
  181. s->linesize);
  182. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
  183. s->dest[0] - 16 * s->linesize + 8,
  184. s->linesize);
  185. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
  186. s->dest[0] - 8 * s->linesize,
  187. s->linesize);
  188. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
  189. s->dest[0] - 8 * s->linesize + 8,
  190. s->linesize);
  191. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
  192. s->dest[1] - 8 * s->uvlinesize,
  193. s->uvlinesize);
  194. s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
  195. s->dest[2] - 8 * s->uvlinesize,
  196. s->uvlinesize);
  197. }
  198. }
  199. #define inc_blk_idx(idx) do { \
  200. idx++; \
  201. if (idx >= v->n_allocated_blks) \
  202. idx = 0; \
  203. } while (0)
  204. inc_blk_idx(v->topleft_blk_idx);
  205. inc_blk_idx(v->top_blk_idx);
  206. inc_blk_idx(v->left_blk_idx);
  207. inc_blk_idx(v->cur_blk_idx);
  208. }
  209. static void vc1_loop_filter_iblk(VC1Context *v, int pq)
  210. {
  211. MpegEncContext *s = &v->s;
  212. int j;
  213. if (!s->first_slice_line) {
  214. v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
  215. if (s->mb_x)
  216. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
  217. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
  218. for(j = 0; j < 2; j++){
  219. v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
  220. if (s->mb_x)
  221. v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
  222. }
  223. }
  224. v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
  225. if (s->mb_y == s->end_mb_y-1) {
  226. if (s->mb_x) {
  227. v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
  228. v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
  229. v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
  230. }
  231. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
  232. }
  233. }
  234. static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
  235. {
  236. MpegEncContext *s = &v->s;
  237. int j;
  238. /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
  239. * means it runs two rows/cols behind the decoding loop. */
  240. if (!s->first_slice_line) {
  241. if (s->mb_x) {
  242. if (s->mb_y >= s->start_mb_y + 2) {
  243. v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
  244. if (s->mb_x >= 2)
  245. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
  246. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
  247. for(j = 0; j < 2; j++) {
  248. v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
  249. if (s->mb_x >= 2) {
  250. v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
  251. }
  252. }
  253. }
  254. v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
  255. }
  256. if (s->mb_x == s->mb_width - 1) {
  257. if (s->mb_y >= s->start_mb_y + 2) {
  258. v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
  259. if (s->mb_x)
  260. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
  261. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
  262. for(j = 0; j < 2; j++) {
  263. v->vc1dsp.vc1_v_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize, s->uvlinesize, pq);
  264. if (s->mb_x >= 2) {
  265. v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 16 * s->uvlinesize, s->uvlinesize, pq);
  266. }
  267. }
  268. }
  269. v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
  270. }
  271. if (s->mb_y == s->end_mb_y) {
  272. if (s->mb_x) {
  273. if (s->mb_x >= 2)
  274. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
  275. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
  276. if (s->mb_x >= 2) {
  277. for(j = 0; j < 2; j++) {
  278. v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
  279. }
  280. }
  281. }
  282. if (s->mb_x == s->mb_width - 1) {
  283. if (s->mb_x)
  284. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
  285. v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
  286. if (s->mb_x) {
  287. for(j = 0; j < 2; j++) {
  288. v->vc1dsp.vc1_h_loop_filter8(s->dest[j+1] - 8 * s->uvlinesize, s->uvlinesize, pq);
  289. }
  290. }
  291. }
  292. }
  293. }
  294. }
  295. static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
  296. {
  297. MpegEncContext *s = &v->s;
  298. int mb_pos;
  299. if (v->condover == CONDOVER_NONE)
  300. return;
  301. mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  302. /* Within a MB, the horizontal overlap always runs before the vertical.
  303. * To accomplish that, we run the H on left and internal borders of the
  304. * currently decoded MB. Then, we wait for the next overlap iteration
  305. * to do H overlap on the right edge of this MB, before moving over and
  306. * running the V overlap. Therefore, the V overlap makes us trail by one
  307. * MB col and the H overlap filter makes us trail by one MB row. This
  308. * is reflected in the time at which we run the put_pixels loop. */
  309. if(v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
  310. if(s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
  311. v->over_flags_plane[mb_pos - 1])) {
  312. v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
  313. v->block[v->cur_blk_idx][0]);
  314. v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
  315. v->block[v->cur_blk_idx][2]);
  316. if(!(s->flags & CODEC_FLAG_GRAY)) {
  317. v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
  318. v->block[v->cur_blk_idx][4]);
  319. v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
  320. v->block[v->cur_blk_idx][5]);
  321. }
  322. }
  323. v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
  324. v->block[v->cur_blk_idx][1]);
  325. v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
  326. v->block[v->cur_blk_idx][3]);
  327. if (s->mb_x == s->mb_width - 1) {
  328. if(!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
  329. v->over_flags_plane[mb_pos - s->mb_stride])) {
  330. v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
  331. v->block[v->cur_blk_idx][0]);
  332. v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
  333. v->block[v->cur_blk_idx][1]);
  334. if(!(s->flags & CODEC_FLAG_GRAY)) {
  335. v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
  336. v->block[v->cur_blk_idx][4]);
  337. v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
  338. v->block[v->cur_blk_idx][5]);
  339. }
  340. }
  341. v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
  342. v->block[v->cur_blk_idx][2]);
  343. v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
  344. v->block[v->cur_blk_idx][3]);
  345. }
  346. }
  347. if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
  348. if(!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
  349. v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
  350. v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
  351. v->block[v->left_blk_idx][0]);
  352. v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
  353. v->block[v->left_blk_idx][1]);
  354. if(!(s->flags & CODEC_FLAG_GRAY)) {
  355. v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
  356. v->block[v->left_blk_idx][4]);
  357. v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
  358. v->block[v->left_blk_idx][5]);
  359. }
  360. }
  361. v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
  362. v->block[v->left_blk_idx][2]);
  363. v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
  364. v->block[v->left_blk_idx][3]);
  365. }
  366. }
  367. /** Do motion compensation over 1 macroblock
  368. * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
  369. */
  370. static void vc1_mc_1mv(VC1Context *v, int dir)
  371. {
  372. MpegEncContext *s = &v->s;
  373. DSPContext *dsp = &v->s.dsp;
  374. uint8_t *srcY, *srcU, *srcV;
  375. int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
  376. if(!v->s.last_picture.f.data[0])return;
  377. mx = s->mv[dir][0][0];
  378. my = s->mv[dir][0][1];
  379. // store motion vectors for further use in B frames
  380. if(s->pict_type == AV_PICTURE_TYPE_P) {
  381. s->current_picture.f.motion_val[1][s->block_index[0]][0] = mx;
  382. s->current_picture.f.motion_val[1][s->block_index[0]][1] = my;
  383. }
  384. uvmx = (mx + ((mx & 3) == 3)) >> 1;
  385. uvmy = (my + ((my & 3) == 3)) >> 1;
  386. v->luma_mv[s->mb_x][0] = uvmx;
  387. v->luma_mv[s->mb_x][1] = uvmy;
  388. if(v->fastuvmc) {
  389. uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
  390. uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
  391. }
  392. if(!dir) {
  393. srcY = s->last_picture.f.data[0];
  394. srcU = s->last_picture.f.data[1];
  395. srcV = s->last_picture.f.data[2];
  396. } else {
  397. srcY = s->next_picture.f.data[0];
  398. srcU = s->next_picture.f.data[1];
  399. srcV = s->next_picture.f.data[2];
  400. }
  401. src_x = s->mb_x * 16 + (mx >> 2);
  402. src_y = s->mb_y * 16 + (my >> 2);
  403. uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
  404. uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
  405. if(v->profile != PROFILE_ADVANCED){
  406. src_x = av_clip( src_x, -16, s->mb_width * 16);
  407. src_y = av_clip( src_y, -16, s->mb_height * 16);
  408. uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
  409. uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
  410. }else{
  411. src_x = av_clip( src_x, -17, s->avctx->coded_width);
  412. src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
  413. uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
  414. uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
  415. }
  416. srcY += src_y * s->linesize + src_x;
  417. srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
  418. srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
  419. /* for grayscale we should not try to read from unknown area */
  420. if(s->flags & CODEC_FLAG_GRAY) {
  421. srcU = s->edge_emu_buffer + 18 * s->linesize;
  422. srcV = s->edge_emu_buffer + 18 * s->linesize;
  423. }
  424. if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
  425. || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
  426. || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
  427. uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
  428. srcY -= s->mspel * (1 + s->linesize);
  429. s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
  430. src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
  431. srcY = s->edge_emu_buffer;
  432. s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
  433. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  434. s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
  435. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  436. srcU = uvbuf;
  437. srcV = uvbuf + 16;
  438. /* if we deal with range reduction we need to scale source blocks */
  439. if(v->rangeredfrm) {
  440. int i, j;
  441. uint8_t *src, *src2;
  442. src = srcY;
  443. for(j = 0; j < 17 + s->mspel*2; j++) {
  444. for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
  445. src += s->linesize;
  446. }
  447. src = srcU; src2 = srcV;
  448. for(j = 0; j < 9; j++) {
  449. for(i = 0; i < 9; i++) {
  450. src[i] = ((src[i] - 128) >> 1) + 128;
  451. src2[i] = ((src2[i] - 128) >> 1) + 128;
  452. }
  453. src += s->uvlinesize;
  454. src2 += s->uvlinesize;
  455. }
  456. }
  457. /* if we deal with intensity compensation we need to scale source blocks */
  458. if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
  459. int i, j;
  460. uint8_t *src, *src2;
  461. src = srcY;
  462. for(j = 0; j < 17 + s->mspel*2; j++) {
  463. for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
  464. src += s->linesize;
  465. }
  466. src = srcU; src2 = srcV;
  467. for(j = 0; j < 9; j++) {
  468. for(i = 0; i < 9; i++) {
  469. src[i] = v->lutuv[src[i]];
  470. src2[i] = v->lutuv[src2[i]];
  471. }
  472. src += s->uvlinesize;
  473. src2 += s->uvlinesize;
  474. }
  475. }
  476. srcY += s->mspel * (1 + s->linesize);
  477. }
  478. if(s->mspel) {
  479. dxy = ((my & 3) << 2) | (mx & 3);
  480. v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
  481. v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
  482. srcY += s->linesize * 8;
  483. v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
  484. v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
  485. } else { // hpel mc - always used for luma
  486. dxy = (my & 2) | ((mx & 2) >> 1);
  487. if(!v->rnd)
  488. dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
  489. else
  490. dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
  491. }
  492. if(s->flags & CODEC_FLAG_GRAY) return;
  493. /* Chroma MC always uses qpel bilinear */
  494. uvmx = (uvmx&3)<<1;
  495. uvmy = (uvmy&3)<<1;
  496. if(!v->rnd){
  497. dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  498. dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  499. }else{
  500. v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  501. v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  502. }
  503. }
  504. /** Do motion compensation for 4-MV macroblock - luminance block
  505. */
  506. static void vc1_mc_4mv_luma(VC1Context *v, int n)
  507. {
  508. MpegEncContext *s = &v->s;
  509. DSPContext *dsp = &v->s.dsp;
  510. uint8_t *srcY;
  511. int dxy, mx, my, src_x, src_y;
  512. int off;
  513. if(!v->s.last_picture.f.data[0])return;
  514. mx = s->mv[0][n][0];
  515. my = s->mv[0][n][1];
  516. srcY = s->last_picture.f.data[0];
  517. off = s->linesize * 4 * (n&2) + (n&1) * 8;
  518. src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
  519. src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
  520. if(v->profile != PROFILE_ADVANCED){
  521. src_x = av_clip( src_x, -16, s->mb_width * 16);
  522. src_y = av_clip( src_y, -16, s->mb_height * 16);
  523. }else{
  524. src_x = av_clip( src_x, -17, s->avctx->coded_width);
  525. src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
  526. }
  527. srcY += src_y * s->linesize + src_x;
  528. if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
  529. || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
  530. || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){
  531. srcY -= s->mspel * (1 + s->linesize);
  532. s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
  533. src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
  534. srcY = s->edge_emu_buffer;
  535. /* if we deal with range reduction we need to scale source blocks */
  536. if(v->rangeredfrm) {
  537. int i, j;
  538. uint8_t *src;
  539. src = srcY;
  540. for(j = 0; j < 9 + s->mspel*2; j++) {
  541. for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
  542. src += s->linesize;
  543. }
  544. }
  545. /* if we deal with intensity compensation we need to scale source blocks */
  546. if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
  547. int i, j;
  548. uint8_t *src;
  549. src = srcY;
  550. for(j = 0; j < 9 + s->mspel*2; j++) {
  551. for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
  552. src += s->linesize;
  553. }
  554. }
  555. srcY += s->mspel * (1 + s->linesize);
  556. }
  557. if(s->mspel) {
  558. dxy = ((my & 3) << 2) | (mx & 3);
  559. v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
  560. } else { // hpel mc - always used for luma
  561. dxy = (my & 2) | ((mx & 2) >> 1);
  562. if(!v->rnd)
  563. dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
  564. else
  565. dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
  566. }
  567. }
  568. static inline int median4(int a, int b, int c, int d)
  569. {
  570. if(a < b) {
  571. if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
  572. else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
  573. } else {
  574. if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
  575. else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
  576. }
  577. }
  578. /** Do motion compensation for 4-MV macroblock - both chroma blocks
  579. */
  580. static void vc1_mc_4mv_chroma(VC1Context *v)
  581. {
  582. MpegEncContext *s = &v->s;
  583. DSPContext *dsp = &v->s.dsp;
  584. uint8_t *srcU, *srcV;
  585. int uvmx, uvmy, uvsrc_x, uvsrc_y;
  586. int i, idx, tx = 0, ty = 0;
  587. int mvx[4], mvy[4], intra[4];
  588. static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
  589. if(!v->s.last_picture.f.data[0])return;
  590. if(s->flags & CODEC_FLAG_GRAY) return;
  591. for(i = 0; i < 4; i++) {
  592. mvx[i] = s->mv[0][i][0];
  593. mvy[i] = s->mv[0][i][1];
  594. intra[i] = v->mb_type[0][s->block_index[i]];
  595. }
  596. /* calculate chroma MV vector from four luma MVs */
  597. idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
  598. if(!idx) { // all blocks are inter
  599. tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
  600. ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
  601. } else if(count[idx] == 1) { // 3 inter blocks
  602. switch(idx) {
  603. case 0x1:
  604. tx = mid_pred(mvx[1], mvx[2], mvx[3]);
  605. ty = mid_pred(mvy[1], mvy[2], mvy[3]);
  606. break;
  607. case 0x2:
  608. tx = mid_pred(mvx[0], mvx[2], mvx[3]);
  609. ty = mid_pred(mvy[0], mvy[2], mvy[3]);
  610. break;
  611. case 0x4:
  612. tx = mid_pred(mvx[0], mvx[1], mvx[3]);
  613. ty = mid_pred(mvy[0], mvy[1], mvy[3]);
  614. break;
  615. case 0x8:
  616. tx = mid_pred(mvx[0], mvx[1], mvx[2]);
  617. ty = mid_pred(mvy[0], mvy[1], mvy[2]);
  618. break;
  619. }
  620. } else if(count[idx] == 2) {
  621. int t1 = 0, t2 = 0;
  622. for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
  623. for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
  624. tx = (mvx[t1] + mvx[t2]) / 2;
  625. ty = (mvy[t1] + mvy[t2]) / 2;
  626. } else {
  627. s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
  628. s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
  629. v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
  630. return; //no need to do MC for inter blocks
  631. }
  632. s->current_picture.f.motion_val[1][s->block_index[0]][0] = tx;
  633. s->current_picture.f.motion_val[1][s->block_index[0]][1] = ty;
  634. uvmx = (tx + ((tx&3) == 3)) >> 1;
  635. uvmy = (ty + ((ty&3) == 3)) >> 1;
  636. v->luma_mv[s->mb_x][0] = uvmx;
  637. v->luma_mv[s->mb_x][1] = uvmy;
  638. if(v->fastuvmc) {
  639. uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
  640. uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
  641. }
  642. uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
  643. uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
  644. if(v->profile != PROFILE_ADVANCED){
  645. uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
  646. uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
  647. }else{
  648. uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
  649. uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
  650. }
  651. srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
  652. srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
  653. if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
  654. || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
  655. || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
  656. s->dsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
  657. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  658. s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
  659. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  660. srcU = s->edge_emu_buffer;
  661. srcV = s->edge_emu_buffer + 16;
  662. /* if we deal with range reduction we need to scale source blocks */
  663. if(v->rangeredfrm) {
  664. int i, j;
  665. uint8_t *src, *src2;
  666. src = srcU; src2 = srcV;
  667. for(j = 0; j < 9; j++) {
  668. for(i = 0; i < 9; i++) {
  669. src[i] = ((src[i] - 128) >> 1) + 128;
  670. src2[i] = ((src2[i] - 128) >> 1) + 128;
  671. }
  672. src += s->uvlinesize;
  673. src2 += s->uvlinesize;
  674. }
  675. }
  676. /* if we deal with intensity compensation we need to scale source blocks */
  677. if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
  678. int i, j;
  679. uint8_t *src, *src2;
  680. src = srcU; src2 = srcV;
  681. for(j = 0; j < 9; j++) {
  682. for(i = 0; i < 9; i++) {
  683. src[i] = v->lutuv[src[i]];
  684. src2[i] = v->lutuv[src2[i]];
  685. }
  686. src += s->uvlinesize;
  687. src2 += s->uvlinesize;
  688. }
  689. }
  690. }
  691. /* Chroma MC always uses qpel bilinear */
  692. uvmx = (uvmx&3)<<1;
  693. uvmy = (uvmy&3)<<1;
  694. if(!v->rnd){
  695. dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  696. dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  697. }else{
  698. v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  699. v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  700. }
  701. }
  702. /***********************************************************************/
  703. /**
  704. * @name VC-1 Block-level functions
  705. * @see 7.1.4, p91 and 8.1.1.7, p(1)04
  706. * @{
  707. */
  708. /**
  709. * @def GET_MQUANT
  710. * @brief Get macroblock-level quantizer scale
  711. */
  712. #define GET_MQUANT() \
  713. if (v->dquantfrm) \
  714. { \
  715. int edges = 0; \
  716. if (v->dqprofile == DQPROFILE_ALL_MBS) \
  717. { \
  718. if (v->dqbilevel) \
  719. { \
  720. mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
  721. } \
  722. else \
  723. { \
  724. mqdiff = get_bits(gb, 3); \
  725. if (mqdiff != 7) mquant = v->pq + mqdiff; \
  726. else mquant = get_bits(gb, 5); \
  727. } \
  728. } \
  729. if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
  730. edges = 1 << v->dqsbedge; \
  731. else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
  732. edges = (3 << v->dqsbedge) % 15; \
  733. else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
  734. edges = 15; \
  735. if((edges&1) && !s->mb_x) \
  736. mquant = v->altpq; \
  737. if((edges&2) && s->first_slice_line) \
  738. mquant = v->altpq; \
  739. if((edges&4) && s->mb_x == (s->mb_width - 1)) \
  740. mquant = v->altpq; \
  741. if((edges&8) && s->mb_y == (s->mb_height - 1)) \
  742. mquant = v->altpq; \
  743. }
  744. /**
  745. * @def GET_MVDATA(_dmv_x, _dmv_y)
  746. * @brief Get MV differentials
  747. * @see MVDATA decoding from 8.3.5.2, p(1)20
  748. * @param _dmv_x Horizontal differential for decoded MV
  749. * @param _dmv_y Vertical differential for decoded MV
  750. */
  751. #define GET_MVDATA(_dmv_x, _dmv_y) \
  752. index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\
  753. VC1_MV_DIFF_VLC_BITS, 2); \
  754. if (index > 36) \
  755. { \
  756. mb_has_coeffs = 1; \
  757. index -= 37; \
  758. } \
  759. else mb_has_coeffs = 0; \
  760. s->mb_intra = 0; \
  761. if (!index) { _dmv_x = _dmv_y = 0; } \
  762. else if (index == 35) \
  763. { \
  764. _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
  765. _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
  766. } \
  767. else if (index == 36) \
  768. { \
  769. _dmv_x = 0; \
  770. _dmv_y = 0; \
  771. s->mb_intra = 1; \
  772. } \
  773. else \
  774. { \
  775. index1 = index%6; \
  776. if (!s->quarter_sample && index1 == 5) val = 1; \
  777. else val = 0; \
  778. if(size_table[index1] - val > 0) \
  779. val = get_bits(gb, size_table[index1] - val); \
  780. else val = 0; \
  781. sign = 0 - (val&1); \
  782. _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
  783. \
  784. index1 = index/6; \
  785. if (!s->quarter_sample && index1 == 5) val = 1; \
  786. else val = 0; \
  787. if(size_table[index1] - val > 0) \
  788. val = get_bits(gb, size_table[index1] - val); \
  789. else val = 0; \
  790. sign = 0 - (val&1); \
  791. _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
  792. }
  793. /** Predict and set motion vector
  794. */
  795. static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y, int mv1, int r_x, int r_y, uint8_t* is_intra)
  796. {
  797. MpegEncContext *s = &v->s;
  798. int xy, wrap, off = 0;
  799. int16_t *A, *B, *C;
  800. int px, py;
  801. int sum;
  802. /* scale MV difference to be quad-pel */
  803. dmv_x <<= 1 - s->quarter_sample;
  804. dmv_y <<= 1 - s->quarter_sample;
  805. wrap = s->b8_stride;
  806. xy = s->block_index[n];
  807. if(s->mb_intra){
  808. s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = 0;
  809. s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = 0;
  810. s->current_picture.f.motion_val[1][xy][0] = 0;
  811. s->current_picture.f.motion_val[1][xy][1] = 0;
  812. if(mv1) { /* duplicate motion data for 1-MV block */
  813. s->current_picture.f.motion_val[0][xy + 1][0] = 0;
  814. s->current_picture.f.motion_val[0][xy + 1][1] = 0;
  815. s->current_picture.f.motion_val[0][xy + wrap][0] = 0;
  816. s->current_picture.f.motion_val[0][xy + wrap][1] = 0;
  817. s->current_picture.f.motion_val[0][xy + wrap + 1][0] = 0;
  818. s->current_picture.f.motion_val[0][xy + wrap + 1][1] = 0;
  819. v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
  820. s->current_picture.f.motion_val[1][xy + 1][0] = 0;
  821. s->current_picture.f.motion_val[1][xy + 1][1] = 0;
  822. s->current_picture.f.motion_val[1][xy + wrap][0] = 0;
  823. s->current_picture.f.motion_val[1][xy + wrap][1] = 0;
  824. s->current_picture.f.motion_val[1][xy + wrap + 1][0] = 0;
  825. s->current_picture.f.motion_val[1][xy + wrap + 1][1] = 0;
  826. }
  827. return;
  828. }
  829. C = s->current_picture.f.motion_val[0][xy - 1];
  830. A = s->current_picture.f.motion_val[0][xy - wrap];
  831. if(mv1)
  832. off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
  833. else {
  834. //in 4-MV mode different blocks have different B predictor position
  835. switch(n){
  836. case 0:
  837. off = (s->mb_x > 0) ? -1 : 1;
  838. break;
  839. case 1:
  840. off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
  841. break;
  842. case 2:
  843. off = 1;
  844. break;
  845. case 3:
  846. off = -1;
  847. }
  848. }
  849. B = s->current_picture.f.motion_val[0][xy - wrap + off];
  850. if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
  851. if(s->mb_width == 1) {
  852. px = A[0];
  853. py = A[1];
  854. } else {
  855. px = mid_pred(A[0], B[0], C[0]);
  856. py = mid_pred(A[1], B[1], C[1]);
  857. }
  858. } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
  859. px = C[0];
  860. py = C[1];
  861. } else {
  862. px = py = 0;
  863. }
  864. /* Pullback MV as specified in 8.3.5.3.4 */
  865. {
  866. int qx, qy, X, Y;
  867. qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
  868. qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
  869. X = (s->mb_width << 6) - 4;
  870. Y = (s->mb_height << 6) - 4;
  871. if(mv1) {
  872. if(qx + px < -60) px = -60 - qx;
  873. if(qy + py < -60) py = -60 - qy;
  874. } else {
  875. if(qx + px < -28) px = -28 - qx;
  876. if(qy + py < -28) py = -28 - qy;
  877. }
  878. if(qx + px > X) px = X - qx;
  879. if(qy + py > Y) py = Y - qy;
  880. }
  881. /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
  882. if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
  883. if(is_intra[xy - wrap])
  884. sum = FFABS(px) + FFABS(py);
  885. else
  886. sum = FFABS(px - A[0]) + FFABS(py - A[1]);
  887. if(sum > 32) {
  888. if(get_bits1(&s->gb)) {
  889. px = A[0];
  890. py = A[1];
  891. } else {
  892. px = C[0];
  893. py = C[1];
  894. }
  895. } else {
  896. if(is_intra[xy - 1])
  897. sum = FFABS(px) + FFABS(py);
  898. else
  899. sum = FFABS(px - C[0]) + FFABS(py - C[1]);
  900. if(sum > 32) {
  901. if(get_bits1(&s->gb)) {
  902. px = A[0];
  903. py = A[1];
  904. } else {
  905. px = C[0];
  906. py = C[1];
  907. }
  908. }
  909. }
  910. }
  911. /* store MV using signed modulus of MV range defined in 4.11 */
  912. s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
  913. s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
  914. if(mv1) { /* duplicate motion data for 1-MV block */
  915. s->current_picture.f.motion_val[0][xy + 1][0] = s->current_picture.f.motion_val[0][xy][0];
  916. s->current_picture.f.motion_val[0][xy + 1][1] = s->current_picture.f.motion_val[0][xy][1];
  917. s->current_picture.f.motion_val[0][xy + wrap][0] = s->current_picture.f.motion_val[0][xy][0];
  918. s->current_picture.f.motion_val[0][xy + wrap][1] = s->current_picture.f.motion_val[0][xy][1];
  919. s->current_picture.f.motion_val[0][xy + wrap + 1][0] = s->current_picture.f.motion_val[0][xy][0];
  920. s->current_picture.f.motion_val[0][xy + wrap + 1][1] = s->current_picture.f.motion_val[0][xy][1];
  921. }
  922. }
  923. /** Motion compensation for direct or interpolated blocks in B-frames
  924. */
  925. static void vc1_interp_mc(VC1Context *v)
  926. {
  927. MpegEncContext *s = &v->s;
  928. DSPContext *dsp = &v->s.dsp;
  929. uint8_t *srcY, *srcU, *srcV;
  930. int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
  931. if(!v->s.next_picture.f.data[0])return;
  932. mx = s->mv[1][0][0];
  933. my = s->mv[1][0][1];
  934. uvmx = (mx + ((mx & 3) == 3)) >> 1;
  935. uvmy = (my + ((my & 3) == 3)) >> 1;
  936. if(v->fastuvmc) {
  937. uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
  938. uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
  939. }
  940. srcY = s->next_picture.f.data[0];
  941. srcU = s->next_picture.f.data[1];
  942. srcV = s->next_picture.f.data[2];
  943. src_x = s->mb_x * 16 + (mx >> 2);
  944. src_y = s->mb_y * 16 + (my >> 2);
  945. uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
  946. uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
  947. if(v->profile != PROFILE_ADVANCED){
  948. src_x = av_clip( src_x, -16, s->mb_width * 16);
  949. src_y = av_clip( src_y, -16, s->mb_height * 16);
  950. uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
  951. uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
  952. }else{
  953. src_x = av_clip( src_x, -17, s->avctx->coded_width);
  954. src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
  955. uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
  956. uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
  957. }
  958. srcY += src_y * s->linesize + src_x;
  959. srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
  960. srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
  961. /* for grayscale we should not try to read from unknown area */
  962. if(s->flags & CODEC_FLAG_GRAY) {
  963. srcU = s->edge_emu_buffer + 18 * s->linesize;
  964. srcV = s->edge_emu_buffer + 18 * s->linesize;
  965. }
  966. if(v->rangeredfrm
  967. || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
  968. || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
  969. uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
  970. srcY -= s->mspel * (1 + s->linesize);
  971. s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
  972. src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
  973. srcY = s->edge_emu_buffer;
  974. s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
  975. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  976. s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
  977. uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
  978. srcU = uvbuf;
  979. srcV = uvbuf + 16;
  980. /* if we deal with range reduction we need to scale source blocks */
  981. if(v->rangeredfrm) {
  982. int i, j;
  983. uint8_t *src, *src2;
  984. src = srcY;
  985. for(j = 0; j < 17 + s->mspel*2; j++) {
  986. for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
  987. src += s->linesize;
  988. }
  989. src = srcU; src2 = srcV;
  990. for(j = 0; j < 9; j++) {
  991. for(i = 0; i < 9; i++) {
  992. src[i] = ((src[i] - 128) >> 1) + 128;
  993. src2[i] = ((src2[i] - 128) >> 1) + 128;
  994. }
  995. src += s->uvlinesize;
  996. src2 += s->uvlinesize;
  997. }
  998. }
  999. srcY += s->mspel * (1 + s->linesize);
  1000. }
  1001. if(s->mspel) {
  1002. dxy = ((my & 3) << 2) | (mx & 3);
  1003. v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
  1004. v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
  1005. srcY += s->linesize * 8;
  1006. v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
  1007. v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
  1008. } else { // hpel mc
  1009. dxy = (my & 2) | ((mx & 2) >> 1);
  1010. if(!v->rnd)
  1011. dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
  1012. else
  1013. dsp->avg_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
  1014. }
  1015. if(s->flags & CODEC_FLAG_GRAY) return;
  1016. /* Chroma MC always uses qpel blilinear */
  1017. uvmx = (uvmx&3)<<1;
  1018. uvmy = (uvmy&3)<<1;
  1019. if(!v->rnd){
  1020. dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  1021. dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  1022. }else{
  1023. v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
  1024. v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
  1025. }
  1026. }
  1027. static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
  1028. {
  1029. int n = bfrac;
  1030. #if B_FRACTION_DEN==256
  1031. if(inv)
  1032. n -= 256;
  1033. if(!qs)
  1034. return 2 * ((value * n + 255) >> 9);
  1035. return (value * n + 128) >> 8;
  1036. #else
  1037. if(inv)
  1038. n -= B_FRACTION_DEN;
  1039. if(!qs)
  1040. return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
  1041. return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
  1042. #endif
  1043. }
  1044. /** Reconstruct motion vector for B-frame and do motion compensation
  1045. */
  1046. static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
  1047. {
  1048. if(v->use_ic) {
  1049. v->mv_mode2 = v->mv_mode;
  1050. v->mv_mode = MV_PMODE_INTENSITY_COMP;
  1051. }
  1052. if(direct) {
  1053. vc1_mc_1mv(v, 0);
  1054. vc1_interp_mc(v);
  1055. if(v->use_ic) v->mv_mode = v->mv_mode2;
  1056. return;
  1057. }
  1058. if(mode == BMV_TYPE_INTERPOLATED) {
  1059. vc1_mc_1mv(v, 0);
  1060. vc1_interp_mc(v);
  1061. if(v->use_ic) v->mv_mode = v->mv_mode2;
  1062. return;
  1063. }
  1064. if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
  1065. vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
  1066. if(v->use_ic) v->mv_mode = v->mv_mode2;
  1067. }
  1068. static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
  1069. {
  1070. MpegEncContext *s = &v->s;
  1071. int xy, wrap, off = 0;
  1072. int16_t *A, *B, *C;
  1073. int px, py;
  1074. int sum;
  1075. int r_x, r_y;
  1076. const uint8_t *is_intra = v->mb_type[0];
  1077. r_x = v->range_x;
  1078. r_y = v->range_y;
  1079. /* scale MV difference to be quad-pel */
  1080. dmv_x[0] <<= 1 - s->quarter_sample;
  1081. dmv_y[0] <<= 1 - s->quarter_sample;
  1082. dmv_x[1] <<= 1 - s->quarter_sample;
  1083. dmv_y[1] <<= 1 - s->quarter_sample;
  1084. wrap = s->b8_stride;
  1085. xy = s->block_index[0];
  1086. if(s->mb_intra) {
  1087. s->current_picture.f.motion_val[0][xy][0] =
  1088. s->current_picture.f.motion_val[0][xy][1] =
  1089. s->current_picture.f.motion_val[1][xy][0] =
  1090. s->current_picture.f.motion_val[1][xy][1] = 0;
  1091. return;
  1092. }
  1093. s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
  1094. s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
  1095. s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
  1096. s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
  1097. /* Pullback predicted motion vectors as specified in 8.4.5.4 */
  1098. s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
  1099. s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
  1100. s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
  1101. s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
  1102. if(direct) {
  1103. s->current_picture.f.motion_val[0][xy][0] = s->mv[0][0][0];
  1104. s->current_picture.f.motion_val[0][xy][1] = s->mv[0][0][1];
  1105. s->current_picture.f.motion_val[1][xy][0] = s->mv[1][0][0];
  1106. s->current_picture.f.motion_val[1][xy][1] = s->mv[1][0][1];
  1107. return;
  1108. }
  1109. if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
  1110. C = s->current_picture.f.motion_val[0][xy - 2];
  1111. A = s->current_picture.f.motion_val[0][xy - wrap*2];
  1112. off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
  1113. B = s->current_picture.f.motion_val[0][xy - wrap*2 + off];
  1114. if(!s->mb_x) C[0] = C[1] = 0;
  1115. if(!s->first_slice_line) { // predictor A is not out of bounds
  1116. if(s->mb_width == 1) {
  1117. px = A[0];
  1118. py = A[1];
  1119. } else {
  1120. px = mid_pred(A[0], B[0], C[0]);
  1121. py = mid_pred(A[1], B[1], C[1]);
  1122. }
  1123. } else if(s->mb_x) { // predictor C is not out of bounds
  1124. px = C[0];
  1125. py = C[1];
  1126. } else {
  1127. px = py = 0;
  1128. }
  1129. /* Pullback MV as specified in 8.3.5.3.4 */
  1130. {
  1131. int qx, qy, X, Y;
  1132. if(v->profile < PROFILE_ADVANCED) {
  1133. qx = (s->mb_x << 5);
  1134. qy = (s->mb_y << 5);
  1135. X = (s->mb_width << 5) - 4;
  1136. Y = (s->mb_height << 5) - 4;
  1137. if(qx + px < -28) px = -28 - qx;
  1138. if(qy + py < -28) py = -28 - qy;
  1139. if(qx + px > X) px = X - qx;
  1140. if(qy + py > Y) py = Y - qy;
  1141. } else {
  1142. qx = (s->mb_x << 6);
  1143. qy = (s->mb_y << 6);
  1144. X = (s->mb_width << 6) - 4;
  1145. Y = (s->mb_height << 6) - 4;
  1146. if(qx + px < -60) px = -60 - qx;
  1147. if(qy + py < -60) py = -60 - qy;
  1148. if(qx + px > X) px = X - qx;
  1149. if(qy + py > Y) py = Y - qy;
  1150. }
  1151. }
  1152. /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
  1153. if(0 && !s->first_slice_line && s->mb_x) {
  1154. if(is_intra[xy - wrap])
  1155. sum = FFABS(px) + FFABS(py);
  1156. else
  1157. sum = FFABS(px - A[0]) + FFABS(py - A[1]);
  1158. if(sum > 32) {
  1159. if(get_bits1(&s->gb)) {
  1160. px = A[0];
  1161. py = A[1];
  1162. } else {
  1163. px = C[0];
  1164. py = C[1];
  1165. }
  1166. } else {
  1167. if(is_intra[xy - 2])
  1168. sum = FFABS(px) + FFABS(py);
  1169. else
  1170. sum = FFABS(px - C[0]) + FFABS(py - C[1]);
  1171. if(sum > 32) {
  1172. if(get_bits1(&s->gb)) {
  1173. px = A[0];
  1174. py = A[1];
  1175. } else {
  1176. px = C[0];
  1177. py = C[1];
  1178. }
  1179. }
  1180. }
  1181. }
  1182. /* store MV using signed modulus of MV range defined in 4.11 */
  1183. s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
  1184. s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
  1185. }
  1186. if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
  1187. C = s->current_picture.f.motion_val[1][xy - 2];
  1188. A = s->current_picture.f.motion_val[1][xy - wrap*2];
  1189. off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
  1190. B = s->current_picture.f.motion_val[1][xy - wrap*2 + off];
  1191. if(!s->mb_x) C[0] = C[1] = 0;
  1192. if(!s->first_slice_line) { // predictor A is not out of bounds
  1193. if(s->mb_width == 1) {
  1194. px = A[0];
  1195. py = A[1];
  1196. } else {
  1197. px = mid_pred(A[0], B[0], C[0]);
  1198. py = mid_pred(A[1], B[1], C[1]);
  1199. }
  1200. } else if(s->mb_x) { // predictor C is not out of bounds
  1201. px = C[0];
  1202. py = C[1];
  1203. } else {
  1204. px = py = 0;
  1205. }
  1206. /* Pullback MV as specified in 8.3.5.3.4 */
  1207. {
  1208. int qx, qy, X, Y;
  1209. if(v->profile < PROFILE_ADVANCED) {
  1210. qx = (s->mb_x << 5);
  1211. qy = (s->mb_y << 5);
  1212. X = (s->mb_width << 5) - 4;
  1213. Y = (s->mb_height << 5) - 4;
  1214. if(qx + px < -28) px = -28 - qx;
  1215. if(qy + py < -28) py = -28 - qy;
  1216. if(qx + px > X) px = X - qx;
  1217. if(qy + py > Y) py = Y - qy;
  1218. } else {
  1219. qx = (s->mb_x << 6);
  1220. qy = (s->mb_y << 6);
  1221. X = (s->mb_width << 6) - 4;
  1222. Y = (s->mb_height << 6) - 4;
  1223. if(qx + px < -60) px = -60 - qx;
  1224. if(qy + py < -60) py = -60 - qy;
  1225. if(qx + px > X) px = X - qx;
  1226. if(qy + py > Y) py = Y - qy;
  1227. }
  1228. }
  1229. /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
  1230. if(0 && !s->first_slice_line && s->mb_x) {
  1231. if(is_intra[xy - wrap])
  1232. sum = FFABS(px) + FFABS(py);
  1233. else
  1234. sum = FFABS(px - A[0]) + FFABS(py - A[1]);
  1235. if(sum > 32) {
  1236. if(get_bits1(&s->gb)) {
  1237. px = A[0];
  1238. py = A[1];
  1239. } else {
  1240. px = C[0];
  1241. py = C[1];
  1242. }
  1243. } else {
  1244. if(is_intra[xy - 2])
  1245. sum = FFABS(px) + FFABS(py);
  1246. else
  1247. sum = FFABS(px - C[0]) + FFABS(py - C[1]);
  1248. if(sum > 32) {
  1249. if(get_bits1(&s->gb)) {
  1250. px = A[0];
  1251. py = A[1];
  1252. } else {
  1253. px = C[0];
  1254. py = C[1];
  1255. }
  1256. }
  1257. }
  1258. }
  1259. /* store MV using signed modulus of MV range defined in 4.11 */
  1260. s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
  1261. s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
  1262. }
  1263. s->current_picture.f.motion_val[0][xy][0] = s->mv[0][0][0];
  1264. s->current_picture.f.motion_val[0][xy][1] = s->mv[0][0][1];
  1265. s->current_picture.f.motion_val[1][xy][0] = s->mv[1][0][0];
  1266. s->current_picture.f.motion_val[1][xy][1] = s->mv[1][0][1];
  1267. }
  1268. /** Get predicted DC value for I-frames only
  1269. * prediction dir: left=0, top=1
  1270. * @param s MpegEncContext
  1271. * @param overlap flag indicating that overlap filtering is used
  1272. * @param pq integer part of picture quantizer
  1273. * @param[in] n block index in the current MB
  1274. * @param dc_val_ptr Pointer to DC predictor
  1275. * @param dir_ptr Prediction direction for use in AC prediction
  1276. */
  1277. static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
  1278. int16_t **dc_val_ptr, int *dir_ptr)
  1279. {
  1280. int a, b, c, wrap, pred, scale;
  1281. int16_t *dc_val;
  1282. static const uint16_t dcpred[32] = {
  1283. -1, 1024, 512, 341, 256, 205, 171, 146, 128,
  1284. 114, 102, 93, 85, 79, 73, 68, 64,
  1285. 60, 57, 54, 51, 49, 47, 45, 43,
  1286. 41, 39, 38, 37, 35, 34, 33
  1287. };
  1288. /* find prediction - wmv3_dc_scale always used here in fact */
  1289. if (n < 4) scale = s->y_dc_scale;
  1290. else scale = s->c_dc_scale;
  1291. wrap = s->block_wrap[n];
  1292. dc_val= s->dc_val[0] + s->block_index[n];
  1293. /* B A
  1294. * C X
  1295. */
  1296. c = dc_val[ - 1];
  1297. b = dc_val[ - 1 - wrap];
  1298. a = dc_val[ - wrap];
  1299. if (pq < 9 || !overlap)
  1300. {
  1301. /* Set outer values */
  1302. if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
  1303. if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
  1304. }
  1305. else
  1306. {
  1307. /* Set outer values */
  1308. if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
  1309. if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
  1310. }
  1311. if (abs(a - b) <= abs(b - c)) {
  1312. pred = c;
  1313. *dir_ptr = 1;//left
  1314. } else {
  1315. pred = a;
  1316. *dir_ptr = 0;//top
  1317. }
  1318. /* update predictor */
  1319. *dc_val_ptr = &dc_val[0];
  1320. return pred;
  1321. }
  1322. /** Get predicted DC value
  1323. * prediction dir: left=0, top=1
  1324. * @param s MpegEncContext
  1325. * @param overlap flag indicating that overlap filtering is used
  1326. * @param pq integer part of picture quantizer
  1327. * @param[in] n block index in the current MB
  1328. * @param a_avail flag indicating top block availability
  1329. * @param c_avail flag indicating left block availability
  1330. * @param dc_val_ptr Pointer to DC predictor
  1331. * @param dir_ptr Prediction direction for use in AC prediction
  1332. */
  1333. static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
  1334. int a_avail, int c_avail,
  1335. int16_t **dc_val_ptr, int *dir_ptr)
  1336. {
  1337. int a, b, c, wrap, pred;
  1338. int16_t *dc_val;
  1339. int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  1340. int q1, q2 = 0;
  1341. wrap = s->block_wrap[n];
  1342. dc_val= s->dc_val[0] + s->block_index[n];
  1343. /* B A
  1344. * C X
  1345. */
  1346. c = dc_val[ - 1];
  1347. b = dc_val[ - 1 - wrap];
  1348. a = dc_val[ - wrap];
  1349. /* scale predictors if needed */
  1350. q1 = s->current_picture.f.qscale_table[mb_pos];
  1351. if(c_avail && (n!= 1 && n!=3)) {
  1352. q2 = s->current_picture.f.qscale_table[mb_pos - 1];
  1353. if(q2 && q2 != q1)
  1354. c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
  1355. }
  1356. if(a_avail && (n!= 2 && n!=3)) {
  1357. q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
  1358. if(q2 && q2 != q1)
  1359. a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
  1360. }
  1361. if(a_avail && c_avail && (n!=3)) {
  1362. int off = mb_pos;
  1363. if(n != 1) off--;
  1364. if(n != 2) off -= s->mb_stride;
  1365. q2 = s->current_picture.f.qscale_table[off];
  1366. if(q2 && q2 != q1)
  1367. b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
  1368. }
  1369. if(a_avail && c_avail) {
  1370. if(abs(a - b) <= abs(b - c)) {
  1371. pred = c;
  1372. *dir_ptr = 1;//left
  1373. } else {
  1374. pred = a;
  1375. *dir_ptr = 0;//top
  1376. }
  1377. } else if(a_avail) {
  1378. pred = a;
  1379. *dir_ptr = 0;//top
  1380. } else if(c_avail) {
  1381. pred = c;
  1382. *dir_ptr = 1;//left
  1383. } else {
  1384. pred = 0;
  1385. *dir_ptr = 1;//left
  1386. }
  1387. /* update predictor */
  1388. *dc_val_ptr = &dc_val[0];
  1389. return pred;
  1390. }
  1391. /** @} */ // Block group
  1392. /**
  1393. * @name VC1 Macroblock-level functions in Simple/Main Profiles
  1394. * @see 7.1.4, p91 and 8.1.1.7, p(1)04
  1395. * @{
  1396. */
  1397. static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
  1398. {
  1399. int xy, wrap, pred, a, b, c;
  1400. xy = s->block_index[n];
  1401. wrap = s->b8_stride;
  1402. /* B C
  1403. * A X
  1404. */
  1405. a = s->coded_block[xy - 1 ];
  1406. b = s->coded_block[xy - 1 - wrap];
  1407. c = s->coded_block[xy - wrap];
  1408. if (b == c) {
  1409. pred = a;
  1410. } else {
  1411. pred = c;
  1412. }
  1413. /* store value */
  1414. *coded_block_ptr = &s->coded_block[xy];
  1415. return pred;
  1416. }
  1417. /**
  1418. * Decode one AC coefficient
  1419. * @param v The VC1 context
  1420. * @param last Last coefficient
  1421. * @param skip How much zero coefficients to skip
  1422. * @param value Decoded AC coefficient value
  1423. * @param codingset set of VLC to decode data
  1424. * @see 8.1.3.4
  1425. */
  1426. static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
  1427. {
  1428. GetBitContext *gb = &v->s.gb;
  1429. int index, escape, run = 0, level = 0, lst = 0;
  1430. index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
  1431. if (index != vc1_ac_sizes[codingset] - 1) {
  1432. run = vc1_index_decode_table[codingset][index][0];
  1433. level = vc1_index_decode_table[codingset][index][1];
  1434. lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
  1435. if(get_bits1(gb))
  1436. level = -level;
  1437. } else {
  1438. escape = decode210(gb);
  1439. if (escape != 2) {
  1440. index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
  1441. run = vc1_index_decode_table[codingset][index][0];
  1442. level = vc1_index_decode_table[codingset][index][1];
  1443. lst = index >= vc1_last_decode_table[codingset];
  1444. if(escape == 0) {
  1445. if(lst)
  1446. level += vc1_last_delta_level_table[codingset][run];
  1447. else
  1448. level += vc1_delta_level_table[codingset][run];
  1449. } else {
  1450. if(lst)
  1451. run += vc1_last_delta_run_table[codingset][level] + 1;
  1452. else
  1453. run += vc1_delta_run_table[codingset][level] + 1;
  1454. }
  1455. if(get_bits1(gb))
  1456. level = -level;
  1457. } else {
  1458. int sign;
  1459. lst = get_bits1(gb);
  1460. if(v->s.esc3_level_length == 0) {
  1461. if(v->pq < 8 || v->dquantfrm) { // table 59
  1462. v->s.esc3_level_length = get_bits(gb, 3);
  1463. if(!v->s.esc3_level_length)
  1464. v->s.esc3_level_length = get_bits(gb, 2) + 8;
  1465. } else { //table 60
  1466. v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
  1467. }
  1468. v->s.esc3_run_length = 3 + get_bits(gb, 2);
  1469. }
  1470. run = get_bits(gb, v->s.esc3_run_length);
  1471. sign = get_bits1(gb);
  1472. level = get_bits(gb, v->s.esc3_level_length);
  1473. if(sign)
  1474. level = -level;
  1475. }
  1476. }
  1477. *last = lst;
  1478. *skip = run;
  1479. *value = level;
  1480. }
  1481. /** Decode intra block in intra frames - should be faster than decode_intra_block
  1482. * @param v VC1Context
  1483. * @param block block to decode
  1484. * @param[in] n subblock index
  1485. * @param coded are AC coeffs present or not
  1486. * @param codingset set of VLC to decode data
  1487. */
  1488. static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
  1489. {
  1490. GetBitContext *gb = &v->s.gb;
  1491. MpegEncContext *s = &v->s;
  1492. int dc_pred_dir = 0; /* Direction of the DC prediction used */
  1493. int i;
  1494. int16_t *dc_val;
  1495. int16_t *ac_val, *ac_val2;
  1496. int dcdiff;
  1497. /* Get DC differential */
  1498. if (n < 4) {
  1499. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1500. } else {
  1501. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1502. }
  1503. if (dcdiff < 0){
  1504. av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
  1505. return -1;
  1506. }
  1507. if (dcdiff)
  1508. {
  1509. if (dcdiff == 119 /* ESC index value */)
  1510. {
  1511. /* TODO: Optimize */
  1512. if (v->pq == 1) dcdiff = get_bits(gb, 10);
  1513. else if (v->pq == 2) dcdiff = get_bits(gb, 9);
  1514. else dcdiff = get_bits(gb, 8);
  1515. }
  1516. else
  1517. {
  1518. if (v->pq == 1)
  1519. dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
  1520. else if (v->pq == 2)
  1521. dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
  1522. }
  1523. if (get_bits1(gb))
  1524. dcdiff = -dcdiff;
  1525. }
  1526. /* Prediction */
  1527. dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
  1528. *dc_val = dcdiff;
  1529. /* Store the quantized DC coeff, used for prediction */
  1530. if (n < 4) {
  1531. block[0] = dcdiff * s->y_dc_scale;
  1532. } else {
  1533. block[0] = dcdiff * s->c_dc_scale;
  1534. }
  1535. /* Skip ? */
  1536. if (!coded) {
  1537. goto not_coded;
  1538. }
  1539. //AC Decoding
  1540. i = 1;
  1541. {
  1542. int last = 0, skip, value;
  1543. const uint8_t *zz_table;
  1544. int scale;
  1545. int k;
  1546. scale = v->pq * 2 + v->halfpq;
  1547. if(v->s.ac_pred) {
  1548. if(!dc_pred_dir)
  1549. zz_table = v->zz_8x8[2];
  1550. else
  1551. zz_table = v->zz_8x8[3];
  1552. } else
  1553. zz_table = v->zz_8x8[1];
  1554. ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
  1555. ac_val2 = ac_val;
  1556. if(dc_pred_dir) //left
  1557. ac_val -= 16;
  1558. else //top
  1559. ac_val -= 16 * s->block_wrap[n];
  1560. while (!last) {
  1561. vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
  1562. i += skip;
  1563. if(i > 63)
  1564. break;
  1565. block[zz_table[i++]] = value;
  1566. }
  1567. /* apply AC prediction if needed */
  1568. if(s->ac_pred) {
  1569. if(dc_pred_dir) { //left
  1570. for(k = 1; k < 8; k++)
  1571. block[k << v->left_blk_sh] += ac_val[k];
  1572. } else { //top
  1573. for(k = 1; k < 8; k++)
  1574. block[k << v->top_blk_sh] += ac_val[k + 8];
  1575. }
  1576. }
  1577. /* save AC coeffs for further prediction */
  1578. for(k = 1; k < 8; k++) {
  1579. ac_val2[k] = block[k << v->left_blk_sh];
  1580. ac_val2[k + 8] = block[k << v->top_blk_sh];
  1581. }
  1582. /* scale AC coeffs */
  1583. for(k = 1; k < 64; k++)
  1584. if(block[k]) {
  1585. block[k] *= scale;
  1586. if(!v->pquantizer)
  1587. block[k] += (block[k] < 0) ? -v->pq : v->pq;
  1588. }
  1589. if(s->ac_pred) i = 63;
  1590. }
  1591. not_coded:
  1592. if(!coded) {
  1593. int k, scale;
  1594. ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
  1595. ac_val2 = ac_val;
  1596. i = 0;
  1597. scale = v->pq * 2 + v->halfpq;
  1598. memset(ac_val2, 0, 16 * 2);
  1599. if(dc_pred_dir) {//left
  1600. ac_val -= 16;
  1601. if(s->ac_pred)
  1602. memcpy(ac_val2, ac_val, 8 * 2);
  1603. } else {//top
  1604. ac_val -= 16 * s->block_wrap[n];
  1605. if(s->ac_pred)
  1606. memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
  1607. }
  1608. /* apply AC prediction if needed */
  1609. if(s->ac_pred) {
  1610. if(dc_pred_dir) { //left
  1611. for(k = 1; k < 8; k++) {
  1612. block[k << v->left_blk_sh] = ac_val[k] * scale;
  1613. if(!v->pquantizer && block[k << v->left_blk_sh])
  1614. block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
  1615. }
  1616. } else { //top
  1617. for(k = 1; k < 8; k++) {
  1618. block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
  1619. if(!v->pquantizer && block[k << v->top_blk_sh])
  1620. block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
  1621. }
  1622. }
  1623. i = 63;
  1624. }
  1625. }
  1626. s->block_last_index[n] = i;
  1627. return 0;
  1628. }
  1629. /** Decode intra block in intra frames - should be faster than decode_intra_block
  1630. * @param v VC1Context
  1631. * @param block block to decode
  1632. * @param[in] n subblock number
  1633. * @param coded are AC coeffs present or not
  1634. * @param codingset set of VLC to decode data
  1635. * @param mquant quantizer value for this macroblock
  1636. */
  1637. static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
  1638. {
  1639. GetBitContext *gb = &v->s.gb;
  1640. MpegEncContext *s = &v->s;
  1641. int dc_pred_dir = 0; /* Direction of the DC prediction used */
  1642. int i;
  1643. int16_t *dc_val;
  1644. int16_t *ac_val, *ac_val2;
  1645. int dcdiff;
  1646. int a_avail = v->a_avail, c_avail = v->c_avail;
  1647. int use_pred = s->ac_pred;
  1648. int scale;
  1649. int q1, q2 = 0;
  1650. int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  1651. /* Get DC differential */
  1652. if (n < 4) {
  1653. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1654. } else {
  1655. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1656. }
  1657. if (dcdiff < 0){
  1658. av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
  1659. return -1;
  1660. }
  1661. if (dcdiff)
  1662. {
  1663. if (dcdiff == 119 /* ESC index value */)
  1664. {
  1665. /* TODO: Optimize */
  1666. if (mquant == 1) dcdiff = get_bits(gb, 10);
  1667. else if (mquant == 2) dcdiff = get_bits(gb, 9);
  1668. else dcdiff = get_bits(gb, 8);
  1669. }
  1670. else
  1671. {
  1672. if (mquant == 1)
  1673. dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
  1674. else if (mquant == 2)
  1675. dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
  1676. }
  1677. if (get_bits1(gb))
  1678. dcdiff = -dcdiff;
  1679. }
  1680. /* Prediction */
  1681. dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
  1682. *dc_val = dcdiff;
  1683. /* Store the quantized DC coeff, used for prediction */
  1684. if (n < 4) {
  1685. block[0] = dcdiff * s->y_dc_scale;
  1686. } else {
  1687. block[0] = dcdiff * s->c_dc_scale;
  1688. }
  1689. //AC Decoding
  1690. i = 1;
  1691. /* check if AC is needed at all */
  1692. if(!a_avail && !c_avail) use_pred = 0;
  1693. ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
  1694. ac_val2 = ac_val;
  1695. scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
  1696. if(dc_pred_dir) //left
  1697. ac_val -= 16;
  1698. else //top
  1699. ac_val -= 16 * s->block_wrap[n];
  1700. q1 = s->current_picture.f.qscale_table[mb_pos];
  1701. if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.f.qscale_table[mb_pos - 1];
  1702. if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
  1703. if(dc_pred_dir && n==1) q2 = q1;
  1704. if(!dc_pred_dir && n==2) q2 = q1;
  1705. if(n==3) q2 = q1;
  1706. if(coded) {
  1707. int last = 0, skip, value;
  1708. const uint8_t *zz_table;
  1709. int k;
  1710. if(v->s.ac_pred) {
  1711. if(!dc_pred_dir)
  1712. zz_table = v->zz_8x8[2];
  1713. else
  1714. zz_table = v->zz_8x8[3];
  1715. } else
  1716. zz_table = v->zz_8x8[1];
  1717. while (!last) {
  1718. vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
  1719. i += skip;
  1720. if(i > 63)
  1721. break;
  1722. block[zz_table[i++]] = value;
  1723. }
  1724. /* apply AC prediction if needed */
  1725. if(use_pred) {
  1726. /* scale predictors if needed*/
  1727. if(q2 && q1!=q2) {
  1728. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1729. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1730. if(dc_pred_dir) { //left
  1731. for(k = 1; k < 8; k++)
  1732. block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1733. } else { //top
  1734. for(k = 1; k < 8; k++)
  1735. block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1736. }
  1737. } else {
  1738. if(dc_pred_dir) { //left
  1739. for(k = 1; k < 8; k++)
  1740. block[k << v->left_blk_sh] += ac_val[k];
  1741. } else { //top
  1742. for(k = 1; k < 8; k++)
  1743. block[k << v->top_blk_sh] += ac_val[k + 8];
  1744. }
  1745. }
  1746. }
  1747. /* save AC coeffs for further prediction */
  1748. for(k = 1; k < 8; k++) {
  1749. ac_val2[k ] = block[k << v->left_blk_sh];
  1750. ac_val2[k + 8] = block[k << v->top_blk_sh];
  1751. }
  1752. /* scale AC coeffs */
  1753. for(k = 1; k < 64; k++)
  1754. if(block[k]) {
  1755. block[k] *= scale;
  1756. if(!v->pquantizer)
  1757. block[k] += (block[k] < 0) ? -mquant : mquant;
  1758. }
  1759. if(use_pred) i = 63;
  1760. } else { // no AC coeffs
  1761. int k;
  1762. memset(ac_val2, 0, 16 * 2);
  1763. if(dc_pred_dir) {//left
  1764. if(use_pred) {
  1765. memcpy(ac_val2, ac_val, 8 * 2);
  1766. if(q2 && q1!=q2) {
  1767. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1768. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1769. for(k = 1; k < 8; k++)
  1770. ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1771. }
  1772. }
  1773. } else {//top
  1774. if(use_pred) {
  1775. memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
  1776. if(q2 && q1!=q2) {
  1777. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1778. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1779. for(k = 1; k < 8; k++)
  1780. ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1781. }
  1782. }
  1783. }
  1784. /* apply AC prediction if needed */
  1785. if(use_pred) {
  1786. if(dc_pred_dir) { //left
  1787. for(k = 1; k < 8; k++) {
  1788. block[k << v->left_blk_sh] = ac_val2[k] * scale;
  1789. if(!v->pquantizer && block[k << v->left_blk_sh])
  1790. block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
  1791. }
  1792. } else { //top
  1793. for(k = 1; k < 8; k++) {
  1794. block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
  1795. if(!v->pquantizer && block[k << v->top_blk_sh])
  1796. block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
  1797. }
  1798. }
  1799. i = 63;
  1800. }
  1801. }
  1802. s->block_last_index[n] = i;
  1803. return 0;
  1804. }
  1805. /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
  1806. * @param v VC1Context
  1807. * @param block block to decode
  1808. * @param[in] n subblock index
  1809. * @param coded are AC coeffs present or not
  1810. * @param mquant block quantizer
  1811. * @param codingset set of VLC to decode data
  1812. */
  1813. static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
  1814. {
  1815. GetBitContext *gb = &v->s.gb;
  1816. MpegEncContext *s = &v->s;
  1817. int dc_pred_dir = 0; /* Direction of the DC prediction used */
  1818. int i;
  1819. int16_t *dc_val;
  1820. int16_t *ac_val, *ac_val2;
  1821. int dcdiff;
  1822. int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  1823. int a_avail = v->a_avail, c_avail = v->c_avail;
  1824. int use_pred = s->ac_pred;
  1825. int scale;
  1826. int q1, q2 = 0;
  1827. s->dsp.clear_block(block);
  1828. /* XXX: Guard against dumb values of mquant */
  1829. mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
  1830. /* Set DC scale - y and c use the same */
  1831. s->y_dc_scale = s->y_dc_scale_table[mquant];
  1832. s->c_dc_scale = s->c_dc_scale_table[mquant];
  1833. /* Get DC differential */
  1834. if (n < 4) {
  1835. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1836. } else {
  1837. dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
  1838. }
  1839. if (dcdiff < 0){
  1840. av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
  1841. return -1;
  1842. }
  1843. if (dcdiff)
  1844. {
  1845. if (dcdiff == 119 /* ESC index value */)
  1846. {
  1847. /* TODO: Optimize */
  1848. if (mquant == 1) dcdiff = get_bits(gb, 10);
  1849. else if (mquant == 2) dcdiff = get_bits(gb, 9);
  1850. else dcdiff = get_bits(gb, 8);
  1851. }
  1852. else
  1853. {
  1854. if (mquant == 1)
  1855. dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
  1856. else if (mquant == 2)
  1857. dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
  1858. }
  1859. if (get_bits1(gb))
  1860. dcdiff = -dcdiff;
  1861. }
  1862. /* Prediction */
  1863. dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
  1864. *dc_val = dcdiff;
  1865. /* Store the quantized DC coeff, used for prediction */
  1866. if (n < 4) {
  1867. block[0] = dcdiff * s->y_dc_scale;
  1868. } else {
  1869. block[0] = dcdiff * s->c_dc_scale;
  1870. }
  1871. //AC Decoding
  1872. i = 1;
  1873. /* check if AC is needed at all and adjust direction if needed */
  1874. if(!a_avail) dc_pred_dir = 1;
  1875. if(!c_avail) dc_pred_dir = 0;
  1876. if(!a_avail && !c_avail) use_pred = 0;
  1877. ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
  1878. ac_val2 = ac_val;
  1879. scale = mquant * 2 + v->halfpq;
  1880. if(dc_pred_dir) //left
  1881. ac_val -= 16;
  1882. else //top
  1883. ac_val -= 16 * s->block_wrap[n];
  1884. q1 = s->current_picture.f.qscale_table[mb_pos];
  1885. if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.f.qscale_table[mb_pos - 1];
  1886. if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
  1887. if(dc_pred_dir && n==1) q2 = q1;
  1888. if(!dc_pred_dir && n==2) q2 = q1;
  1889. if(n==3) q2 = q1;
  1890. if(coded) {
  1891. int last = 0, skip, value;
  1892. int k;
  1893. while (!last) {
  1894. vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
  1895. i += skip;
  1896. if(i > 63)
  1897. break;
  1898. block[v->zz_8x8[0][i++]] = value;
  1899. }
  1900. /* apply AC prediction if needed */
  1901. if(use_pred) {
  1902. /* scale predictors if needed*/
  1903. if(q2 && q1!=q2) {
  1904. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1905. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1906. if(dc_pred_dir) { //left
  1907. for(k = 1; k < 8; k++)
  1908. block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1909. } else { //top
  1910. for(k = 1; k < 8; k++)
  1911. block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1912. }
  1913. } else {
  1914. if(dc_pred_dir) { //left
  1915. for(k = 1; k < 8; k++)
  1916. block[k << v->left_blk_sh] += ac_val[k];
  1917. } else { //top
  1918. for(k = 1; k < 8; k++)
  1919. block[k << v->top_blk_sh] += ac_val[k + 8];
  1920. }
  1921. }
  1922. }
  1923. /* save AC coeffs for further prediction */
  1924. for(k = 1; k < 8; k++) {
  1925. ac_val2[k ] = block[k << v->left_blk_sh];
  1926. ac_val2[k + 8] = block[k << v->top_blk_sh];
  1927. }
  1928. /* scale AC coeffs */
  1929. for(k = 1; k < 64; k++)
  1930. if(block[k]) {
  1931. block[k] *= scale;
  1932. if(!v->pquantizer)
  1933. block[k] += (block[k] < 0) ? -mquant : mquant;
  1934. }
  1935. if(use_pred) i = 63;
  1936. } else { // no AC coeffs
  1937. int k;
  1938. memset(ac_val2, 0, 16 * 2);
  1939. if(dc_pred_dir) {//left
  1940. if(use_pred) {
  1941. memcpy(ac_val2, ac_val, 8 * 2);
  1942. if(q2 && q1!=q2) {
  1943. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1944. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1945. for(k = 1; k < 8; k++)
  1946. ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1947. }
  1948. }
  1949. } else {//top
  1950. if(use_pred) {
  1951. memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
  1952. if(q2 && q1!=q2) {
  1953. q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
  1954. q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
  1955. for(k = 1; k < 8; k++)
  1956. ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
  1957. }
  1958. }
  1959. }
  1960. /* apply AC prediction if needed */
  1961. if(use_pred) {
  1962. if(dc_pred_dir) { //left
  1963. for(k = 1; k < 8; k++) {
  1964. block[k << v->left_blk_sh] = ac_val2[k] * scale;
  1965. if(!v->pquantizer && block[k << v->left_blk_sh])
  1966. block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
  1967. }
  1968. } else { //top
  1969. for(k = 1; k < 8; k++) {
  1970. block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
  1971. if(!v->pquantizer && block[k << v->top_blk_sh])
  1972. block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
  1973. }
  1974. }
  1975. i = 63;
  1976. }
  1977. }
  1978. s->block_last_index[n] = i;
  1979. return 0;
  1980. }
  1981. /** Decode P block
  1982. */
  1983. static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block,
  1984. uint8_t *dst, int linesize, int skip_block, int *ttmb_out)
  1985. {
  1986. MpegEncContext *s = &v->s;
  1987. GetBitContext *gb = &s->gb;
  1988. int i, j;
  1989. int subblkpat = 0;
  1990. int scale, off, idx, last, skip, value;
  1991. int ttblk = ttmb & 7;
  1992. int pat = 0;
  1993. s->dsp.clear_block(block);
  1994. if(ttmb == -1) {
  1995. ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
  1996. }
  1997. if(ttblk == TT_4X4) {
  1998. subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
  1999. }
  2000. if((ttblk != TT_8X8 && ttblk != TT_4X4)
  2001. && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
  2002. || (!v->res_rtm_flag && !first_block))) {
  2003. subblkpat = decode012(gb);
  2004. if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
  2005. if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
  2006. if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
  2007. }
  2008. scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
  2009. // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
  2010. if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
  2011. subblkpat = 2 - (ttblk == TT_8X4_TOP);
  2012. ttblk = TT_8X4;
  2013. }
  2014. if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
  2015. subblkpat = 2 - (ttblk == TT_4X8_LEFT);
  2016. ttblk = TT_4X8;
  2017. }
  2018. switch(ttblk) {
  2019. case TT_8X8:
  2020. pat = 0xF;
  2021. i = 0;
  2022. last = 0;
  2023. while (!last) {
  2024. vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
  2025. i += skip;
  2026. if(i > 63)
  2027. break;
  2028. idx = v->zz_8x8[0][i++];
  2029. block[idx] = value * scale;
  2030. if(!v->pquantizer)
  2031. block[idx] += (block[idx] < 0) ? -mquant : mquant;
  2032. }
  2033. if(!skip_block){
  2034. if(i==1)
  2035. v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
  2036. else{
  2037. v->vc1dsp.vc1_inv_trans_8x8(block);
  2038. s->dsp.add_pixels_clamped(block, dst, linesize);
  2039. }
  2040. }
  2041. break;
  2042. case TT_4X4:
  2043. pat = ~subblkpat & 0xF;
  2044. for(j = 0; j < 4; j++) {
  2045. last = subblkpat & (1 << (3 - j));
  2046. i = 0;
  2047. off = (j & 1) * 4 + (j & 2) * 16;
  2048. while (!last) {
  2049. vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
  2050. i += skip;
  2051. if(i > 15)
  2052. break;
  2053. idx = ff_vc1_simple_progressive_4x4_zz[i++];
  2054. block[idx + off] = value * scale;
  2055. if(!v->pquantizer)
  2056. block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
  2057. }
  2058. if(!(subblkpat & (1 << (3 - j))) && !skip_block){
  2059. if(i==1)
  2060. v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
  2061. else
  2062. v->vc1dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
  2063. }
  2064. }
  2065. break;
  2066. case TT_8X4:
  2067. pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF;
  2068. for(j = 0; j < 2; j++) {
  2069. last = subblkpat & (1 << (1 - j));
  2070. i = 0;
  2071. off = j * 32;
  2072. while (!last) {
  2073. vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
  2074. i += skip;
  2075. if(i > 31)
  2076. break;
  2077. idx = v->zz_8x4[i++]+off;
  2078. block[idx] = value * scale;
  2079. if(!v->pquantizer)
  2080. block[idx] += (block[idx] < 0) ? -mquant : mquant;
  2081. }
  2082. if(!(subblkpat & (1 << (1 - j))) && !skip_block){
  2083. if(i==1)
  2084. v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j*4*linesize, linesize, block + off);
  2085. else
  2086. v->vc1dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
  2087. }
  2088. }
  2089. break;
  2090. case TT_4X8:
  2091. pat = ~(subblkpat*5) & 0xF;
  2092. for(j = 0; j < 2; j++) {
  2093. last = subblkpat & (1 << (1 - j));
  2094. i = 0;
  2095. off = j * 4;
  2096. while (!last) {
  2097. vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
  2098. i += skip;
  2099. if(i > 31)
  2100. break;
  2101. idx = v->zz_4x8[i++]+off;
  2102. block[idx] = value * scale;
  2103. if(!v->pquantizer)
  2104. block[idx] += (block[idx] < 0) ? -mquant : mquant;
  2105. }
  2106. if(!(subblkpat & (1 << (1 - j))) && !skip_block){
  2107. if(i==1)
  2108. v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j*4, linesize, block + off);
  2109. else
  2110. v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
  2111. }
  2112. }
  2113. break;
  2114. }
  2115. if (ttmb_out)
  2116. *ttmb_out |= ttblk << (n * 4);
  2117. return pat;
  2118. }
  2119. /** @} */ // Macroblock group
  2120. static const int size_table [6] = { 0, 2, 3, 4, 5, 8 };
  2121. static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
  2122. static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
  2123. {
  2124. MpegEncContext *s = &v->s;
  2125. int mb_cbp = v->cbp[s->mb_x - s->mb_stride],
  2126. block_cbp = mb_cbp >> (block_num * 4), bottom_cbp,
  2127. mb_is_intra = v->is_intra[s->mb_x - s->mb_stride],
  2128. block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
  2129. int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
  2130. uint8_t *dst;
  2131. if(block_num > 3) {
  2132. dst = s->dest[block_num - 3];
  2133. } else {
  2134. dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
  2135. }
  2136. if (s->mb_y != s->end_mb_y || block_num < 2) {
  2137. int16_t (*mv)[2];
  2138. int mv_stride;
  2139. if(block_num > 3) {
  2140. bottom_cbp = v->cbp[s->mb_x] >> (block_num * 4);
  2141. bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
  2142. mv = &v->luma_mv[s->mb_x - s->mb_stride];
  2143. mv_stride = s->mb_stride;
  2144. } else {
  2145. bottom_cbp = (block_num < 2) ? (mb_cbp >> ((block_num + 2) * 4)) :
  2146. (v->cbp[s->mb_x] >> ((block_num - 2) * 4));
  2147. bottom_is_intra = (block_num < 2) ? (mb_is_intra >> ((block_num + 2) * 4)) :
  2148. (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
  2149. mv_stride = s->b8_stride;
  2150. mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
  2151. }
  2152. if (bottom_is_intra & 1 || block_is_intra & 1 ||
  2153. mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
  2154. v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
  2155. } else {
  2156. idx = ((bottom_cbp >> 2) | block_cbp) & 3;
  2157. if(idx == 3) {
  2158. v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
  2159. } else if (idx) {
  2160. if (idx == 1)
  2161. v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
  2162. else
  2163. v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
  2164. }
  2165. }
  2166. }
  2167. dst -= 4 * linesize;
  2168. ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xf;
  2169. if (ttblk == TT_4X4 || ttblk == TT_8X4) {
  2170. idx = (block_cbp | (block_cbp >> 2)) & 3;
  2171. if (idx == 3) {
  2172. v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
  2173. } else if (idx) {
  2174. if (idx == 1)
  2175. v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
  2176. else
  2177. v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
  2178. }
  2179. }
  2180. }
  2181. static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
  2182. {
  2183. MpegEncContext *s = &v->s;
  2184. int mb_cbp = v->cbp[s->mb_x - 1 - s->mb_stride],
  2185. block_cbp = mb_cbp >> (block_num * 4), right_cbp,
  2186. mb_is_intra = v->is_intra[s->mb_x - 1 - s->mb_stride],
  2187. block_is_intra = mb_is_intra >> (block_num * 4), right_is_intra;
  2188. int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
  2189. uint8_t *dst;
  2190. if (block_num > 3) {
  2191. dst = s->dest[block_num - 3] - 8 * linesize;
  2192. } else {
  2193. dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
  2194. }
  2195. if (s->mb_x != s->mb_width || !(block_num & 5)) {
  2196. int16_t (*mv)[2];
  2197. if(block_num > 3) {
  2198. right_cbp = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
  2199. right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
  2200. mv = &v->luma_mv[s->mb_x - s->mb_stride - 1];
  2201. }else{
  2202. right_cbp = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4)) :
  2203. (mb_cbp >> ((block_num + 1) * 4));
  2204. right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4)) :
  2205. (mb_is_intra >> ((block_num + 1) * 4));
  2206. mv = &s->current_picture.f.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
  2207. }
  2208. if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
  2209. v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
  2210. } else {
  2211. idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
  2212. if (idx == 5) {
  2213. v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
  2214. } else if (idx) {
  2215. if (idx == 1)
  2216. v->vc1dsp.vc1_h_loop_filter4(dst+4*linesize, linesize, v->pq);
  2217. else
  2218. v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
  2219. }
  2220. }
  2221. }
  2222. dst -= 4;
  2223. ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
  2224. if (ttblk == TT_4X4 || ttblk == TT_4X8) {
  2225. idx = (block_cbp | (block_cbp >> 1)) & 5;
  2226. if (idx == 5) {
  2227. v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
  2228. } else if (idx) {
  2229. if (idx == 1)
  2230. v->vc1dsp.vc1_h_loop_filter4(dst + linesize*4, linesize, v->pq);
  2231. else
  2232. v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
  2233. }
  2234. }
  2235. }
  2236. static void vc1_apply_p_loop_filter(VC1Context *v)
  2237. {
  2238. MpegEncContext *s = &v->s;
  2239. int i;
  2240. for (i = 0; i < 6; i++) {
  2241. vc1_apply_p_v_loop_filter(v, i);
  2242. }
  2243. /* V always preceedes H, therefore we run H one MB before V;
  2244. * at the end of a row, we catch up to complete the row */
  2245. if (s->mb_x) {
  2246. for (i = 0; i < 6; i++) {
  2247. vc1_apply_p_h_loop_filter(v, i);
  2248. }
  2249. if (s->mb_x == s->mb_width - 1) {
  2250. s->mb_x++;
  2251. ff_update_block_index(s);
  2252. for (i = 0; i < 6; i++) {
  2253. vc1_apply_p_h_loop_filter(v, i);
  2254. }
  2255. }
  2256. }
  2257. }
  2258. /** Decode one P-frame MB (in Simple/Main profile)
  2259. */
  2260. static int vc1_decode_p_mb(VC1Context *v)
  2261. {
  2262. MpegEncContext *s = &v->s;
  2263. GetBitContext *gb = &s->gb;
  2264. int i, j;
  2265. int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  2266. int cbp; /* cbp decoding stuff */
  2267. int mqdiff, mquant; /* MB quantization */
  2268. int ttmb = v->ttfrm; /* MB Transform type */
  2269. int mb_has_coeffs = 1; /* last_flag */
  2270. int dmv_x, dmv_y; /* Differential MV components */
  2271. int index, index1; /* LUT indexes */
  2272. int val, sign; /* temp values */
  2273. int first_block = 1;
  2274. int dst_idx, off;
  2275. int skipped, fourmv;
  2276. int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
  2277. mquant = v->pq; /* Loosy initialization */
  2278. if (v->mv_type_is_raw)
  2279. fourmv = get_bits1(gb);
  2280. else
  2281. fourmv = v->mv_type_mb_plane[mb_pos];
  2282. if (v->skip_is_raw)
  2283. skipped = get_bits1(gb);
  2284. else
  2285. skipped = v->s.mbskip_table[mb_pos];
  2286. if (!fourmv) /* 1MV mode */
  2287. {
  2288. if (!skipped)
  2289. {
  2290. GET_MVDATA(dmv_x, dmv_y);
  2291. if (s->mb_intra) {
  2292. s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
  2293. s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
  2294. }
  2295. s->current_picture.f.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
  2296. vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
  2297. /* FIXME Set DC val for inter block ? */
  2298. if (s->mb_intra && !mb_has_coeffs)
  2299. {
  2300. GET_MQUANT();
  2301. s->ac_pred = get_bits1(gb);
  2302. cbp = 0;
  2303. }
  2304. else if (mb_has_coeffs)
  2305. {
  2306. if (s->mb_intra) s->ac_pred = get_bits1(gb);
  2307. cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
  2308. GET_MQUANT();
  2309. }
  2310. else
  2311. {
  2312. mquant = v->pq;
  2313. cbp = 0;
  2314. }
  2315. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2316. if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
  2317. ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
  2318. VC1_TTMB_VLC_BITS, 2);
  2319. if(!s->mb_intra) vc1_mc_1mv(v, 0);
  2320. dst_idx = 0;
  2321. for (i=0; i<6; i++)
  2322. {
  2323. s->dc_val[0][s->block_index[i]] = 0;
  2324. dst_idx += i >> 2;
  2325. val = ((cbp >> (5 - i)) & 1);
  2326. off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
  2327. v->mb_type[0][s->block_index[i]] = s->mb_intra;
  2328. if(s->mb_intra) {
  2329. /* check if prediction blocks A and C are available */
  2330. v->a_avail = v->c_avail = 0;
  2331. if(i == 2 || i == 3 || !s->first_slice_line)
  2332. v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
  2333. if(i == 1 || i == 3 || s->mb_x)
  2334. v->c_avail = v->mb_type[0][s->block_index[i] - 1];
  2335. vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
  2336. if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
  2337. v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
  2338. if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
  2339. s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2340. if(v->pq >= 9 && v->overlap) {
  2341. if(v->c_avail)
  2342. v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2343. if(v->a_avail)
  2344. v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2345. }
  2346. block_cbp |= 0xF << (i << 2);
  2347. block_intra |= 1 << i;
  2348. } else if(val) {
  2349. pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
  2350. block_cbp |= pat << (i << 2);
  2351. if(!v->ttmbf && ttmb < 8) ttmb = -1;
  2352. first_block = 0;
  2353. }
  2354. }
  2355. }
  2356. else //Skipped
  2357. {
  2358. s->mb_intra = 0;
  2359. for(i = 0; i < 6; i++) {
  2360. v->mb_type[0][s->block_index[i]] = 0;
  2361. s->dc_val[0][s->block_index[i]] = 0;
  2362. }
  2363. s->current_picture.f.mb_type[mb_pos] = MB_TYPE_SKIP;
  2364. s->current_picture.f.qscale_table[mb_pos] = 0;
  2365. vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
  2366. vc1_mc_1mv(v, 0);
  2367. }
  2368. } //1MV mode
  2369. else //4MV mode
  2370. {
  2371. if (!skipped /* unskipped MB */)
  2372. {
  2373. int intra_count = 0, coded_inter = 0;
  2374. int is_intra[6], is_coded[6];
  2375. /* Get CBPCY */
  2376. cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
  2377. for (i=0; i<6; i++)
  2378. {
  2379. val = ((cbp >> (5 - i)) & 1);
  2380. s->dc_val[0][s->block_index[i]] = 0;
  2381. s->mb_intra = 0;
  2382. if(i < 4) {
  2383. dmv_x = dmv_y = 0;
  2384. s->mb_intra = 0;
  2385. mb_has_coeffs = 0;
  2386. if(val) {
  2387. GET_MVDATA(dmv_x, dmv_y);
  2388. }
  2389. vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
  2390. if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
  2391. intra_count += s->mb_intra;
  2392. is_intra[i] = s->mb_intra;
  2393. is_coded[i] = mb_has_coeffs;
  2394. }
  2395. if(i&4){
  2396. is_intra[i] = (intra_count >= 3);
  2397. is_coded[i] = val;
  2398. }
  2399. if(i == 4) vc1_mc_4mv_chroma(v);
  2400. v->mb_type[0][s->block_index[i]] = is_intra[i];
  2401. if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
  2402. }
  2403. // if there are no coded blocks then don't do anything more
  2404. dst_idx = 0;
  2405. if(!intra_count && !coded_inter)
  2406. goto end;
  2407. GET_MQUANT();
  2408. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2409. /* test if block is intra and has pred */
  2410. {
  2411. int intrapred = 0;
  2412. for(i=0; i<6; i++)
  2413. if(is_intra[i]) {
  2414. if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
  2415. || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
  2416. intrapred = 1;
  2417. break;
  2418. }
  2419. }
  2420. if(intrapred)s->ac_pred = get_bits1(gb);
  2421. else s->ac_pred = 0;
  2422. }
  2423. if (!v->ttmbf && coded_inter)
  2424. ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
  2425. for (i=0; i<6; i++)
  2426. {
  2427. dst_idx += i >> 2;
  2428. off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
  2429. s->mb_intra = is_intra[i];
  2430. if (is_intra[i]) {
  2431. /* check if prediction blocks A and C are available */
  2432. v->a_avail = v->c_avail = 0;
  2433. if(i == 2 || i == 3 || !s->first_slice_line)
  2434. v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
  2435. if(i == 1 || i == 3 || s->mb_x)
  2436. v->c_avail = v->mb_type[0][s->block_index[i] - 1];
  2437. vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
  2438. if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
  2439. v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
  2440. if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
  2441. s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
  2442. if(v->pq >= 9 && v->overlap) {
  2443. if(v->c_avail)
  2444. v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2445. if(v->a_avail)
  2446. v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2447. }
  2448. block_cbp |= 0xF << (i << 2);
  2449. block_intra |= 1 << i;
  2450. } else if(is_coded[i]) {
  2451. pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
  2452. block_cbp |= pat << (i << 2);
  2453. if(!v->ttmbf && ttmb < 8) ttmb = -1;
  2454. first_block = 0;
  2455. }
  2456. }
  2457. }
  2458. else //Skipped MB
  2459. {
  2460. s->mb_intra = 0;
  2461. s->current_picture.f.qscale_table[mb_pos] = 0;
  2462. for (i=0; i<6; i++) {
  2463. v->mb_type[0][s->block_index[i]] = 0;
  2464. s->dc_val[0][s->block_index[i]] = 0;
  2465. }
  2466. for (i=0; i<4; i++)
  2467. {
  2468. vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
  2469. vc1_mc_4mv_luma(v, i);
  2470. }
  2471. vc1_mc_4mv_chroma(v);
  2472. s->current_picture.f.qscale_table[mb_pos] = 0;
  2473. }
  2474. }
  2475. end:
  2476. v->cbp[s->mb_x] = block_cbp;
  2477. v->ttblk[s->mb_x] = block_tt;
  2478. v->is_intra[s->mb_x] = block_intra;
  2479. return 0;
  2480. }
  2481. /** Decode one B-frame MB (in Main profile)
  2482. */
  2483. static void vc1_decode_b_mb(VC1Context *v)
  2484. {
  2485. MpegEncContext *s = &v->s;
  2486. GetBitContext *gb = &s->gb;
  2487. int i, j;
  2488. int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  2489. int cbp = 0; /* cbp decoding stuff */
  2490. int mqdiff, mquant; /* MB quantization */
  2491. int ttmb = v->ttfrm; /* MB Transform type */
  2492. int mb_has_coeffs = 0; /* last_flag */
  2493. int index, index1; /* LUT indexes */
  2494. int val, sign; /* temp values */
  2495. int first_block = 1;
  2496. int dst_idx, off;
  2497. int skipped, direct;
  2498. int dmv_x[2], dmv_y[2];
  2499. int bmvtype = BMV_TYPE_BACKWARD;
  2500. mquant = v->pq; /* Loosy initialization */
  2501. s->mb_intra = 0;
  2502. if (v->dmb_is_raw)
  2503. direct = get_bits1(gb);
  2504. else
  2505. direct = v->direct_mb_plane[mb_pos];
  2506. if (v->skip_is_raw)
  2507. skipped = get_bits1(gb);
  2508. else
  2509. skipped = v->s.mbskip_table[mb_pos];
  2510. dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
  2511. for(i = 0; i < 6; i++) {
  2512. v->mb_type[0][s->block_index[i]] = 0;
  2513. s->dc_val[0][s->block_index[i]] = 0;
  2514. }
  2515. s->current_picture.f.qscale_table[mb_pos] = 0;
  2516. if (!direct) {
  2517. if (!skipped) {
  2518. GET_MVDATA(dmv_x[0], dmv_y[0]);
  2519. dmv_x[1] = dmv_x[0];
  2520. dmv_y[1] = dmv_y[0];
  2521. }
  2522. if(skipped || !s->mb_intra) {
  2523. bmvtype = decode012(gb);
  2524. switch(bmvtype) {
  2525. case 0:
  2526. bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
  2527. break;
  2528. case 1:
  2529. bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
  2530. break;
  2531. case 2:
  2532. bmvtype = BMV_TYPE_INTERPOLATED;
  2533. dmv_x[0] = dmv_y[0] = 0;
  2534. }
  2535. }
  2536. }
  2537. for(i = 0; i < 6; i++)
  2538. v->mb_type[0][s->block_index[i]] = s->mb_intra;
  2539. if (skipped) {
  2540. if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
  2541. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2542. vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
  2543. return;
  2544. }
  2545. if (direct) {
  2546. cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
  2547. GET_MQUANT();
  2548. s->mb_intra = 0;
  2549. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2550. if(!v->ttmbf)
  2551. ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
  2552. dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
  2553. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2554. vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
  2555. } else {
  2556. if(!mb_has_coeffs && !s->mb_intra) {
  2557. /* no coded blocks - effectively skipped */
  2558. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2559. vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
  2560. return;
  2561. }
  2562. if(s->mb_intra && !mb_has_coeffs) {
  2563. GET_MQUANT();
  2564. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2565. s->ac_pred = get_bits1(gb);
  2566. cbp = 0;
  2567. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2568. } else {
  2569. if(bmvtype == BMV_TYPE_INTERPOLATED) {
  2570. GET_MVDATA(dmv_x[0], dmv_y[0]);
  2571. if(!mb_has_coeffs) {
  2572. /* interpolated skipped block */
  2573. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2574. vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
  2575. return;
  2576. }
  2577. }
  2578. vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
  2579. if(!s->mb_intra) {
  2580. vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
  2581. }
  2582. if(s->mb_intra)
  2583. s->ac_pred = get_bits1(gb);
  2584. cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
  2585. GET_MQUANT();
  2586. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2587. if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
  2588. ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
  2589. }
  2590. }
  2591. dst_idx = 0;
  2592. for (i=0; i<6; i++)
  2593. {
  2594. s->dc_val[0][s->block_index[i]] = 0;
  2595. dst_idx += i >> 2;
  2596. val = ((cbp >> (5 - i)) & 1);
  2597. off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
  2598. v->mb_type[0][s->block_index[i]] = s->mb_intra;
  2599. if(s->mb_intra) {
  2600. /* check if prediction blocks A and C are available */
  2601. v->a_avail = v->c_avail = 0;
  2602. if(i == 2 || i == 3 || !s->first_slice_line)
  2603. v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
  2604. if(i == 1 || i == 3 || s->mb_x)
  2605. v->c_avail = v->mb_type[0][s->block_index[i] - 1];
  2606. vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
  2607. if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
  2608. v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
  2609. if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
  2610. s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
  2611. } else if(val) {
  2612. vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), NULL);
  2613. if(!v->ttmbf && ttmb < 8) ttmb = -1;
  2614. first_block = 0;
  2615. }
  2616. }
  2617. }
  2618. /** Decode blocks of I-frame
  2619. */
  2620. static void vc1_decode_i_blocks(VC1Context *v)
  2621. {
  2622. int k, j;
  2623. MpegEncContext *s = &v->s;
  2624. int cbp, val;
  2625. uint8_t *coded_val;
  2626. int mb_pos;
  2627. /* select codingmode used for VLC tables selection */
  2628. switch(v->y_ac_table_index){
  2629. case 0:
  2630. v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
  2631. break;
  2632. case 1:
  2633. v->codingset = CS_HIGH_MOT_INTRA;
  2634. break;
  2635. case 2:
  2636. v->codingset = CS_MID_RATE_INTRA;
  2637. break;
  2638. }
  2639. switch(v->c_ac_table_index){
  2640. case 0:
  2641. v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
  2642. break;
  2643. case 1:
  2644. v->codingset2 = CS_HIGH_MOT_INTER;
  2645. break;
  2646. case 2:
  2647. v->codingset2 = CS_MID_RATE_INTER;
  2648. break;
  2649. }
  2650. /* Set DC scale - y and c use the same */
  2651. s->y_dc_scale = s->y_dc_scale_table[v->pq];
  2652. s->c_dc_scale = s->c_dc_scale_table[v->pq];
  2653. //do frame decode
  2654. s->mb_x = s->mb_y = 0;
  2655. s->mb_intra = 1;
  2656. s->first_slice_line = 1;
  2657. for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
  2658. s->mb_x = 0;
  2659. ff_init_block_index(s);
  2660. for(; s->mb_x < s->mb_width; s->mb_x++) {
  2661. uint8_t *dst[6];
  2662. ff_update_block_index(s);
  2663. dst[0] = s->dest[0];
  2664. dst[1] = dst[0] + 8;
  2665. dst[2] = s->dest[0] + s->linesize * 8;
  2666. dst[3] = dst[2] + 8;
  2667. dst[4] = s->dest[1];
  2668. dst[5] = s->dest[2];
  2669. s->dsp.clear_blocks(s->block[0]);
  2670. mb_pos = s->mb_x + s->mb_y * s->mb_width;
  2671. s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
  2672. s->current_picture.f.qscale_table[mb_pos] = v->pq;
  2673. s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
  2674. s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
  2675. // do actual MB decoding and displaying
  2676. cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
  2677. v->s.ac_pred = get_bits1(&v->s.gb);
  2678. for(k = 0; k < 6; k++) {
  2679. val = ((cbp >> (5 - k)) & 1);
  2680. if (k < 4) {
  2681. int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
  2682. val = val ^ pred;
  2683. *coded_val = val;
  2684. }
  2685. cbp |= val << (5 - k);
  2686. vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
  2687. if (k > 3 && (s->flags & CODEC_FLAG_GRAY)) continue;
  2688. v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
  2689. if(v->pq >= 9 && v->overlap) {
  2690. if (v->rangeredfrm) for(j = 0; j < 64; j++) s->block[k][j] <<= 1;
  2691. s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
  2692. } else {
  2693. if (v->rangeredfrm) for(j = 0; j < 64; j++) s->block[k][j] = (s->block[k][j] - 64) << 1;
  2694. s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
  2695. }
  2696. }
  2697. if(v->pq >= 9 && v->overlap) {
  2698. if(s->mb_x) {
  2699. v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
  2700. v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
  2701. if(!(s->flags & CODEC_FLAG_GRAY)) {
  2702. v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
  2703. v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
  2704. }
  2705. }
  2706. v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
  2707. v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
  2708. if(!s->first_slice_line) {
  2709. v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
  2710. v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
  2711. if(!(s->flags & CODEC_FLAG_GRAY)) {
  2712. v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
  2713. v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
  2714. }
  2715. }
  2716. v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
  2717. v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
  2718. }
  2719. if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
  2720. if(get_bits_count(&s->gb) > v->bits) {
  2721. ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
  2722. av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
  2723. return;
  2724. }
  2725. }
  2726. if (!v->s.loop_filter)
  2727. ff_draw_horiz_band(s, s->mb_y * 16, 16);
  2728. else if (s->mb_y)
  2729. ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
  2730. s->first_slice_line = 0;
  2731. }
  2732. if (v->s.loop_filter)
  2733. ff_draw_horiz_band(s, (s->mb_height-1)*16, 16);
  2734. ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
  2735. }
  2736. /** Decode blocks of I-frame for advanced profile
  2737. */
  2738. static void vc1_decode_i_blocks_adv(VC1Context *v)
  2739. {
  2740. int k;
  2741. MpegEncContext *s = &v->s;
  2742. int cbp, val;
  2743. uint8_t *coded_val;
  2744. int mb_pos;
  2745. int mquant = v->pq;
  2746. int mqdiff;
  2747. GetBitContext *gb = &s->gb;
  2748. /* select codingmode used for VLC tables selection */
  2749. switch(v->y_ac_table_index){
  2750. case 0:
  2751. v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
  2752. break;
  2753. case 1:
  2754. v->codingset = CS_HIGH_MOT_INTRA;
  2755. break;
  2756. case 2:
  2757. v->codingset = CS_MID_RATE_INTRA;
  2758. break;
  2759. }
  2760. switch(v->c_ac_table_index){
  2761. case 0:
  2762. v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
  2763. break;
  2764. case 1:
  2765. v->codingset2 = CS_HIGH_MOT_INTER;
  2766. break;
  2767. case 2:
  2768. v->codingset2 = CS_MID_RATE_INTER;
  2769. break;
  2770. }
  2771. //do frame decode
  2772. s->mb_x = s->mb_y = 0;
  2773. s->mb_intra = 1;
  2774. s->first_slice_line = 1;
  2775. s->mb_y = s->start_mb_y;
  2776. if (s->start_mb_y) {
  2777. s->mb_x = 0;
  2778. ff_init_block_index(s);
  2779. memset(&s->coded_block[s->block_index[0]-s->b8_stride], 0,
  2780. (1 + s->b8_stride) * sizeof(*s->coded_block));
  2781. }
  2782. for(; s->mb_y < s->end_mb_y; s->mb_y++) {
  2783. s->mb_x = 0;
  2784. ff_init_block_index(s);
  2785. for(;s->mb_x < s->mb_width; s->mb_x++) {
  2786. DCTELEM (*block)[64] = v->block[v->cur_blk_idx];
  2787. ff_update_block_index(s);
  2788. s->dsp.clear_blocks(block[0]);
  2789. mb_pos = s->mb_x + s->mb_y * s->mb_stride;
  2790. s->current_picture.f.mb_type[mb_pos] = MB_TYPE_INTRA;
  2791. s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
  2792. s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
  2793. // do actual MB decoding and displaying
  2794. cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
  2795. if(v->acpred_is_raw)
  2796. v->s.ac_pred = get_bits1(&v->s.gb);
  2797. else
  2798. v->s.ac_pred = v->acpred_plane[mb_pos];
  2799. if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
  2800. v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
  2801. GET_MQUANT();
  2802. s->current_picture.f.qscale_table[mb_pos] = mquant;
  2803. /* Set DC scale - y and c use the same */
  2804. s->y_dc_scale = s->y_dc_scale_table[mquant];
  2805. s->c_dc_scale = s->c_dc_scale_table[mquant];
  2806. for(k = 0; k < 6; k++) {
  2807. val = ((cbp >> (5 - k)) & 1);
  2808. if (k < 4) {
  2809. int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
  2810. val = val ^ pred;
  2811. *coded_val = val;
  2812. }
  2813. cbp |= val << (5 - k);
  2814. v->a_avail = !s->first_slice_line || (k==2 || k==3);
  2815. v->c_avail = !!s->mb_x || (k==1 || k==3);
  2816. vc1_decode_i_block_adv(v, block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
  2817. if (k > 3 && (s->flags & CODEC_FLAG_GRAY)) continue;
  2818. v->vc1dsp.vc1_inv_trans_8x8(block[k]);
  2819. }
  2820. vc1_smooth_overlap_filter_iblk(v);
  2821. vc1_put_signed_blocks_clamped(v);
  2822. if(v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
  2823. if(get_bits_count(&s->gb) > v->bits) {
  2824. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
  2825. av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
  2826. return;
  2827. }
  2828. }
  2829. if (!v->s.loop_filter)
  2830. ff_draw_horiz_band(s, s->mb_y * 16, 16);
  2831. else if (s->mb_y)
  2832. ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
  2833. s->first_slice_line = 0;
  2834. }
  2835. /* raw bottom MB row */
  2836. s->mb_x = 0;
  2837. ff_init_block_index(s);
  2838. for(;s->mb_x < s->mb_width; s->mb_x++) {
  2839. ff_update_block_index(s);
  2840. vc1_put_signed_blocks_clamped(v);
  2841. if(v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
  2842. }
  2843. if (v->s.loop_filter)
  2844. ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
  2845. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
  2846. }
  2847. static void vc1_decode_p_blocks(VC1Context *v)
  2848. {
  2849. MpegEncContext *s = &v->s;
  2850. int apply_loop_filter;
  2851. /* select codingmode used for VLC tables selection */
  2852. switch(v->c_ac_table_index){
  2853. case 0:
  2854. v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
  2855. break;
  2856. case 1:
  2857. v->codingset = CS_HIGH_MOT_INTRA;
  2858. break;
  2859. case 2:
  2860. v->codingset = CS_MID_RATE_INTRA;
  2861. break;
  2862. }
  2863. switch(v->c_ac_table_index){
  2864. case 0:
  2865. v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
  2866. break;
  2867. case 1:
  2868. v->codingset2 = CS_HIGH_MOT_INTER;
  2869. break;
  2870. case 2:
  2871. v->codingset2 = CS_MID_RATE_INTER;
  2872. break;
  2873. }
  2874. apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
  2875. s->first_slice_line = 1;
  2876. memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
  2877. for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
  2878. s->mb_x = 0;
  2879. ff_init_block_index(s);
  2880. for(; s->mb_x < s->mb_width; s->mb_x++) {
  2881. ff_update_block_index(s);
  2882. vc1_decode_p_mb(v);
  2883. if (s->mb_y != s->start_mb_y && apply_loop_filter)
  2884. vc1_apply_p_loop_filter(v);
  2885. if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
  2886. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
  2887. av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
  2888. return;
  2889. }
  2890. }
  2891. memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0])*s->mb_stride);
  2892. memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0])*s->mb_stride);
  2893. memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
  2894. memmove(v->luma_mv_base, v->luma_mv, sizeof(v->luma_mv_base[0])*s->mb_stride);
  2895. if (s->mb_y != s->start_mb_y) ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
  2896. s->first_slice_line = 0;
  2897. }
  2898. if (apply_loop_filter) {
  2899. s->mb_x = 0;
  2900. ff_init_block_index(s);
  2901. for (; s->mb_x < s->mb_width; s->mb_x++) {
  2902. ff_update_block_index(s);
  2903. vc1_apply_p_loop_filter(v);
  2904. }
  2905. }
  2906. if (s->end_mb_y >= s->start_mb_y)
  2907. ff_draw_horiz_band(s, (s->end_mb_y-1) * 16, 16);
  2908. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
  2909. }
  2910. static void vc1_decode_b_blocks(VC1Context *v)
  2911. {
  2912. MpegEncContext *s = &v->s;
  2913. /* select codingmode used for VLC tables selection */
  2914. switch(v->c_ac_table_index){
  2915. case 0:
  2916. v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
  2917. break;
  2918. case 1:
  2919. v->codingset = CS_HIGH_MOT_INTRA;
  2920. break;
  2921. case 2:
  2922. v->codingset = CS_MID_RATE_INTRA;
  2923. break;
  2924. }
  2925. switch(v->c_ac_table_index){
  2926. case 0:
  2927. v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
  2928. break;
  2929. case 1:
  2930. v->codingset2 = CS_HIGH_MOT_INTER;
  2931. break;
  2932. case 2:
  2933. v->codingset2 = CS_MID_RATE_INTER;
  2934. break;
  2935. }
  2936. s->first_slice_line = 1;
  2937. for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
  2938. s->mb_x = 0;
  2939. ff_init_block_index(s);
  2940. for(; s->mb_x < s->mb_width; s->mb_x++) {
  2941. ff_update_block_index(s);
  2942. vc1_decode_b_mb(v);
  2943. if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
  2944. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
  2945. av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
  2946. return;
  2947. }
  2948. if(v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
  2949. }
  2950. if (!v->s.loop_filter)
  2951. ff_draw_horiz_band(s, s->mb_y * 16, 16);
  2952. else if (s->mb_y)
  2953. ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
  2954. s->first_slice_line = 0;
  2955. }
  2956. if (v->s.loop_filter)
  2957. ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
  2958. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
  2959. }
  2960. static void vc1_decode_skip_blocks(VC1Context *v)
  2961. {
  2962. MpegEncContext *s = &v->s;
  2963. ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
  2964. s->first_slice_line = 1;
  2965. for(s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
  2966. s->mb_x = 0;
  2967. ff_init_block_index(s);
  2968. ff_update_block_index(s);
  2969. memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
  2970. memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
  2971. memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
  2972. ff_draw_horiz_band(s, s->mb_y * 16, 16);
  2973. s->first_slice_line = 0;
  2974. }
  2975. s->pict_type = AV_PICTURE_TYPE_P;
  2976. }
  2977. static void vc1_decode_blocks(VC1Context *v)
  2978. {
  2979. v->s.esc3_level_length = 0;
  2980. if(v->x8_type){
  2981. ff_intrax8_decode_picture(&v->x8, 2*v->pq+v->halfpq, v->pq*(!v->pquantizer) );
  2982. }else{
  2983. v->cur_blk_idx = 0;
  2984. v->left_blk_idx = -1;
  2985. v->topleft_blk_idx = 1;
  2986. v->top_blk_idx = 2;
  2987. switch(v->s.pict_type) {
  2988. case AV_PICTURE_TYPE_I:
  2989. if(v->profile == PROFILE_ADVANCED)
  2990. vc1_decode_i_blocks_adv(v);
  2991. else
  2992. vc1_decode_i_blocks(v);
  2993. break;
  2994. case AV_PICTURE_TYPE_P:
  2995. if(v->p_frame_skipped)
  2996. vc1_decode_skip_blocks(v);
  2997. else
  2998. vc1_decode_p_blocks(v);
  2999. break;
  3000. case AV_PICTURE_TYPE_B:
  3001. if(v->bi_type){
  3002. if(v->profile == PROFILE_ADVANCED)
  3003. vc1_decode_i_blocks_adv(v);
  3004. else
  3005. vc1_decode_i_blocks(v);
  3006. }else
  3007. vc1_decode_b_blocks(v);
  3008. break;
  3009. }
  3010. }
  3011. }
  3012. #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
  3013. typedef struct {
  3014. /**
  3015. * Transform coefficients for both sprites in 16.16 fixed point format,
  3016. * in the order they appear in the bitstream:
  3017. * x scale
  3018. * rotation 1 (unused)
  3019. * x offset
  3020. * rotation 2 (unused)
  3021. * y scale
  3022. * y offset
  3023. * alpha
  3024. */
  3025. int coefs[2][7];
  3026. int effect_type, effect_flag;
  3027. int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
  3028. int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
  3029. } SpriteData;
  3030. static inline int get_fp_val(GetBitContext* gb)
  3031. {
  3032. return (get_bits_long(gb, 30) - (1<<29)) << 1;
  3033. }
  3034. static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
  3035. {
  3036. c[1] = c[3] = 0;
  3037. switch (get_bits(gb, 2)) {
  3038. case 0:
  3039. c[0] = 1<<16;
  3040. c[2] = get_fp_val(gb);
  3041. c[4] = 1<<16;
  3042. break;
  3043. case 1:
  3044. c[0] = c[4] = get_fp_val(gb);
  3045. c[2] = get_fp_val(gb);
  3046. break;
  3047. case 2:
  3048. c[0] = get_fp_val(gb);
  3049. c[2] = get_fp_val(gb);
  3050. c[4] = get_fp_val(gb);
  3051. break;
  3052. case 3:
  3053. c[0] = get_fp_val(gb);
  3054. c[1] = get_fp_val(gb);
  3055. c[2] = get_fp_val(gb);
  3056. c[3] = get_fp_val(gb);
  3057. c[4] = get_fp_val(gb);
  3058. break;
  3059. }
  3060. c[5] = get_fp_val(gb);
  3061. if (get_bits1(gb))
  3062. c[6] = get_fp_val(gb);
  3063. else
  3064. c[6] = 1<<16;
  3065. }
  3066. static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
  3067. {
  3068. AVCodecContext *avctx = v->s.avctx;
  3069. int sprite, i;
  3070. for (sprite = 0; sprite <= v->two_sprites; sprite++) {
  3071. vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
  3072. if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
  3073. av_log_ask_for_sample(avctx, "Rotation coefficients are not zero");
  3074. av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
  3075. for (i = 0; i < 7; i++)
  3076. av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
  3077. sd->coefs[sprite][i] / (1<<16),
  3078. (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1<<16));
  3079. av_log(avctx, AV_LOG_DEBUG, "\n");
  3080. }
  3081. skip_bits(gb, 2);
  3082. if (sd->effect_type = get_bits_long(gb, 30)) {
  3083. switch (sd->effect_pcount1 = get_bits(gb, 4)) {
  3084. case 7:
  3085. vc1_sprite_parse_transform(gb, sd->effect_params1);
  3086. break;
  3087. case 14:
  3088. vc1_sprite_parse_transform(gb, sd->effect_params1);
  3089. vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
  3090. break;
  3091. default:
  3092. for (i = 0; i < sd->effect_pcount1; i++)
  3093. sd->effect_params1[i] = get_fp_val(gb);
  3094. }
  3095. if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
  3096. // effect 13 is simple alpha blending and matches the opacity above
  3097. av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
  3098. for (i = 0; i < sd->effect_pcount1; i++)
  3099. av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
  3100. sd->effect_params1[i] / (1<<16),
  3101. (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1<<16));
  3102. av_log(avctx, AV_LOG_DEBUG, "\n");
  3103. }
  3104. sd->effect_pcount2 = get_bits(gb, 16);
  3105. if (sd->effect_pcount2 > 10) {
  3106. av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
  3107. return;
  3108. } else if (sd->effect_pcount2) {
  3109. i = -1;
  3110. av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
  3111. while (++i < sd->effect_pcount2){
  3112. sd->effect_params2[i] = get_fp_val(gb);
  3113. av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
  3114. sd->effect_params2[i] / (1<<16),
  3115. (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1<<16));
  3116. }
  3117. av_log(avctx, AV_LOG_DEBUG, "\n");
  3118. }
  3119. }
  3120. if (sd->effect_flag = get_bits1(gb))
  3121. av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
  3122. if (get_bits_count(gb) >= gb->size_in_bits +
  3123. (avctx->codec_id == CODEC_ID_WMV3IMAGE ? 64 : 0))
  3124. av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
  3125. if (get_bits_count(gb) < gb->size_in_bits - 8)
  3126. av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
  3127. }
  3128. static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
  3129. {
  3130. int i, plane, row, sprite;
  3131. int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
  3132. uint8_t* src_h[2][2];
  3133. int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
  3134. int ysub[2];
  3135. MpegEncContext *s = &v->s;
  3136. for (i = 0; i < 2; i++) {
  3137. xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
  3138. xadv[i] = sd->coefs[i][0];
  3139. if (xadv[i] != 1<<16 || (v->sprite_width<<16) - (v->output_width<<16) - xoff[i])
  3140. xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
  3141. yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
  3142. yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height<<16) - yoff[i]) / v->output_height);
  3143. }
  3144. alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
  3145. for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
  3146. int width = v->output_width>>!!plane;
  3147. for (row = 0; row < v->output_height>>!!plane; row++) {
  3148. uint8_t *dst = v->sprite_output_frame.data[plane] +
  3149. v->sprite_output_frame.linesize[plane] * row;
  3150. for (sprite = 0; sprite <= v->two_sprites; sprite++) {
  3151. uint8_t *iplane = s->current_picture.f.data[plane];
  3152. int iline = s->current_picture.f.linesize[plane];
  3153. int ycoord = yoff[sprite] + yadv[sprite]*row;
  3154. int yline = ycoord>>16;
  3155. ysub[sprite] = ycoord&0xFFFF;
  3156. if (sprite) {
  3157. iplane = s->last_picture.f.data[plane];
  3158. iline = s->last_picture.f.linesize[plane];
  3159. }
  3160. if (!(xoff[sprite]&0xFFFF) && xadv[sprite] == 1<<16) {
  3161. src_h[sprite][0] = iplane+(xoff[sprite]>>16)+ yline *iline;
  3162. if (ysub[sprite])
  3163. src_h[sprite][1] = iplane+(xoff[sprite]>>16)+(yline+1)*iline;
  3164. } else {
  3165. if (sr_cache[sprite][0] != yline) {
  3166. if (sr_cache[sprite][1] == yline) {
  3167. FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
  3168. FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
  3169. } else {
  3170. v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane+yline*iline, xoff[sprite], xadv[sprite], width);
  3171. sr_cache[sprite][0] = yline;
  3172. }
  3173. }
  3174. if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
  3175. v->vc1dsp.sprite_h(v->sr_rows[sprite][1], iplane+(yline+1)*iline, xoff[sprite], xadv[sprite], width);
  3176. sr_cache[sprite][1] = yline + 1;
  3177. }
  3178. src_h[sprite][0] = v->sr_rows[sprite][0];
  3179. src_h[sprite][1] = v->sr_rows[sprite][1];
  3180. }
  3181. }
  3182. if (!v->two_sprites) {
  3183. if (ysub[0]) {
  3184. v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
  3185. } else {
  3186. memcpy(dst, src_h[0][0], width);
  3187. }
  3188. } else {
  3189. if (ysub[0] && ysub[1]) {
  3190. v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
  3191. src_h[1][0], src_h[1][1], ysub[1], alpha, width);
  3192. } else if (ysub[0]) {
  3193. v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
  3194. src_h[1][0], alpha, width);
  3195. } else if (ysub[1]) {
  3196. v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
  3197. src_h[0][0], (1<<16)-1-alpha, width);
  3198. } else {
  3199. v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
  3200. }
  3201. }
  3202. }
  3203. if (!plane) {
  3204. for (i = 0; i < 2; i++) {
  3205. xoff[i] >>= 1;
  3206. yoff[i] >>= 1;
  3207. }
  3208. }
  3209. }
  3210. }
  3211. static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
  3212. {
  3213. MpegEncContext *s = &v->s;
  3214. AVCodecContext *avctx = s->avctx;
  3215. SpriteData sd;
  3216. vc1_parse_sprites(v, gb, &sd);
  3217. if (!s->current_picture.f.data[0]) {
  3218. av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
  3219. return -1;
  3220. }
  3221. if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
  3222. av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
  3223. v->two_sprites = 0;
  3224. }
  3225. if (v->sprite_output_frame.data[0])
  3226. avctx->release_buffer(avctx, &v->sprite_output_frame);
  3227. v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
  3228. v->sprite_output_frame.reference = 0;
  3229. if (avctx->get_buffer(avctx, &v->sprite_output_frame) < 0) {
  3230. av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
  3231. return -1;
  3232. }
  3233. vc1_draw_sprites(v, &sd);
  3234. return 0;
  3235. }
  3236. static void vc1_sprite_flush(AVCodecContext *avctx)
  3237. {
  3238. VC1Context *v = avctx->priv_data;
  3239. MpegEncContext *s = &v->s;
  3240. AVFrame *f = &s->current_picture.f;
  3241. int plane, i;
  3242. /* Windows Media Image codecs have a convergence interval of two keyframes.
  3243. Since we can't enforce it, clear to black the missing sprite. This is
  3244. wrong but it looks better than doing nothing. */
  3245. if (f->data[0])
  3246. for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
  3247. for (i = 0; i < v->sprite_height>>!!plane; i++)
  3248. memset(f->data[plane]+i*f->linesize[plane],
  3249. plane ? 128 : 0, f->linesize[plane]);
  3250. }
  3251. #endif
  3252. static av_cold int vc1_decode_init_alloc_tables(VC1Context *v)
  3253. {
  3254. MpegEncContext *s = &v->s;
  3255. int i;
  3256. /* Allocate mb bitplanes */
  3257. v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
  3258. v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
  3259. v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
  3260. v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
  3261. v->n_allocated_blks = s->mb_width + 2;
  3262. v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
  3263. v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
  3264. v->cbp = v->cbp_base + s->mb_stride;
  3265. v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
  3266. v->ttblk = v->ttblk_base + s->mb_stride;
  3267. v->is_intra_base = av_malloc(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
  3268. v->is_intra = v->is_intra_base + s->mb_stride;
  3269. v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
  3270. v->luma_mv = v->luma_mv_base + s->mb_stride;
  3271. /* allocate block type info in that way so it could be used with s->block_index[] */
  3272. v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
  3273. v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
  3274. v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
  3275. v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
  3276. /* Init coded blocks info */
  3277. if (v->profile == PROFILE_ADVANCED)
  3278. {
  3279. // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
  3280. // return -1;
  3281. // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
  3282. // return -1;
  3283. }
  3284. ff_intrax8_common_init(&v->x8,s);
  3285. if (s->avctx->codec_id == CODEC_ID_WMV3IMAGE || s->avctx->codec_id == CODEC_ID_VC1IMAGE) {
  3286. for (i = 0; i < 4; i++)
  3287. if (!(v->sr_rows[i>>1][i%2] = av_malloc(v->output_width))) return -1;
  3288. }
  3289. if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
  3290. !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
  3291. !v->mb_type_base)
  3292. return -1;
  3293. return 0;
  3294. }
  3295. /** Initialize a VC1/WMV3 decoder
  3296. * @todo TODO: Handle VC-1 IDUs (Transport level?)
  3297. * @todo TODO: Decypher remaining bits in extra_data
  3298. */
  3299. static av_cold int vc1_decode_init(AVCodecContext *avctx)
  3300. {
  3301. VC1Context *v = avctx->priv_data;
  3302. MpegEncContext *s = &v->s;
  3303. GetBitContext gb;
  3304. int i;
  3305. /* save the container output size for WMImage */
  3306. v->output_width = avctx->width;
  3307. v->output_height = avctx->height;
  3308. if (!avctx->extradata_size || !avctx->extradata) return -1;
  3309. if (!(avctx->flags & CODEC_FLAG_GRAY))
  3310. avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
  3311. else
  3312. avctx->pix_fmt = PIX_FMT_GRAY8;
  3313. avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
  3314. v->s.avctx = avctx;
  3315. avctx->flags |= CODEC_FLAG_EMU_EDGE;
  3316. v->s.flags |= CODEC_FLAG_EMU_EDGE;
  3317. if(avctx->idct_algo==FF_IDCT_AUTO){
  3318. avctx->idct_algo=FF_IDCT_WMV2;
  3319. }
  3320. if (vc1_init_common(v) < 0) return -1;
  3321. ff_vc1dsp_init(&v->vc1dsp);
  3322. if (avctx->codec_id == CODEC_ID_WMV3 || avctx->codec_id == CODEC_ID_WMV3IMAGE)
  3323. {
  3324. int count = 0;
  3325. // looks like WMV3 has a sequence header stored in the extradata
  3326. // advanced sequence header may be before the first frame
  3327. // the last byte of the extradata is a version number, 1 for the
  3328. // samples we can decode
  3329. init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
  3330. if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
  3331. return -1;
  3332. count = avctx->extradata_size*8 - get_bits_count(&gb);
  3333. if (count>0)
  3334. {
  3335. av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
  3336. count, get_bits(&gb, count));
  3337. }
  3338. else if (count < 0)
  3339. {
  3340. av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
  3341. }
  3342. } else { // VC1/WVC1/WVP2
  3343. const uint8_t *start = avctx->extradata;
  3344. uint8_t *end = avctx->extradata + avctx->extradata_size;
  3345. const uint8_t *next;
  3346. int size, buf2_size;
  3347. uint8_t *buf2 = NULL;
  3348. int seq_initialized = 0, ep_initialized = 0;
  3349. if(avctx->extradata_size < 16) {
  3350. av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
  3351. return -1;
  3352. }
  3353. buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
  3354. start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
  3355. next = start;
  3356. for(; next < end; start = next){
  3357. next = find_next_marker(start + 4, end);
  3358. size = next - start - 4;
  3359. if(size <= 0) continue;
  3360. buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
  3361. init_get_bits(&gb, buf2, buf2_size * 8);
  3362. switch(AV_RB32(start)){
  3363. case VC1_CODE_SEQHDR:
  3364. if(vc1_decode_sequence_header(avctx, v, &gb) < 0){
  3365. av_free(buf2);
  3366. return -1;
  3367. }
  3368. seq_initialized = 1;
  3369. break;
  3370. case VC1_CODE_ENTRYPOINT:
  3371. if(vc1_decode_entry_point(avctx, v, &gb) < 0){
  3372. av_free(buf2);
  3373. return -1;
  3374. }
  3375. ep_initialized = 1;
  3376. break;
  3377. }
  3378. }
  3379. av_free(buf2);
  3380. if(!seq_initialized || !ep_initialized){
  3381. av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
  3382. return -1;
  3383. }
  3384. v->res_sprite = (avctx->codec_tag == MKTAG('W','V','P','2'));
  3385. }
  3386. avctx->profile = v->profile;
  3387. if (v->profile == PROFILE_ADVANCED)
  3388. avctx->level = v->level;
  3389. avctx->has_b_frames= !!(avctx->max_b_frames);
  3390. s->mb_width = (avctx->coded_width+15)>>4;
  3391. s->mb_height = (avctx->coded_height+15)>>4;
  3392. if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
  3393. for (i = 0; i < 64; i++) {
  3394. #define transpose(x) ((x>>3) | ((x&7)<<3))
  3395. v->zz_8x8[0][i] = transpose(wmv1_scantable[0][i]);
  3396. v->zz_8x8[1][i] = transpose(wmv1_scantable[1][i]);
  3397. v->zz_8x8[2][i] = transpose(wmv1_scantable[2][i]);
  3398. v->zz_8x8[3][i] = transpose(wmv1_scantable[3][i]);
  3399. }
  3400. v->left_blk_sh = 0;
  3401. v->top_blk_sh = 3;
  3402. } else {
  3403. memcpy(v->zz_8x8, wmv1_scantable, 4*64);
  3404. v->left_blk_sh = 3;
  3405. v->top_blk_sh = 0;
  3406. }
  3407. if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
  3408. v->sprite_width = avctx->coded_width;
  3409. v->sprite_height = avctx->coded_height;
  3410. avctx->coded_width = avctx->width = v->output_width;
  3411. avctx->coded_height = avctx->height = v->output_height;
  3412. // prevent 16.16 overflows
  3413. if (v->sprite_width > 1<<14 ||
  3414. v->sprite_height > 1<<14 ||
  3415. v->output_width > 1<<14 ||
  3416. v->output_height > 1<<14) return -1;
  3417. }
  3418. return 0;
  3419. }
  3420. /** Close a VC1/WMV3 decoder
  3421. * @warning Initial try at using MpegEncContext stuff
  3422. */
  3423. static av_cold int vc1_decode_end(AVCodecContext *avctx)
  3424. {
  3425. VC1Context *v = avctx->priv_data;
  3426. int i;
  3427. if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
  3428. && v->sprite_output_frame.data[0])
  3429. avctx->release_buffer(avctx, &v->sprite_output_frame);
  3430. for (i = 0; i < 4; i++)
  3431. av_freep(&v->sr_rows[i>>1][i%2]);
  3432. av_freep(&v->hrd_rate);
  3433. av_freep(&v->hrd_buffer);
  3434. MPV_common_end(&v->s);
  3435. av_freep(&v->mv_type_mb_plane);
  3436. av_freep(&v->direct_mb_plane);
  3437. av_freep(&v->acpred_plane);
  3438. av_freep(&v->over_flags_plane);
  3439. av_freep(&v->mb_type_base);
  3440. av_freep(&v->block);
  3441. av_freep(&v->cbp_base);
  3442. av_freep(&v->ttblk_base);
  3443. av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
  3444. av_freep(&v->luma_mv_base);
  3445. ff_intrax8_common_end(&v->x8);
  3446. return 0;
  3447. }
  3448. /** Decode a VC1/WMV3 frame
  3449. * @todo TODO: Handle VC-1 IDUs (Transport level?)
  3450. */
  3451. static int vc1_decode_frame(AVCodecContext *avctx,
  3452. void *data, int *data_size,
  3453. AVPacket *avpkt)
  3454. {
  3455. const uint8_t *buf = avpkt->data;
  3456. int buf_size = avpkt->size, n_slices = 0, i;
  3457. VC1Context *v = avctx->priv_data;
  3458. MpegEncContext *s = &v->s;
  3459. AVFrame *pict = data;
  3460. uint8_t *buf2 = NULL;
  3461. const uint8_t *buf_start = buf;
  3462. struct {
  3463. uint8_t *buf;
  3464. GetBitContext gb;
  3465. int mby_start;
  3466. } *slices = NULL;
  3467. /* no supplementary picture */
  3468. if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
  3469. /* special case for last picture */
  3470. if (s->low_delay==0 && s->next_picture_ptr) {
  3471. *pict= *(AVFrame*)s->next_picture_ptr;
  3472. s->next_picture_ptr= NULL;
  3473. *data_size = sizeof(AVFrame);
  3474. }
  3475. return 0;
  3476. }
  3477. if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){
  3478. if (v->profile < PROFILE_ADVANCED)
  3479. avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
  3480. else
  3481. avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
  3482. }
  3483. //for advanced profile we may need to parse and unescape data
  3484. if (avctx->codec_id == CODEC_ID_VC1 || avctx->codec_id == CODEC_ID_VC1IMAGE) {
  3485. int buf_size2 = 0;
  3486. buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
  3487. if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
  3488. const uint8_t *start, *end, *next;
  3489. int size;
  3490. next = buf;
  3491. for(start = buf, end = buf + buf_size; next < end; start = next){
  3492. next = find_next_marker(start + 4, end);
  3493. size = next - start - 4;
  3494. if(size <= 0) continue;
  3495. switch(AV_RB32(start)){
  3496. case VC1_CODE_FRAME:
  3497. if (avctx->hwaccel ||
  3498. s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
  3499. buf_start = start;
  3500. buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
  3501. break;
  3502. case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
  3503. buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
  3504. init_get_bits(&s->gb, buf2, buf_size2*8);
  3505. vc1_decode_entry_point(avctx, v, &s->gb);
  3506. break;
  3507. case VC1_CODE_SLICE: {
  3508. int buf_size3;
  3509. slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
  3510. if (!slices) goto err;
  3511. slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
  3512. if (!slices[n_slices].buf) goto err;
  3513. buf_size3 = vc1_unescape_buffer(start + 4, size,
  3514. slices[n_slices].buf);
  3515. init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
  3516. buf_size3 << 3);
  3517. slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
  3518. n_slices++;
  3519. break;
  3520. }
  3521. }
  3522. }
  3523. }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
  3524. const uint8_t *divider;
  3525. divider = find_next_marker(buf, buf + buf_size);
  3526. if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
  3527. av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
  3528. goto err;
  3529. }
  3530. buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
  3531. // TODO
  3532. if(!v->warn_interlaced++)
  3533. av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced WVC1 support is not implemented\n");
  3534. goto err;
  3535. }else{
  3536. buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
  3537. }
  3538. init_get_bits(&s->gb, buf2, buf_size2*8);
  3539. } else
  3540. init_get_bits(&s->gb, buf, buf_size*8);
  3541. if (v->res_sprite) {
  3542. v->new_sprite = !get_bits1(&s->gb);
  3543. v->two_sprites = get_bits1(&s->gb);
  3544. /* res_sprite means a Windows Media Image stream, CODEC_ID_*IMAGE means
  3545. we're using the sprite compositor. These are intentionally kept separate
  3546. so you can get the raw sprites by using the wmv3 decoder for WMVP or
  3547. the vc1 one for WVP2 */
  3548. if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
  3549. if (v->new_sprite) {
  3550. // switch AVCodecContext parameters to those of the sprites
  3551. avctx->width = avctx->coded_width = v->sprite_width;
  3552. avctx->height = avctx->coded_height = v->sprite_height;
  3553. } else {
  3554. goto image;
  3555. }
  3556. }
  3557. }
  3558. if (s->context_initialized &&
  3559. (s->width != avctx->coded_width ||
  3560. s->height != avctx->coded_height)) {
  3561. vc1_decode_end(avctx);
  3562. }
  3563. if (!s->context_initialized) {
  3564. if (ff_msmpeg4_decode_init(avctx) < 0 || vc1_decode_init_alloc_tables(v) < 0)
  3565. return -1;
  3566. s->low_delay = !avctx->has_b_frames || v->res_sprite;
  3567. if (v->profile == PROFILE_ADVANCED) {
  3568. s->h_edge_pos = avctx->coded_width;
  3569. s->v_edge_pos = avctx->coded_height;
  3570. }
  3571. }
  3572. /* We need to set current_picture_ptr before reading the header,
  3573. * otherwise we cannot store anything in there. */
  3574. if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
  3575. int i= ff_find_unused_picture(s, 0);
  3576. s->current_picture_ptr= &s->picture[i];
  3577. }
  3578. // do parse frame header
  3579. if(v->profile < PROFILE_ADVANCED) {
  3580. if(vc1_parse_frame_header(v, &s->gb) == -1) {
  3581. goto err;
  3582. }
  3583. } else {
  3584. if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
  3585. goto err;
  3586. }
  3587. }
  3588. if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
  3589. && s->pict_type!=AV_PICTURE_TYPE_I) {
  3590. av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
  3591. goto err;
  3592. }
  3593. // process pulldown flags
  3594. s->current_picture_ptr->f.repeat_pict = 0;
  3595. // Pulldown flags are only valid when 'broadcast' has been set.
  3596. // So ticks_per_frame will be 2
  3597. if (v->rff){
  3598. // repeat field
  3599. s->current_picture_ptr->f.repeat_pict = 1;
  3600. }else if (v->rptfrm){
  3601. // repeat frames
  3602. s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
  3603. }
  3604. // for skipping the frame
  3605. s->current_picture.f.pict_type = s->pict_type;
  3606. s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
  3607. /* skip B-frames if we don't have reference frames */
  3608. if(s->last_picture_ptr==NULL && (s->pict_type==AV_PICTURE_TYPE_B || s->dropable)){
  3609. goto err;
  3610. }
  3611. if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==AV_PICTURE_TYPE_B)
  3612. || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=AV_PICTURE_TYPE_I)
  3613. || avctx->skip_frame >= AVDISCARD_ALL) {
  3614. goto end;
  3615. }
  3616. if(s->next_p_frame_damaged){
  3617. if(s->pict_type==AV_PICTURE_TYPE_B)
  3618. goto end;
  3619. else
  3620. s->next_p_frame_damaged=0;
  3621. }
  3622. if(MPV_frame_start(s, avctx) < 0) {
  3623. goto err;
  3624. }
  3625. s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
  3626. s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
  3627. if ((CONFIG_VC1_VDPAU_DECODER)
  3628. &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
  3629. ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
  3630. else if (avctx->hwaccel) {
  3631. if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
  3632. goto err;
  3633. if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
  3634. goto err;
  3635. if (avctx->hwaccel->end_frame(avctx) < 0)
  3636. goto err;
  3637. } else {
  3638. ff_er_frame_start(s);
  3639. v->bits = buf_size * 8;
  3640. for (i = 0; i <= n_slices; i++) {
  3641. if (i && get_bits1(&s->gb))
  3642. vc1_parse_frame_header_adv(v, &s->gb);
  3643. s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start);
  3644. s->end_mb_y = (i == n_slices) ? s->mb_height : FFMIN(s->mb_height, slices[i].mby_start);
  3645. vc1_decode_blocks(v);
  3646. if (i != n_slices) s->gb = slices[i].gb;
  3647. }
  3648. //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), s->gb.size_in_bits);
  3649. // if(get_bits_count(&s->gb) > buf_size * 8)
  3650. // return -1;
  3651. ff_er_frame_end(s);
  3652. }
  3653. MPV_frame_end(s);
  3654. assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type);
  3655. assert(s->current_picture.f.pict_type == s->pict_type);
  3656. if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
  3657. image:
  3658. avctx->width = avctx->coded_width = v->output_width;
  3659. avctx->height = avctx->coded_height = v->output_height;
  3660. if (avctx->skip_frame >= AVDISCARD_NONREF) goto end;
  3661. #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
  3662. if (vc1_decode_sprites(v, &s->gb)) goto err;
  3663. #endif
  3664. *pict = v->sprite_output_frame;
  3665. *data_size = sizeof(AVFrame);
  3666. } else {
  3667. if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
  3668. *pict= *(AVFrame*)s->current_picture_ptr;
  3669. } else if (s->last_picture_ptr != NULL) {
  3670. *pict= *(AVFrame*)s->last_picture_ptr;
  3671. }
  3672. if(s->last_picture_ptr || s->low_delay){
  3673. *data_size = sizeof(AVFrame);
  3674. ff_print_debug_info(s, pict);
  3675. }
  3676. }
  3677. end:
  3678. av_free(buf2);
  3679. for (i = 0; i < n_slices; i++)
  3680. av_free(slices[i].buf);
  3681. av_free(slices);
  3682. return buf_size;
  3683. err:
  3684. av_free(buf2);
  3685. for (i = 0; i < n_slices; i++)
  3686. av_free(slices[i].buf);
  3687. av_free(slices);
  3688. return -1;
  3689. }
  3690. static const AVProfile profiles[] = {
  3691. { FF_PROFILE_VC1_SIMPLE, "Simple" },
  3692. { FF_PROFILE_VC1_MAIN, "Main" },
  3693. { FF_PROFILE_VC1_COMPLEX, "Complex" },
  3694. { FF_PROFILE_VC1_ADVANCED, "Advanced" },
  3695. { FF_PROFILE_UNKNOWN },
  3696. };
  3697. AVCodec ff_vc1_decoder = {
  3698. .name = "vc1",
  3699. .type = AVMEDIA_TYPE_VIDEO,
  3700. .id = CODEC_ID_VC1,
  3701. .priv_data_size = sizeof(VC1Context),
  3702. .init = vc1_decode_init,
  3703. .close = vc1_decode_end,
  3704. .decode = vc1_decode_frame,
  3705. .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
  3706. .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
  3707. .pix_fmts = ff_hwaccel_pixfmt_list_420,
  3708. .profiles = NULL_IF_CONFIG_SMALL(profiles)
  3709. };
  3710. #if CONFIG_WMV3_DECODER
  3711. AVCodec ff_wmv3_decoder = {
  3712. .name = "wmv3",
  3713. .type = AVMEDIA_TYPE_VIDEO,
  3714. .id = CODEC_ID_WMV3,
  3715. .priv_data_size = sizeof(VC1Context),
  3716. .init = vc1_decode_init,
  3717. .close = vc1_decode_end,
  3718. .decode = vc1_decode_frame,
  3719. .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
  3720. .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
  3721. .pix_fmts = ff_hwaccel_pixfmt_list_420,
  3722. .profiles = NULL_IF_CONFIG_SMALL(profiles)
  3723. };
  3724. #endif
  3725. #if CONFIG_WMV3_VDPAU_DECODER
  3726. AVCodec ff_wmv3_vdpau_decoder = {
  3727. .name = "wmv3_vdpau",
  3728. .type = AVMEDIA_TYPE_VIDEO,
  3729. .id = CODEC_ID_WMV3,
  3730. .priv_data_size = sizeof(VC1Context),
  3731. .init = vc1_decode_init,
  3732. .close = vc1_decode_end,
  3733. .decode = vc1_decode_frame,
  3734. .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
  3735. .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
  3736. .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE},
  3737. .profiles = NULL_IF_CONFIG_SMALL(profiles)
  3738. };
  3739. #endif
  3740. #if CONFIG_VC1_VDPAU_DECODER
  3741. AVCodec ff_vc1_vdpau_decoder = {
  3742. .name = "vc1_vdpau",
  3743. .type = AVMEDIA_TYPE_VIDEO,
  3744. .id = CODEC_ID_VC1,
  3745. .priv_data_size = sizeof(VC1Context),
  3746. .init = vc1_decode_init,
  3747. .close = vc1_decode_end,
  3748. .decode = vc1_decode_frame,
  3749. .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
  3750. .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
  3751. .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE},
  3752. .profiles = NULL_IF_CONFIG_SMALL(profiles)
  3753. };
  3754. #endif
  3755. #if CONFIG_WMV3IMAGE_DECODER
  3756. AVCodec ff_wmv3image_decoder = {
  3757. .name = "wmv3image",
  3758. .type = AVMEDIA_TYPE_VIDEO,
  3759. .id = CODEC_ID_WMV3IMAGE,
  3760. .priv_data_size = sizeof(VC1Context),
  3761. .init = vc1_decode_init,
  3762. .close = vc1_decode_end,
  3763. .decode = vc1_decode_frame,
  3764. .capabilities = CODEC_CAP_DR1,
  3765. .flush = vc1_sprite_flush,
  3766. .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
  3767. .pix_fmts = ff_pixfmt_list_420
  3768. };
  3769. #endif
  3770. #if CONFIG_VC1IMAGE_DECODER
  3771. AVCodec ff_vc1image_decoder = {
  3772. .name = "vc1image",
  3773. .type = AVMEDIA_TYPE_VIDEO,
  3774. .id = CODEC_ID_VC1IMAGE,
  3775. .priv_data_size = sizeof(VC1Context),
  3776. .init = vc1_decode_init,
  3777. .close = vc1_decode_end,
  3778. .decode = vc1_decode_frame,
  3779. .capabilities = CODEC_CAP_DR1,
  3780. .flush = vc1_sprite_flush,
  3781. .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
  3782. .pix_fmts = ff_pixfmt_list_420
  3783. };
  3784. #endif