|
@@ -4153,6 +4153,55 @@ static int init_poc(H264Context *h){ |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* initialize scan tables |
|
|
|
|
|
*/ |
|
|
|
|
|
static void init_scan_tables(H264Context *h){ |
|
|
|
|
|
MpegEncContext * const s = &h->s; |
|
|
|
|
|
int i; |
|
|
|
|
|
if(s->dsp.h264_idct_add == ff_h264_idct_add_c){ //FIXME little ugly |
|
|
|
|
|
memcpy(h->zigzag_scan, zigzag_scan, 16*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h-> field_scan, field_scan, 16*sizeof(uint8_t)); |
|
|
|
|
|
}else{ |
|
|
|
|
|
for(i=0; i<16; i++){ |
|
|
|
|
|
#define T(x) (x>>2) | ((x<<2) & 0xF) |
|
|
|
|
|
h->zigzag_scan[i] = T(zigzag_scan[i]); |
|
|
|
|
|
h-> field_scan[i] = T( field_scan[i]); |
|
|
|
|
|
#undef T |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(s->dsp.h264_idct8_add == ff_h264_idct8_add_c){ |
|
|
|
|
|
memcpy(h->zigzag_scan8x8, zigzag_scan8x8, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->zigzag_scan8x8_cavlc, zigzag_scan8x8_cavlc, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->field_scan8x8, field_scan8x8, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->field_scan8x8_cavlc, field_scan8x8_cavlc, 64*sizeof(uint8_t)); |
|
|
|
|
|
}else{ |
|
|
|
|
|
for(i=0; i<64; i++){ |
|
|
|
|
|
#define T(x) (x>>3) | ((x&7)<<3) |
|
|
|
|
|
h->zigzag_scan8x8[i] = T(zigzag_scan8x8[i]); |
|
|
|
|
|
h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]); |
|
|
|
|
|
h->field_scan8x8[i] = T(field_scan8x8[i]); |
|
|
|
|
|
h->field_scan8x8_cavlc[i] = T(field_scan8x8_cavlc[i]); |
|
|
|
|
|
#undef T |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(h->sps.transform_bypass){ //FIXME same ugly |
|
|
|
|
|
h->zigzag_scan_q0 = zigzag_scan; |
|
|
|
|
|
h->zigzag_scan8x8_q0 = zigzag_scan8x8; |
|
|
|
|
|
h->zigzag_scan8x8_cavlc_q0 = zigzag_scan8x8_cavlc; |
|
|
|
|
|
h->field_scan_q0 = field_scan; |
|
|
|
|
|
h->field_scan8x8_q0 = field_scan8x8; |
|
|
|
|
|
h->field_scan8x8_cavlc_q0 = field_scan8x8_cavlc; |
|
|
|
|
|
}else{ |
|
|
|
|
|
h->zigzag_scan_q0 = h->zigzag_scan; |
|
|
|
|
|
h->zigzag_scan8x8_q0 = h->zigzag_scan8x8; |
|
|
|
|
|
h->zigzag_scan8x8_cavlc_q0 = h->zigzag_scan8x8_cavlc; |
|
|
|
|
|
h->field_scan_q0 = h->field_scan; |
|
|
|
|
|
h->field_scan8x8_q0 = h->field_scan8x8; |
|
|
|
|
|
h->field_scan8x8_cavlc_q0 = h->field_scan8x8_cavlc; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
/** |
|
|
/** |
|
|
* decodes a slice header. |
|
|
* decodes a slice header. |
|
|
* this will allso call MPV_common_init() and frame_start() as needed |
|
|
* this will allso call MPV_common_init() and frame_start() as needed |
|
@@ -4239,50 +4288,7 @@ static int decode_slice_header(H264Context *h){ |
|
|
if (MPV_common_init(s) < 0) |
|
|
if (MPV_common_init(s) < 0) |
|
|
return -1; |
|
|
return -1; |
|
|
|
|
|
|
|
|
if(s->dsp.h264_idct_add == ff_h264_idct_add_c){ //FIXME little ugly |
|
|
|
|
|
memcpy(h->zigzag_scan, zigzag_scan, 16*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h-> field_scan, field_scan, 16*sizeof(uint8_t)); |
|
|
|
|
|
}else{ |
|
|
|
|
|
int i; |
|
|
|
|
|
for(i=0; i<16; i++){ |
|
|
|
|
|
#define T(x) (x>>2) | ((x<<2) & 0xF) |
|
|
|
|
|
h->zigzag_scan[i] = T(zigzag_scan[i]); |
|
|
|
|
|
h-> field_scan[i] = T( field_scan[i]); |
|
|
|
|
|
#undef T |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(s->dsp.h264_idct8_add == ff_h264_idct8_add_c){ |
|
|
|
|
|
memcpy(h->zigzag_scan8x8, zigzag_scan8x8, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->zigzag_scan8x8_cavlc, zigzag_scan8x8_cavlc, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->field_scan8x8, field_scan8x8, 64*sizeof(uint8_t)); |
|
|
|
|
|
memcpy(h->field_scan8x8_cavlc, field_scan8x8_cavlc, 64*sizeof(uint8_t)); |
|
|
|
|
|
}else{ |
|
|
|
|
|
int i; |
|
|
|
|
|
for(i=0; i<64; i++){ |
|
|
|
|
|
#define T(x) (x>>3) | ((x&7)<<3) |
|
|
|
|
|
h->zigzag_scan8x8[i] = T(zigzag_scan8x8[i]); |
|
|
|
|
|
h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]); |
|
|
|
|
|
h->field_scan8x8[i] = T(field_scan8x8[i]); |
|
|
|
|
|
h->field_scan8x8_cavlc[i] = T(field_scan8x8_cavlc[i]); |
|
|
|
|
|
#undef T |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(h->sps.transform_bypass){ //FIXME same ugly |
|
|
|
|
|
h->zigzag_scan_q0 = zigzag_scan; |
|
|
|
|
|
h->zigzag_scan8x8_q0 = zigzag_scan8x8; |
|
|
|
|
|
h->zigzag_scan8x8_cavlc_q0 = zigzag_scan8x8_cavlc; |
|
|
|
|
|
h->field_scan_q0 = field_scan; |
|
|
|
|
|
h->field_scan8x8_q0 = field_scan8x8; |
|
|
|
|
|
h->field_scan8x8_cavlc_q0 = field_scan8x8_cavlc; |
|
|
|
|
|
}else{ |
|
|
|
|
|
h->zigzag_scan_q0 = h->zigzag_scan; |
|
|
|
|
|
h->zigzag_scan8x8_q0 = h->zigzag_scan8x8; |
|
|
|
|
|
h->zigzag_scan8x8_cavlc_q0 = h->zigzag_scan8x8_cavlc; |
|
|
|
|
|
h->field_scan_q0 = h->field_scan; |
|
|
|
|
|
h->field_scan8x8_q0 = h->field_scan8x8; |
|
|
|
|
|
h->field_scan8x8_cavlc_q0 = h->field_scan8x8_cavlc; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init_scan_tables(h); |
|
|
alloc_tables(h); |
|
|
alloc_tables(h); |
|
|
|
|
|
|
|
|
s->avctx->width = s->width; |
|
|
s->avctx->width = s->width; |
|
|