wmv2dec.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * Copyright (c) 2002 The FFmpeg Project
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "avcodec.h"
  21. #include "dsputil.h"
  22. #include "mpegvideo.h"
  23. #include "mathops.h"
  24. #include "msmpeg4.h"
  25. #include "msmpeg4data.h"
  26. #include "intrax8.h"
  27. #include "wmv2.h"
  28. static void parse_mb_skip(Wmv2Context * w){
  29. int mb_x, mb_y;
  30. MpegEncContext * const s= &w->s;
  31. uint32_t * const mb_type= s->current_picture_ptr->mb_type;
  32. w->skip_type= get_bits(&s->gb, 2);
  33. switch(w->skip_type){
  34. case SKIP_TYPE_NONE:
  35. for(mb_y=0; mb_y<s->mb_height; mb_y++){
  36. for(mb_x=0; mb_x<s->mb_width; mb_x++){
  37. mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_16x16 | MB_TYPE_L0;
  38. }
  39. }
  40. break;
  41. case SKIP_TYPE_MPEG:
  42. for(mb_y=0; mb_y<s->mb_height; mb_y++){
  43. for(mb_x=0; mb_x<s->mb_width; mb_x++){
  44. mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
  45. }
  46. }
  47. break;
  48. case SKIP_TYPE_ROW:
  49. for(mb_y=0; mb_y<s->mb_height; mb_y++){
  50. if(get_bits1(&s->gb)){
  51. for(mb_x=0; mb_x<s->mb_width; mb_x++){
  52. mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
  53. }
  54. }else{
  55. for(mb_x=0; mb_x<s->mb_width; mb_x++){
  56. mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
  57. }
  58. }
  59. }
  60. break;
  61. case SKIP_TYPE_COL:
  62. for(mb_x=0; mb_x<s->mb_width; mb_x++){
  63. if(get_bits1(&s->gb)){
  64. for(mb_y=0; mb_y<s->mb_height; mb_y++){
  65. mb_type[mb_y*s->mb_stride + mb_x]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
  66. }
  67. }else{
  68. for(mb_y=0; mb_y<s->mb_height; mb_y++){
  69. mb_type[mb_y*s->mb_stride + mb_x]= (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
  70. }
  71. }
  72. }
  73. break;
  74. }
  75. }
  76. static int decode_ext_header(Wmv2Context *w){
  77. MpegEncContext * const s= &w->s;
  78. GetBitContext gb;
  79. int fps;
  80. int code;
  81. if(s->avctx->extradata_size<4) return -1;
  82. init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
  83. fps = get_bits(&gb, 5);
  84. s->bit_rate = get_bits(&gb, 11)*1024;
  85. w->mspel_bit = get_bits1(&gb);
  86. s->loop_filter = get_bits1(&gb);
  87. w->abt_flag = get_bits1(&gb);
  88. w->j_type_bit = get_bits1(&gb);
  89. w->top_left_mv_flag= get_bits1(&gb);
  90. w->per_mb_rl_bit = get_bits1(&gb);
  91. code = get_bits(&gb, 3);
  92. if(code==0) return -1;
  93. s->slice_height = s->mb_height / code;
  94. if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  95. av_log(s->avctx, AV_LOG_DEBUG, "fps:%d, br:%d, qpbit:%d, abt_flag:%d, j_type_bit:%d, tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, slices:%d\n",
  96. fps, s->bit_rate, w->mspel_bit, w->abt_flag, w->j_type_bit, w->top_left_mv_flag, w->per_mb_rl_bit, code, s->loop_filter,
  97. code);
  98. }
  99. return 0;
  100. }
  101. int ff_wmv2_decode_picture_header(MpegEncContext * s)
  102. {
  103. Wmv2Context * const w= (Wmv2Context*)s;
  104. int code;
  105. #if 0
  106. {
  107. int i;
  108. for(i=0; i<s->gb.size*8; i++)
  109. printf("%d", get_bits1(&s->gb));
  110. // get_bits1(&s->gb);
  111. printf("END\n");
  112. return -1;
  113. }
  114. #endif
  115. if(s->picture_number==0)
  116. decode_ext_header(w);
  117. s->pict_type = get_bits1(&s->gb) + 1;
  118. if(s->pict_type == FF_I_TYPE){
  119. code = get_bits(&s->gb, 7);
  120. av_log(s->avctx, AV_LOG_DEBUG, "I7:%X/\n", code);
  121. }
  122. s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
  123. if(s->qscale <= 0)
  124. return -1;
  125. return 0;
  126. }
  127. int ff_wmv2_decode_secondary_picture_header(MpegEncContext * s)
  128. {
  129. Wmv2Context * const w= (Wmv2Context*)s;
  130. if (s->pict_type == FF_I_TYPE) {
  131. if(w->j_type_bit) w->j_type= get_bits1(&s->gb);
  132. else w->j_type= 0; //FIXME check
  133. if(!w->j_type){
  134. if(w->per_mb_rl_bit) s->per_mb_rl_table= get_bits1(&s->gb);
  135. else s->per_mb_rl_table= 0;
  136. if(!s->per_mb_rl_table){
  137. s->rl_chroma_table_index = decode012(&s->gb);
  138. s->rl_table_index = decode012(&s->gb);
  139. }
  140. s->dc_table_index = get_bits1(&s->gb);
  141. }
  142. s->inter_intra_pred= 0;
  143. s->no_rounding = 1;
  144. if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  145. av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n",
  146. s->qscale,
  147. s->rl_chroma_table_index,
  148. s->rl_table_index,
  149. s->dc_table_index,
  150. s->per_mb_rl_table,
  151. w->j_type);
  152. }
  153. }else{
  154. int cbp_index;
  155. w->j_type=0;
  156. parse_mb_skip(w);
  157. cbp_index= decode012(&s->gb);
  158. if(s->qscale <= 10){
  159. int map[3]= {0,2,1};
  160. w->cbp_table_index= map[cbp_index];
  161. }else if(s->qscale <= 20){
  162. int map[3]= {1,0,2};
  163. w->cbp_table_index= map[cbp_index];
  164. }else{
  165. int map[3]= {2,1,0};
  166. w->cbp_table_index= map[cbp_index];
  167. }
  168. if(w->mspel_bit) s->mspel= get_bits1(&s->gb);
  169. else s->mspel= 0; //FIXME check
  170. if(w->abt_flag){
  171. w->per_mb_abt= get_bits1(&s->gb)^1;
  172. if(!w->per_mb_abt){
  173. w->abt_type= decode012(&s->gb);
  174. }
  175. }
  176. if(w->per_mb_rl_bit) s->per_mb_rl_table= get_bits1(&s->gb);
  177. else s->per_mb_rl_table= 0;
  178. if(!s->per_mb_rl_table){
  179. s->rl_table_index = decode012(&s->gb);
  180. s->rl_chroma_table_index = s->rl_table_index;
  181. }
  182. s->dc_table_index = get_bits1(&s->gb);
  183. s->mv_table_index = get_bits1(&s->gb);
  184. s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
  185. s->no_rounding ^= 1;
  186. if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  187. av_log(s->avctx, AV_LOG_DEBUG, "rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d per_mb_abt:%d abt_type:%d cbp:%d ii:%d\n",
  188. s->rl_table_index,
  189. s->rl_chroma_table_index,
  190. s->dc_table_index,
  191. s->mv_table_index,
  192. s->per_mb_rl_table,
  193. s->qscale,
  194. s->mspel,
  195. w->per_mb_abt,
  196. w->abt_type,
  197. w->cbp_table_index,
  198. s->inter_intra_pred);
  199. }
  200. }
  201. s->esc3_level_length= 0;
  202. s->esc3_run_length= 0;
  203. s->picture_number++; //FIXME ?
  204. if(w->j_type){
  205. ff_intrax8_decode_picture(&w->x8, 2*s->qscale, (s->qscale-1)|1 );
  206. return 1;
  207. }
  208. return 0;
  209. }
  210. static inline int wmv2_decode_motion(Wmv2Context *w, int *mx_ptr, int *my_ptr){
  211. MpegEncContext * const s= &w->s;
  212. int ret;
  213. ret= ff_msmpeg4_decode_motion(s, mx_ptr, my_ptr);
  214. if(ret<0) return -1;
  215. if((((*mx_ptr)|(*my_ptr)) & 1) && s->mspel)
  216. w->hshift= get_bits1(&s->gb);
  217. else
  218. w->hshift= 0;
  219. //printf("%d %d ", *mx_ptr, *my_ptr);
  220. return 0;
  221. }
  222. static int16_t *wmv2_pred_motion(Wmv2Context *w, int *px, int *py){
  223. MpegEncContext * const s= &w->s;
  224. int xy, wrap, diff, type;
  225. int16_t *A, *B, *C, *mot_val;
  226. wrap = s->b8_stride;
  227. xy = s->block_index[0];
  228. mot_val = s->current_picture.motion_val[0][xy];
  229. A = s->current_picture.motion_val[0][xy - 1];
  230. B = s->current_picture.motion_val[0][xy - wrap];
  231. C = s->current_picture.motion_val[0][xy + 2 - wrap];
  232. if(s->mb_x && !s->first_slice_line && !s->mspel && w->top_left_mv_flag)
  233. diff= FFMAX(FFABS(A[0] - B[0]), FFABS(A[1] - B[1]));
  234. else
  235. diff=0;
  236. if(diff >= 8)
  237. type= get_bits1(&s->gb);
  238. else
  239. type= 2;
  240. if(type == 0){
  241. *px= A[0];
  242. *py= A[1];
  243. }else if(type == 1){
  244. *px= B[0];
  245. *py= B[1];
  246. }else{
  247. /* special case for first (slice) line */
  248. if (s->first_slice_line) {
  249. *px = A[0];
  250. *py = A[1];
  251. } else {
  252. *px = mid_pred(A[0], B[0], C[0]);
  253. *py = mid_pred(A[1], B[1], C[1]);
  254. }
  255. }
  256. return mot_val;
  257. }
  258. static inline int wmv2_decode_inter_block(Wmv2Context *w, DCTELEM *block, int n, int cbp){
  259. MpegEncContext * const s= &w->s;
  260. static const int sub_cbp_table[3]= {2,3,1};
  261. int sub_cbp;
  262. if(!cbp){
  263. s->block_last_index[n] = -1;
  264. return 0;
  265. }
  266. if(w->per_block_abt)
  267. w->abt_type= decode012(&s->gb);
  268. #if 0
  269. if(w->per_block_abt)
  270. printf("B%d", w->abt_type);
  271. #endif
  272. w->abt_type_table[n]= w->abt_type;
  273. if(w->abt_type){
  274. // const uint8_t *scantable= w->abt_scantable[w->abt_type-1].permutated;
  275. const uint8_t *scantable= w->abt_scantable[w->abt_type-1].scantable;
  276. // const uint8_t *scantable= w->abt_type-1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable;
  277. sub_cbp= sub_cbp_table[ decode012(&s->gb) ];
  278. // printf("S%d", sub_cbp);
  279. if(sub_cbp&1){
  280. if (ff_msmpeg4_decode_block(s, block, n, 1, scantable) < 0)
  281. return -1;
  282. }
  283. if(sub_cbp&2){
  284. if (ff_msmpeg4_decode_block(s, w->abt_block2[n], n, 1, scantable) < 0)
  285. return -1;
  286. }
  287. s->block_last_index[n] = 63;
  288. return 0;
  289. }else{
  290. return ff_msmpeg4_decode_block(s, block, n, 1, s->inter_scantable.permutated);
  291. }
  292. }
  293. int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
  294. {
  295. Wmv2Context * const w= (Wmv2Context*)s;
  296. int cbp, code, i;
  297. uint8_t *coded_val;
  298. if(w->j_type) return 0;
  299. if (s->pict_type == FF_P_TYPE) {
  300. if(IS_SKIP(s->current_picture.mb_type[s->mb_y * s->mb_stride + s->mb_x])){
  301. /* skip mb */
  302. s->mb_intra = 0;
  303. for(i=0;i<6;i++)
  304. s->block_last_index[i] = -1;
  305. s->mv_dir = MV_DIR_FORWARD;
  306. s->mv_type = MV_TYPE_16X16;
  307. s->mv[0][0][0] = 0;
  308. s->mv[0][0][1] = 0;
  309. s->mb_skipped = 1;
  310. w->hshift=0;
  311. return 0;
  312. }
  313. code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[w->cbp_table_index].table, MB_NON_INTRA_VLC_BITS, 3);
  314. if (code < 0)
  315. return -1;
  316. s->mb_intra = (~code & 0x40) >> 6;
  317. cbp = code & 0x3f;
  318. } else {
  319. s->mb_intra = 1;
  320. code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
  321. if (code < 0){
  322. av_log(s->avctx, AV_LOG_ERROR, "II-cbp illegal at %d %d\n", s->mb_x, s->mb_y);
  323. return -1;
  324. }
  325. /* predict coded block pattern */
  326. cbp = 0;
  327. for(i=0;i<6;i++) {
  328. int val = ((code >> (5 - i)) & 1);
  329. if (i < 4) {
  330. int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
  331. val = val ^ pred;
  332. *coded_val = val;
  333. }
  334. cbp |= val << (5 - i);
  335. }
  336. }
  337. if (!s->mb_intra) {
  338. int mx, my;
  339. //printf("P at %d %d\n", s->mb_x, s->mb_y);
  340. wmv2_pred_motion(w, &mx, &my);
  341. if(cbp){
  342. s->dsp.clear_blocks(s->block[0]);
  343. if(s->per_mb_rl_table){
  344. s->rl_table_index = decode012(&s->gb);
  345. s->rl_chroma_table_index = s->rl_table_index;
  346. }
  347. if(w->abt_flag && w->per_mb_abt){
  348. w->per_block_abt= get_bits1(&s->gb);
  349. if(!w->per_block_abt)
  350. w->abt_type= decode012(&s->gb);
  351. }else
  352. w->per_block_abt=0;
  353. }
  354. if (wmv2_decode_motion(w, &mx, &my) < 0)
  355. return -1;
  356. s->mv_dir = MV_DIR_FORWARD;
  357. s->mv_type = MV_TYPE_16X16;
  358. s->mv[0][0][0] = mx;
  359. s->mv[0][0][1] = my;
  360. for (i = 0; i < 6; i++) {
  361. if (wmv2_decode_inter_block(w, block[i], i, (cbp >> (5 - i)) & 1) < 0)
  362. {
  363. av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding inter block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
  364. return -1;
  365. }
  366. }
  367. } else {
  368. //if(s->pict_type==FF_P_TYPE)
  369. // printf("%d%d ", s->inter_intra_pred, cbp);
  370. //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
  371. s->ac_pred = get_bits1(&s->gb);
  372. if(s->inter_intra_pred){
  373. s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
  374. // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
  375. }
  376. if(s->per_mb_rl_table && cbp){
  377. s->rl_table_index = decode012(&s->gb);
  378. s->rl_chroma_table_index = s->rl_table_index;
  379. }
  380. s->dsp.clear_blocks(s->block[0]);
  381. for (i = 0; i < 6; i++) {
  382. if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
  383. {
  384. av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding intra block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
  385. return -1;
  386. }
  387. }
  388. }
  389. return 0;
  390. }
  391. static av_cold int wmv2_decode_init(AVCodecContext *avctx){
  392. Wmv2Context * const w= avctx->priv_data;
  393. if(avctx->idct_algo==FF_IDCT_AUTO){
  394. avctx->idct_algo=FF_IDCT_WMV2;
  395. }
  396. if(ff_h263_decode_init(avctx) < 0)
  397. return -1;
  398. ff_wmv2_common_init(w);
  399. ff_intrax8_common_init(&w->x8,&w->s);
  400. return 0;
  401. }
  402. static av_cold int wmv2_decode_end(AVCodecContext *avctx)
  403. {
  404. Wmv2Context *w = avctx->priv_data;
  405. ff_intrax8_common_end(&w->x8);
  406. return ff_h263_decode_end(avctx);
  407. }
  408. AVCodec wmv2_decoder = {
  409. "wmv2",
  410. CODEC_TYPE_VIDEO,
  411. CODEC_ID_WMV2,
  412. sizeof(Wmv2Context),
  413. wmv2_decode_init,
  414. NULL,
  415. wmv2_decode_end,
  416. ff_h263_decode_frame,
  417. CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
  418. .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"),
  419. .pix_fmts= ff_pixfmt_list_420,
  420. };