]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/wmv2.c
X8 is supported now, so warning is incorrect
[ffmpeg] / libavcodec / wmv2.c
index 259b754a959d5f5ae64ad7dfa64ccac595be6f52..365f5654f8821018b27a179ec8db93e3c1928495 100644 (file)
@@ -16,7 +16,6 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  */
 
 /**
  * wmv2 codec.
  */
 
+#include "avcodec.h"
+#include "dsputil.h"
+#include "mpegvideo.h"
+#include "msmpeg4.h"
+#include "msmpeg4data.h"
 #include "simple_idct.h"
+#include "intrax8.h"
 
 #define SKIP_TYPE_NONE 0
 #define SKIP_TYPE_MPEG 1
 
 typedef struct Wmv2Context{
     MpegEncContext s;
+    IntraX8Context x8;
     int j_type_bit;
     int j_type;
-    int flag3;
-    int flag63;
     int abt_flag;
     int abt_type;
     int abt_type_table[6];
@@ -74,7 +78,7 @@ static int encode_ext_header(Wmv2Context *w){
     put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047));
 
     put_bits(&pb, 1, w->mspel_bit=1);
-    put_bits(&pb, 1, w->flag3=1);
+    put_bits(&pb, 1, s->loop_filter);
     put_bits(&pb, 1, w->abt_flag=1);
     put_bits(&pb, 1, w->j_type_bit=1);
     put_bits(&pb, 1, w->top_left_mv_flag=0);
@@ -144,8 +148,8 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
         if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
 
         if(!s->per_mb_rl_table){
-            ff_code012(&s->pb, s->rl_chroma_table_index);
-            ff_code012(&s->pb, s->rl_table_index);
+            ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
+            ff_msmpeg4_code012(&s->pb, s->rl_table_index);
         }
 
         put_bits(&s->pb, 1, s->dc_table_index);
@@ -156,7 +160,7 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
 
         put_bits(&s->pb, 2, SKIP_TYPE_NONE);
 
