2016-01-23 2 views
1

Я запутался со следующим кодом в libavcodec/h264_cavlc.c , который является частью декодера h264 ffmpeg.h264 int4x4 pred режим декодирования в ffmpeg

int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl) 
    . 
    . 
    . 
     if(IS_INTRA4x4(mb_type)){ 
      int i; 
      int di = 1; 
      if(dct8x8_allowed && get_bits1(&sl->gb)){ 
       mb_type |= MB_TYPE_8x8DCT; 
       di = 4; 
      } 

//    fill_intra4x4_pred_table(h); 
      for(i=0; i<16; i+=di){ 
       int mode = pred_intra_mode(h, sl, i); 

       if(!get_bits1(&sl->gb)){ 
        const int rem_mode= get_bits(&sl->gb, 3); 
        mode = rem_mode + (rem_mode >= mode); 
       } 

       if(di==4) 
        fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1); 
       else 
        sl->intra4x4_pred_mode_cache[scan8[i]] = mode; 
      } 
      write_back_intra_pred_mode(h, sl); 
      if (ff_h264_check_intra4x4_pred_mode(h, sl) < 0) 
       return -1; 
     } 

, когда он считывает di == 4 только четыре режима предсказания из битового потока. Я ожидаю извлечь 16 предварительных режимов с , мы работаем над макроблоком INTRA4x4.

какая функция fill_rectangle() делать?

ответ

2

di = 4 означает, что мы используем DCT 8x8 для этого субблока. У вас есть до 16 режимов, только если все субблоки в этом макроблоке используют 4x4 DCT. Если вы используете DCT 8x8, у вас может быть всего 4 подблока на макроблок. Каждый блок может выбирать DCT 8x8 или 4x4, чтобы вы могли иметь 4 (4x DCT8, 0x DCT4), 7 (3x DCT8, 1x 2x2 DCT4), 10, 13 или 16 встроенных режимов, закодированных на макроблок.

Для следующего 4x4 прямоугольника субблоков в макроблоке:

a b c d 
e f g h 
i j k l 
m n o p 

scan8 [] дает индекс в правой нижней выровненного массива 8x5, как это:

x x x tl t1 t2 t3 t4 
x x x l1 a b c d 
x x x l2 e f g h 
x x x l3 i j k l 
x x x l4 m n o p 

, который позволяет для получения выше/левых краев для контекстных целей для прогнозирования внутреннего режима текущего блока. fill_rectangle заполняет 2x2 "прямоугольник" в том же режиме, с шагом 8, например. a, b, e и f для блокирующего блока 8x8 DCT.

Для целей визуализации, если блок и bottomright верхнего-левого использовал 8x8 DCT, блок будет существенно использовать интр макетов режима прогнозирования, как это:

A c d 
    g h 
i j K 
m n 
Смежные вопросы