aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2008-07-21 18:24:45 +0000
committerMichael Niedermayer <michaelni@gmx.at>2008-07-21 18:24:45 +0000
commite3e6f18f1693a99c1e26e7e2ff109b2a4de9c51e (patch)
tree9581ce16dd8e7811466f2235f23f7d9d5b652c8b
parent72caa912f24f31a2a958831382f2485354e38702 (diff)
downloadffmpeg-e3e6f18f1693a99c1e26e7e2ff109b2a4de9c51e.tar.gz
Simplify slice type checks.
Originally committed as revision 14323 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h264.c15
-rw-r--r--libavcodec/h264.h1
2 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index c35779dfcb..30c875728a 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3031,7 +3031,7 @@ static int decode_ref_pic_list_reordering(H264Context *h){
print_short_term(h);
print_long_term(h);
- if(h->slice_type==FF_I_TYPE || h->slice_type==FF_SI_TYPE) return 0; //FIXME move before func
+ if(h->slice_type_nos==FF_I_TYPE) return 0; //FIXME move before func
for(list=0; list<h->list_count; list++){
memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
@@ -3908,6 +3908,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
default_ref_list_done = 1;
}
h->slice_type= slice_type;
+ h->slice_type_nos= slice_type & 3;
s->pict_type= h->slice_type; // to make a few old func happy, it's wrong though
if (s->pict_type == FF_B_TYPE && s0->last_picture_ptr == NULL) {
@@ -4113,7 +4114,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
h->ref_count[0]= h->pps.ref_count[0];
h->ref_count[1]= h->pps.ref_count[1];
- if(h->slice_type == FF_P_TYPE || h->slice_type == FF_SP_TYPE || h->slice_type == FF_B_TYPE){
+ if(h->slice_type_nos != FF_I_TYPE){
if(h->slice_type == FF_B_TYPE){
h->direct_spatial_mv_pred= get_bits1(&s->gb);
if(FIELD_PICTURE && h->direct_spatial_mv_pred)
@@ -4146,7 +4147,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
if(decode_ref_pic_list_reordering(h) < 0)
return -1;
- if( (h->pps.weighted_pred && (h->slice_type == FF_P_TYPE || h->slice_type == FF_SP_TYPE ))
+ if( (h->pps.weighted_pred && (h->slice_type_nos == FF_P_TYPE ))
|| (h->pps.weighted_bipred_idc==1 && h->slice_type==FF_B_TYPE ) )
pred_weight_table(h);
else if(h->pps.weighted_bipred_idc==2 && h->slice_type==FF_B_TYPE)
@@ -4169,7 +4170,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
+(h->ref_list[j][i].reference&3);
}
- if( h->slice_type != FF_I_TYPE && h->slice_type != FF_SI_TYPE && h->pps.cabac ){
+ if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){
tmp = get_ue_golomb(&s->gb);
if(tmp > 2){
av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n");
@@ -4521,7 +4522,7 @@ static int decode_mb_cavlc(H264Context *h){
tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
cbp = 0; /* avoid warning. FIXME: find a solution without slowing
down the code */
- if(h->slice_type != FF_I_TYPE && h->slice_type != FF_SI_TYPE){
+ if(h->slice_type_nos != FF_I_TYPE){
if(s->mb_skip_run==-1)
s->mb_skip_run= get_ue_golomb(&s->gb);
@@ -4687,7 +4688,7 @@ decode_intra_mb:
h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
}
}else{
- assert(h->slice_type == FF_P_TYPE || h->slice_type == FF_SP_TYPE); //FIXME SP correct ?
+ assert(h->slice_type_nos == FF_P_TYPE); //FIXME SP correct ?
for(i=0; i<4; i++){
h->sub_mb_type[i]= get_ue_golomb(&s->gb);
if(h->sub_mb_type[i] >=4){
@@ -5636,7 +5637,7 @@ static int decode_mb_cabac(H264Context *h) {
s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?)
tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
- if( h->slice_type != FF_I_TYPE && h->slice_type != FF_SI_TYPE ) {
+ if( h->slice_type_nos != FF_I_TYPE ) {
int skip;
/* a skipped mb needs the aff flag from the following mb */
if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 69d779d583..edc7e5289c 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -270,6 +270,7 @@ typedef struct H264Context{
uint8_t *slice_table_base;
uint8_t *slice_table; ///< slice_table_base + 2*mb_stride + 1
int slice_type;
+ int slice_type_nos; ///< S free slice type (SI/SP are remapped to I/P)
int slice_type_fixed;
//interlacing specific flags