-        ff_code012(&s->pb, cbp_index=0);
+        ff_msmpeg4_code012(&s->pb, cbp_index=0);
         if(s->qscale <= 10){
             int map[3]= {0,2,1};
             w->cbp_table_index= map[cbp_index];
@@ -173,14 +177,14 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
         if(w->abt_flag){
             put_bits(&s->pb, 1, w->per_mb_abt^1);
             if(!w->per_mb_abt){
-                ff_code012(&s->pb, w->abt_type);
+                ff_msmpeg4_code012(&s->pb, w->abt_type);
             }
         }
 
         if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
 
         if(!s->per_mb_rl_table){
-            ff_code012(&s->pb, s->rl_table_index);
+            ff_msmpeg4_code012(&s->pb, s->rl_table_index);
             s->rl_chroma_table_index = s->rl_table_index;
         }
         put_bits(&s->pb, 1, s->dc_table_index);
@@ -206,7 +210,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
     int pred_x, pred_y;
     uint8_t *coded_block;
 
-    handle_slices(s);
+    ff_msmpeg4_handle_slices(s);
 
     if (!s->mb_intra) {
         /* compute cbp */
@@ -222,7 +226,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
 
         /* motion vector */
         h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
-        msmpeg4_encode_motion(s, motion_x - pred_x,
+        ff_msmpeg4_encode_motion(s, motion_x - pred_x,
                               motion_y - pred_y);
     } else {
         /* compute cbp */
@@ -234,7 +238,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
             cbp |= val << (5 - i);
             if (i < 4) {
                 /* predict value for close blocks only for luma */
-                pred = coded_block_pred(s, i, &coded_block);
+                pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
                 *coded_block = val;
                 val = val ^ pred;
             }
@@ -329,7 +333,7 @@ static int decode_ext_header(Wmv2Context *w){
     fps                = get_bits(&gb, 5);
     s->bit_rate        = get_bits(&gb, 11)*1024;
     w->mspel_bit       = get_bits1(&gb);
-    w->flag3           = get_bits1(&gb);
+    s->loop_filter     = get_bits1(&gb);
     w->abt_flag        = get_bits1(&gb);
     w->j_type_bit      = get_bits1(&gb);
     w->top_left_mv_flag= get_bits1(&gb);
@@ -341,8 +345,8 @@ static int decode_ext_header(Wmv2Context *w){
     s->slice_height = s->mb_height / code;
 
     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
-        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, flag3:%d, slices:%d\n",
-        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, w->flag3,
+        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",
+        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,
         code);
     }
     return 0;
@@ -366,7 +370,7 @@ return -1;
     if(s->picture_number==0)
         decode_ext_header(w);
 
-    s->pict_type = get_bits(&s->gb, 1) + 1;
+    s->pict_type = get_bits1(&s->gb) + 1;
     if(s->pict_type == I_TYPE){
         code = get_bits(&s->gb, 7);
         av_log(s->avctx, AV_LOG_DEBUG, "I7:%X/\n", code);
@@ -470,12 +474,9 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext * s)
 s->picture_number++; //FIXME ?
 
 
-//    if(w->j_type)
-//        return wmv2_decode_j_picture(w); //FIXME
-
     if(w->j_type){
-        av_log(s->avctx, AV_LOG_ERROR, "J-type picture is not supported\n");
-        return -1;
+        ff_intrax8_decode_picture(&w->x8, 2*s->qscale, (s->qscale-1)|1 );
+        return 1;
     }
 
     return 0;
@@ -485,7 +486,7 @@ static inline int wmv2_decode_motion(Wmv2Context *w, int *mx_ptr, int *my_ptr){
     MpegEncContext * const s= &w->s;
     int ret;
 
-    ret= msmpeg4_decode_motion(s, mx_ptr, my_ptr);
+    ret= ff_msmpeg4_decode_motion(s, mx_ptr, my_ptr);
 
     if(ret<0) return -1;
 
@@ -571,19 +572,19 @@ static inline int wmv2_decode_inter_block(Wmv2Context *w, DCTELEM *block, int n,
 //        printf("S%d", sub_cbp);
 
         if(sub_cbp&1){
-            if (msmpeg4_decode_block(s, block, n, 1, scantable) < 0)
+            if (ff_msmpeg4_decode_block(s, block, n, 1, scantable) < 0)
                 return -1;
         }
 
         if(sub_cbp&2){
-            if (msmpeg4_decode_block(s, w->abt_block2[n], n, 1, scantable) < 0)
+            if (ff_msmpeg4_decode_block(s, w->abt_block2[n], n, 1, scantable) < 0)
                 return -1;
         }
         s->block_last_index[n] = 63;
 
         return 0;
     }else{
-        return msmpeg4_decode_block(s, block, n, 1, s->inter_scantable.permutated);
+        return ff_msmpeg4_decode_block(s, block, n, 1, s->inter_scantable.permutated);
     }
 }
 
@@ -714,7 +715,7 @@ void ff_mspel_motion(MpegEncContext *s,
 }
 
 
-static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
+int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 {
     Wmv2Context * const w= (Wmv2Context*)s;
     int cbp, code, i;
@@ -737,7 +738,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
             return 0;
         }
 
-        code = get_vlc2(&s->gb, mb_non_intra_vlc[w->cbp_table_index].table, MB_NON_INTRA_VLC_BITS, 3);
+        code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[w->cbp_table_index].table, MB_NON_INTRA_VLC_BITS, 3);
         if (code < 0)
             return -1;
         s->mb_intra = (~code & 0x40) >> 6;
@@ -755,7 +756,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
         for(i=0;i<6;i++) {
             int val = ((code >> (5 - i)) & 1);
             if (i < 4) {
-                int pred = coded_block_pred(s, i, &coded_val);
+                int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
                 val = val ^ pred;
                 *coded_val = val;
             }
@@ -804,7 +805,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 //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));
         s->ac_pred = get_bits1(&s->gb);
         if(s->inter_intra_pred){
-            s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
+            s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
 //            printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
         }
         if(s->per_mb_rl_table && cbp){
@@ -814,7 +815,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 
         s->dsp.clear_blocks(s->block[0]);
         for (i = 0; i < 6; i++) {
-            if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
+            if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
             {
                 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding intra block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
                 return -1;
@@ -828,11 +829,17 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 static int wmv2_decode_init(AVCodecContext *avctx){
     Wmv2Context * const w= avctx->priv_data;
 
+    if(avctx->idct_algo==FF_IDCT_AUTO){
+        avctx->idct_algo=FF_IDCT_WMV2;
+    }
+
     if(ff_h263_decode_init(avctx) < 0)
         return -1;
 
     wmv2_common_init(w);
 
+    ff_intrax8_common_init(&w->x8,&w->s);
+
     return 0;
 }