Commit a7da517f authored by Diego Biurrun's avatar Diego Biurrun

h264data: Move all data tables from a header to a .c file

parent f4d581cd
...@@ -251,7 +251,8 @@ OBJS-$(CONFIG_H263_ENCODER) += mpeg4videoenc.o mpeg4video.o \ ...@@ -251,7 +251,8 @@ OBJS-$(CONFIG_H263_ENCODER) += mpeg4videoenc.o mpeg4video.o \
OBJS-$(CONFIG_H264_DECODER) += h264.o h264_cabac.o h264_cavlc.o \ OBJS-$(CONFIG_H264_DECODER) += h264.o h264_cabac.o h264_cavlc.o \
h264_direct.o h264_loopfilter.o \ h264_direct.o h264_loopfilter.o \
h264_mb.o h264_picture.o h264_ps.o \ h264_mb.o h264_picture.o h264_ps.o \
h264_refs.o h264_sei.o h264_slice.o h264_refs.o h264_sei.o \
h264_slice.o h264data.o
OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o
OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc_h264.o
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h2645.o OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h2645.o
......
...@@ -176,7 +176,7 @@ static void fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx, ...@@ -176,7 +176,7 @@ static void fill_scaling_lists(const AVCodecContext *avctx, AVDXVAContext *ctx,
} else { } else {
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
for (j = 0; j < 16; j++) for (j = 0; j < 16; j++)
qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][zigzag_scan[j]]; qm->bScalingLists4x4[i][j] = h->pps.scaling_matrix4[i][ff_zigzag_scan[j]];
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
qm->bScalingLists8x8[0][i] = h->pps.scaling_matrix8[0][ff_zigzag_direct[i]]; qm->bScalingLists8x8[0][i] = h->pps.scaling_matrix8[0][ff_zigzag_direct[i]];
......
...@@ -1986,8 +1986,8 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl) ...@@ -1986,8 +1986,8 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */ mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
} }
} }
partition_count= b_mb_type_info[mb_type].partition_count; partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
mb_type= b_mb_type_info[mb_type].type; mb_type = ff_h264_b_mb_type_info[mb_type].type;
} else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) { } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) { if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
/* P-type */ /* P-type */
...@@ -1998,8 +1998,8 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl) ...@@ -1998,8 +1998,8 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
/* P_L0_D8x16, P_L0_D16x8 */ /* P_L0_D8x16, P_L0_D16x8 */
mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] ); mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
} }
partition_count= p_mb_type_info[mb_type].partition_count; partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
mb_type= p_mb_type_info[mb_type].type; mb_type = ff_h264_p_mb_type_info[mb_type].type;
} else { } else {
mb_type = decode_cabac_intra_mb_type(sl, 17, 0); mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
goto decode_intra_mb; goto decode_intra_mb;
...@@ -2011,9 +2011,9 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl) ...@@ -2011,9 +2011,9 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
assert(sl->slice_type_nos == AV_PICTURE_TYPE_I); assert(sl->slice_type_nos == AV_PICTURE_TYPE_I);
decode_intra_mb: decode_intra_mb:
partition_count = 0; partition_count = 0;
cbp= i_mb_type_info[mb_type].cbp; cbp = ff_h264_i_mb_type_info[mb_type].cbp;
sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode; sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
mb_type= i_mb_type_info[mb_type].type; mb_type = ff_h264_i_mb_type_info[mb_type].type;
} }
if (MB_FIELD(sl)) if (MB_FIELD(sl))
mb_type |= MB_TYPE_INTERLACED; mb_type |= MB_TYPE_INTERLACED;
...@@ -2097,8 +2097,8 @@ decode_intra_mb: ...@@ -2097,8 +2097,8 @@ decode_intra_mb:
if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) { if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
for( i = 0; i < 4; i++ ) { for( i = 0; i < 4; i++ ) {
sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl); sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
sub_partition_count[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count; sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
sl->sub_mb_type[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].type; sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
} }
if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] | if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
sl->sub_mb_type[2] | sl->sub_mb_type[3])) { sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
...@@ -2113,8 +2113,8 @@ decode_intra_mb: ...@@ -2113,8 +2113,8 @@ decode_intra_mb:
} else { } else {
for( i = 0; i < 4; i++ ) { for( i = 0; i < 4; i++ ) {
sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl); sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
sub_partition_count[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count; sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
sl->sub_mb_type[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].type; sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
} }
} }
...@@ -2397,7 +2397,7 @@ decode_intra_mb: ...@@ -2397,7 +2397,7 @@ decode_intra_mb:
for (c = 0; c < 2; c++) for (c = 0; c < 2; c++)
decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3, decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
CHROMA_DC_BLOCK_INDEX + c, CHROMA_DC_BLOCK_INDEX + c,
chroma422_dc_scan, 8); ff_h264_chroma422_dc_scan, 8);
} }
if( cbp&0x20 ) { if( cbp&0x20 ) {
...@@ -2421,7 +2421,8 @@ decode_intra_mb: ...@@ -2421,7 +2421,8 @@ decode_intra_mb:
if( cbp&0x30 ){ if( cbp&0x30 ){
int c; int c;
for (c = 0; c < 2; c++) for (c = 0; c < 2; c++)
decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4); decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
} }
if( cbp&0x20 ) { if( cbp&0x20 ) {
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
#include "internal.h" #include "internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "h264.h" #include "h264.h"
#include "h264data.h" // FIXME FIXME FIXME
#include "h264_mvpred.h" #include "h264_mvpred.h"
#include "h264data.h"
#include "golomb.h" #include "golomb.h"
#include "mpegutils.h" #include "mpegutils.h"
...@@ -733,16 +733,16 @@ int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl) ...@@ -733,16 +733,16 @@ int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
mb_type= get_ue_golomb(&sl->gb); mb_type= get_ue_golomb(&sl->gb);
if (sl->slice_type_nos == AV_PICTURE_TYPE_B) { if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
if(mb_type < 23){ if(mb_type < 23){
partition_count= b_mb_type_info[mb_type].partition_count; partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
mb_type= b_mb_type_info[mb_type].type; mb_type = ff_h264_b_mb_type_info[mb_type].type;
}else{ }else{
mb_type -= 23; mb_type -= 23;
goto decode_intra_mb; goto decode_intra_mb;
} }
} else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) { } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
if(mb_type < 5){ if(mb_type < 5){
partition_count= p_mb_type_info[mb_type].partition_count; partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
mb_type= p_mb_type_info[mb_type].type; mb_type = ff_h264_p_mb_type_info[mb_type].type;
}else{ }else{
mb_type -= 5; mb_type -= 5;
goto decode_intra_mb; goto decode_intra_mb;
...@@ -757,9 +757,9 @@ decode_intra_mb: ...@@ -757,9 +757,9 @@ decode_intra_mb:
return -1; return -1;
} }
partition_count=0; partition_count=0;
cbp= i_mb_type_info[mb_type].cbp; cbp = ff_h264_i_mb_type_info[mb_type].cbp;
sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode; sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
mb_type= i_mb_type_info[mb_type].type; mb_type = ff_h264_i_mb_type_info[mb_type].type;
} }
if (MB_FIELD(sl)) if (MB_FIELD(sl))
...@@ -843,8 +843,8 @@ decode_intra_mb: ...@@ -843,8 +843,8 @@ decode_intra_mb:
av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y); av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
return -1; return -1;
} }
sub_partition_count[i]= b_sub_mb_type_info[ sl->sub_mb_type[i] ].partition_count; sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
sl->sub_mb_type[i]= b_sub_mb_type_info[ sl->sub_mb_type[i] ].type; sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
} }
if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) { if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
ff_h264_pred_direct_motion(h, sl, &mb_type); ff_h264_pred_direct_motion(h, sl, &mb_type);
...@@ -861,8 +861,8 @@ decode_intra_mb: ...@@ -861,8 +861,8 @@ decode_intra_mb:
av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y); av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
return -1; return -1;
} }
sub_partition_count[i]= p_sub_mb_type_info[ sl->sub_mb_type[i] ].partition_count; sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
sl->sub_mb_type[i]= p_sub_mb_type_info[ sl->sub_mb_type[i] ].type; sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
} }
} }
...@@ -1062,8 +1062,10 @@ decode_intra_mb: ...@@ -1062,8 +1062,10 @@ decode_intra_mb:
av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y); av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
return -1; return -1;
} }
if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp]; if (IS_INTRA4x4(mb_type))
else cbp= golomb_to_inter_cbp [cbp]; cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
else
cbp = ff_h264_golomb_to_inter_cbp[cbp];
}else{ }else{
if(cbp > 15){ if(cbp > 15){
av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y); av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
...@@ -1128,7 +1130,7 @@ decode_intra_mb: ...@@ -1128,7 +1130,7 @@ decode_intra_mb:
if(cbp&0x30){ if(cbp&0x30){
for(chroma_idx=0; chroma_idx<2; chroma_idx++) for(chroma_idx=0; chroma_idx<2; chroma_idx++)
if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift), if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma422_dc_scan, CHROMA_DC_BLOCK_INDEX + chroma_idx, ff_h264_chroma422_dc_scan,
NULL, 8) < 0) { NULL, 8) < 0) {
return -1; return -1;
} }
...@@ -1154,7 +1156,8 @@ decode_intra_mb: ...@@ -1154,7 +1156,8 @@ decode_intra_mb:
} else /* yuv420 */ { } else /* yuv420 */ {
if(cbp&0x30){ if(cbp&0x30){
for(chroma_idx=0; chroma_idx<2; chroma_idx++) for(chroma_idx=0; chroma_idx<2; chroma_idx++)
if( decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift), CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma_dc_scan, NULL, 4) < 0){ if (decode_residual(h, sl, gb, sl->mb + ((256 + 16 * 16 * chroma_idx) << pixel_shift),
CHROMA_DC_BLOCK_INDEX + chroma_idx, ff_h264_chroma_dc_scan, NULL, 4) < 0) {
return -1; return -1;
} }
} }
......
...@@ -261,7 +261,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -261,7 +261,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
init_get_bits(&sl->gb, ptr, 8 * dst_length); init_get_bits(&sl->gb, ptr, 8 * dst_length);
get_ue_golomb(&sl->gb); // skip first_mb_in_slice get_ue_golomb(&sl->gb); // skip first_mb_in_slice
slice_type = get_ue_golomb_31(&sl->gb); slice_type = get_ue_golomb_31(&sl->gb);
s->pict_type = golomb_to_pict_type[slice_type % 5]; s->pict_type = ff_h264_golomb_to_pict_type[slice_type % 5];
if (h->sei_recovery_frame_cnt >= 0) { if (h->sei_recovery_frame_cnt >= 0) {
/* key frame, since recovery_frame_cnt is set */ /* key frame, since recovery_frame_cnt is set */
s->key_frame = 1; s->key_frame = 1;
......
...@@ -1081,7 +1081,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl) ...@@ -1081,7 +1081,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
} else } else
sl->slice_type_fixed = 0; sl->slice_type_fixed = 0;
slice_type = golomb_to_pict_type[slice_type]; slice_type = ff_h264_golomb_to_pict_type[slice_type];
sl->slice_type = slice_type; sl->slice_type = slice_type;
sl->slice_type_nos = slice_type & 3; sl->slice_type_nos = slice_type & 3;
......
/*
* H26L/H264/AVC/JVT/14496-10/... encoder/decoder
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* @brief
* H264 / AVC / MPEG4 part10 codec data table
* @author Michael Niedermayer <michaelni@gmx.at>
*/
#include <stdint.h>
#include "libavutil/avutil.h"
#include "avcodec.h"
#include "h264data.h"
const uint8_t ff_h264_golomb_to_pict_type[5] = {
AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I,
AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI
};
const uint8_t ff_h264_golomb_to_intra4x4_cbp[48] = {
47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46,
16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4,
8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41
};
const uint8_t ff_h264_golomb_to_inter_cbp[48] = {
0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13,
14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46,
17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
};
const uint8_t ff_h264_chroma_dc_scan[4] = {
(0 + 0 * 2) * 16, (1 + 0 * 2) * 16,
(0 + 1 * 2) * 16, (1 + 1 * 2) * 16,
};
const uint8_t ff_h264_chroma422_dc_scan[8] = {
(0 + 0 * 2) * 16, (0 + 1 * 2) * 16,
(1 + 0 * 2) * 16, (0 + 2 * 2) * 16,
(0 + 3 * 2) * 16, (1 + 1 * 2) * 16,
(1 + 2 * 2) * 16, (1 + 3 * 2) * 16,
};
const IMbInfo ff_h264_i_mb_type_info[26] = {
{ MB_TYPE_INTRA4x4, -1, -1 },
{ MB_TYPE_INTRA16x16, 2, 0 },
{ MB_TYPE_INTRA16x16, 1, 0 },
{ MB_TYPE_INTRA16x16, 0, 0 },
{ MB_TYPE_INTRA16x16, 3, 0 },
{ MB_TYPE_INTRA16x16, 2, 16 },
{ MB_TYPE_INTRA16x16, 1, 16 },
{ MB_TYPE_INTRA16x16, 0, 16 },
{ MB_TYPE_INTRA16x16, 3, 16 },
{ MB_TYPE_INTRA16x16, 2, 32 },
{ MB_TYPE_INTRA16x16, 1, 32 },
{ MB_TYPE_INTRA16x16, 0, 32 },
{ MB_TYPE_INTRA16x16, 3, 32 },
{ MB_TYPE_INTRA16x16, 2, 15 + 0 },
{ MB_TYPE_INTRA16x16, 1, 15 + 0 },
{ MB_TYPE_INTRA16x16, 0, 15 + 0 },
{ MB_TYPE_INTRA16x16, 3, 15 + 0 },
{ MB_TYPE_INTRA16x16, 2, 15 + 16 },
{ MB_TYPE_INTRA16x16, 1, 15 + 16 },
{ MB_TYPE_INTRA16x16, 0, 15 + 16 },
{ MB_TYPE_INTRA16x16, 3, 15 + 16 },
{ MB_TYPE_INTRA16x16, 2, 15 + 32 },
{ MB_TYPE_INTRA16x16, 1, 15 + 32 },
{ MB_TYPE_INTRA16x16, 0, 15 + 32 },
{ MB_TYPE_INTRA16x16, 3, 15 + 32 },
{ MB_TYPE_INTRA_PCM, -1, -1 },
};
const PMbInfo ff_h264_p_mb_type_info[5] = {
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4 },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 },
};
const PMbInfo ff_h264_p_sub_mb_type_info[4] = {
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
{ MB_TYPE_16x8 | MB_TYPE_P0L0, 2 },
{ MB_TYPE_8x16 | MB_TYPE_P0L0, 2 },
{ MB_TYPE_8x8 | MB_TYPE_P0L0, 4 },
};
const PMbInfo ff_h264_b_mb_type_info[23] = {
{ MB_TYPE_DIRECT2 | MB_TYPE_L0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
};
const PMbInfo ff_h264_b_sub_mb_type_info[13] = {
{ MB_TYPE_DIRECT2, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4, },
{ MB_TYPE_8x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 4, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
};
/* /*
* H26L/H264/AVC/JVT/14496-10/... encoder/decoder
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of Libav. * This file is part of Libav.
* *
* Libav is free software; you can redistribute it and/or * Libav is free software; you can redistribute it and/or
...@@ -19,49 +16,19 @@ ...@@ -19,49 +16,19 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
/**
* @file
* @brief
* H264 / AVC / MPEG4 part10 codec data table
* @author Michael Niedermayer <michaelni@gmx.at>
*/
#ifndef AVCODEC_H264DATA_H #ifndef AVCODEC_H264DATA_H
#define AVCODEC_H264DATA_H #define AVCODEC_H264DATA_H
#include <stdint.h> #include <stdint.h>
#include "libavutil/rational.h"
#include "h264.h" #include "h264.h"
static const uint8_t golomb_to_pict_type[5] = { extern const uint8_t ff_h264_golomb_to_pict_type[5];
AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, AV_PICTURE_TYPE_I, extern const uint8_t ff_h264_golomb_to_intra4x4_cbp[48];
AV_PICTURE_TYPE_SP, AV_PICTURE_TYPE_SI extern const uint8_t ff_h264_golomb_to_inter_cbp[48];
};
static const uint8_t golomb_to_intra4x4_cbp[48] = {
47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46,
16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4,
8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41
};
static const uint8_t golomb_to_inter_cbp[48] = {
0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13,
14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46,
17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
};
static const uint8_t chroma_dc_scan[4] = { extern const uint8_t ff_h264_chroma_dc_scan[4];
(0 + 0 * 2) * 16, (1 + 0 * 2) * 16, extern const uint8_t ff_h264_chroma422_dc_scan[8];
(0 + 1 * 2) * 16, (1 + 1 * 2) * 16,
};
static const uint8_t chroma422_dc_scan[8] = {
(0 + 0 * 2) * 16, (0 + 1 * 2) * 16,
(1 + 0 * 2) * 16, (0 + 2 * 2) * 16,
(0 + 3 * 2) * 16, (1 + 1 * 2) * 16,
(1 + 2 * 2) * 16, (1 + 3 * 2) * 16,
};
typedef struct IMbInfo { typedef struct IMbInfo {
uint16_t type; uint16_t type;
...@@ -69,95 +36,16 @@ typedef struct IMbInfo { ...@@ -69,95 +36,16 @@ typedef struct IMbInfo {
uint8_t cbp; uint8_t cbp;
} IMbInfo; } IMbInfo;
static const IMbInfo i_mb_type_info[26] = { extern const IMbInfo ff_h264_i_mb_type_info[26];
{ MB_TYPE_INTRA4x4, -1, -1 },
{ MB_TYPE_INTRA16x16, 2, 0 },
{ MB_TYPE_INTRA16x16, 1, 0 },
{ MB_TYPE_INTRA16x16, 0, 0 },
{ MB_TYPE_INTRA16x16, 3, 0 },
{ MB_TYPE_INTRA16x16, 2, 16 },
{ MB_TYPE_INTRA16x16, 1, 16 },
{ MB_TYPE_INTRA16x16, 0, 16 },
{ MB_TYPE_INTRA16x16, 3, 16 },
{ MB_TYPE_INTRA16x16, 2, 32 },
{ MB_TYPE_INTRA16x16, 1, 32 },
{ MB_TYPE_INTRA16x16, 0, 32 },
{ MB_TYPE_INTRA16x16, 3, 32 },
{ MB_TYPE_INTRA16x16, 2, 15 + 0 },
{ MB_TYPE_INTRA16x16, 1, 15 + 0 },
{ MB_TYPE_INTRA16x16, 0, 15 + 0 },
{ MB_TYPE_INTRA16x16, 3, 15 + 0 },
{ MB_TYPE_INTRA16x16, 2, 15 + 16 },
{ MB_TYPE_INTRA16x16, 1, 15 + 16 },
{ MB_TYPE_INTRA16x16, 0, 15 + 16 },
{ MB_TYPE_INTRA16x16, 3, 15 + 16 },
{ MB_TYPE_INTRA16x16, 2, 15 + 32 },
{ MB_TYPE_INTRA16x16, 1, 15 + 32 },
{ MB_TYPE_INTRA16x16, 0, 15 + 32 },
{ MB_TYPE_INTRA16x16, 3, 15 + 32 },
{ MB_TYPE_INTRA_PCM, -1, -1 },
};
typedef struct PMbInfo { typedef struct PMbInfo {
uint16_t type; uint16_t type;
uint8_t partition_count; uint8_t partition_count;
} PMbInfo; } PMbInfo;
static const PMbInfo p_mb_type_info[5] = { extern const PMbInfo ff_h264_p_mb_type_info[5];
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1 }, extern const PMbInfo ff_h264_p_sub_mb_type_info[4];
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, extern const PMbInfo ff_h264_b_mb_type_info[23];
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2 }, extern const PMbInfo ff_h264_b_sub_mb_type_info[13];
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4 },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_REF0, 4 },
};
static const PMbInfo p_sub_mb_type_info[4] = {
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1 },
{ MB_TYPE_16x8 | MB_TYPE_P0L0, 2 },
{ MB_TYPE_8x16 | MB_TYPE_P0L0, 2 },
{ MB_TYPE_8x8 | MB_TYPE_P0L0, 4 },
};
static const PMbInfo b_mb_type_info[23] = {
{ MB_TYPE_DIRECT2 | MB_TYPE_L0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
};
static const PMbInfo b_sub_mb_type_info[13] = {
{ MB_TYPE_DIRECT2, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1, 1, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_16x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x16 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 2, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P1L0, 4, },
{ MB_TYPE_8x8 | MB_TYPE_P0L1 | MB_TYPE_P1L1, 4, },
{ MB_TYPE_8x8 | MB_TYPE_P0L0 | MB_TYPE_P0L1 | MB_TYPE_P1L0 | MB_TYPE_P1L1, 4, },
};
#endif /* AVCODEC_H264DATA_H */ #endif /* AVCODEC_H264DATA_H */
...@@ -47,10 +47,8 @@ ...@@ -47,10 +47,8 @@
#include "avcodec.h" #include "avcodec.h"
#include "mpegutils.h" #include "mpegutils.h"
#include "h264.h" #include "h264.h"
#include "h264data.h" // FIXME FIXME FIXME
#include "h264_mvpred.h" #include "h264_mvpred.h"
#include "h264data.h"
#include "golomb.h" #include "golomb.h"
#include "hpeldsp.h" #include "hpeldsp.h"
#include "mathops.h" #include "mathops.h"
...@@ -241,7 +239,7 @@ static inline int svq3_decode_block(GetBitContext *gb, int16_t *block, ...@@ -241,7 +239,7 @@ static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
int index, const int type) int index, const int type)
{ {
static const uint8_t *const scan_patterns[4] = { static const uint8_t *const scan_patterns[4] = {
luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, chroma_dc_scan luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, ff_h264_chroma_dc_scan
}; };
int run, level, limit; int run, level, limit;
...@@ -663,7 +661,7 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type) ...@@ -663,7 +661,7 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
mb_type = MB_TYPE_INTRA4x4; mb_type = MB_TYPE_INTRA4x4;
} else { /* INTRA16x16 */ } else { /* INTRA16x16 */
dir = i_mb_type_info[mb_type - 8].pred_mode; dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1; dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
if ((sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl, dir, 0)) < 0) { if ((sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl, dir, 0)) < 0) {
...@@ -671,7 +669,7 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type) ...@@ -671,7 +669,7 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
return sl->intra16x16_pred_mode; return sl->intra16x16_pred_mode;
} }
cbp = i_mb_type_info[mb_type - 8].cbp; cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
mb_type = MB_TYPE_INTRA16x16; mb_type = MB_TYPE_INTRA16x16;
} }
...@@ -699,8 +697,8 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type) ...@@ -699,8 +697,8 @@ static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
return -1; return -1;
} }
cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
: golomb_to_inter_cbp[vlc]; : ff_h264_golomb_to_inter_cbp[vlc];
} }
if (IS_INTRA16x16(mb_type) || if (IS_INTRA16x16(mb_type) ||
(h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) { (h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
...@@ -828,7 +826,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) ...@@ -828,7 +826,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
return -1; return -1;
} }
sl->slice_type = golomb_to_pict_type[slice_id]; sl->slice_type = ff_h264_golomb_to_pict_type[slice_id];
if ((header & 0x9F) == 2) { if ((header & 0x9F) == 2) {
i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1)); i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment