623
526
/*****************************************************************************
625
* residual data decoding
627
****************************************************************************/
629
/** kth-order exponential golomb code */
630
static inline int get_ue_code(GetBitContext *gb, int order) {
632
int ret = get_ue_golomb(gb) << order;
633
return ret + get_bits(gb,order);
635
return get_ue_golomb(gb);
639
* decode coefficients from one 8x8 block, dequantize, inverse transform
640
* and add them to sample block
641
* @param r pointer to 2D VLC table
642
* @param esc_golomb_order escape codes are k-golomb with this order k
643
* @param qp quantizer
644
* @param dst location of sample block
645
* @param stride line stride in frame buffer
647
static int decode_residual_block(AVSContext *h, GetBitContext *gb,
648
const residual_vlc_t *r, int esc_golomb_order,
649
int qp, uint8_t *dst, int stride) {
651
int level_code, esc_code, level, run, mask;
654
int dqm = dequant_mul[qp];
655
int dqs = dequant_shift[qp];
656
int dqa = 1 << (dqs - 1);
657
const uint8_t *scantab = h->scantable.permutated;
658
DCTELEM *block = h->block;
661
level_code = get_ue_code(gb,r->golomb_order);
662
if(level_code >= ESCAPE_CODE) {
663
run = ((level_code - ESCAPE_CODE) >> 1) + 1;
664
esc_code = get_ue_code(gb,esc_golomb_order);
665
level = esc_code + (run > r->max_run ? 1 : r->level_add[run]);
666
while(level > r->inc_limit)
668
mask = -(level_code & 1);
669
level = (level^mask) - mask;
671
level = r->rltab[level_code][0];
672
if(!level) //end of block signal
674
run = r->rltab[level_code][1];
675
r += r->rltab[level_code][2];
677
level_buf[i] = level;
680
/* inverse scan and dequantization */
684
av_log(h->s.avctx, AV_LOG_ERROR,
685
"position out of block bounds at pic %d MB(%d,%d)\n",
686
h->picture.poc, h->mbx, h->mby);
689
block[scantab[pos]] = (level_buf[i]*dqm + dqa) >> dqs;
691
h->s.dsp.cavs_idct8_add(dst,block,stride);
696
static inline void decode_residual_chroma(AVSContext *h) {
698
decode_residual_block(h,&h->s.gb,chroma_2dvlc,0, chroma_qp[h->qp],
701
decode_residual_block(h,&h->s.gb,chroma_2dvlc,0, chroma_qp[h->qp],
705
static inline int decode_residual_inter(AVSContext *h) {
708
/* get coded block pattern */
709
int cbp= get_ue_golomb(&h->s.gb);
711
av_log(h->s.avctx, AV_LOG_ERROR, "illegal inter cbp\n");
714
h->cbp = cbp_tab[cbp][1];
717
if(h->cbp && !h->qp_fixed)
718
h->qp = (h->qp + get_se_golomb(&h->s.gb)) & 63;
719
for(block=0;block<4;block++)
720
if(h->cbp & (1<<block))
721
decode_residual_block(h,&h->s.gb,inter_2dvlc,0,h->qp,
722
h->cy + h->luma_scan[block], h->l_stride);
723
decode_residual_chroma(h);
728
/*****************************************************************************
730
528
* macroblock level
732
530
****************************************************************************/
820
static int decode_mb_i(AVSContext *h, int cbp_code) {
821
GetBitContext *gb = &h->s.gb;
822
int block, pred_mode_uv;
824
uint8_t *left = NULL;
829
/* get intra prediction modes from stream */
830
for(block=0;block<4;block++) {
832
int pos = scan3x3[block];
834
nA = h->pred_mode_Y[pos-1];
835
nB = h->pred_mode_Y[pos-3];
836
predpred = FFMIN(nA,nB);
837
if(predpred == NOT_AVAIL) // if either is not available
838
predpred = INTRA_L_LP;
840
int rem_mode= get_bits(gb, 2);
841
predpred = rem_mode + (rem_mode >= predpred);
843
h->pred_mode_Y[pos] = predpred;
845
pred_mode_uv = get_ue_golomb(gb);
846
if(pred_mode_uv > 6) {
847
av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra chroma pred mode\n");
851
/* save pred modes before they get modified */
852
h->pred_mode_Y[3] = h->pred_mode_Y[5];
853
h->pred_mode_Y[6] = h->pred_mode_Y[8];
854
h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7];
855
h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8];
857
/* modify pred modes according to availability of neighbour samples */
858
if(!(h->flags & A_AVAIL)) {
859
modify_pred(left_modifier_l, &h->pred_mode_Y[4] );
860
modify_pred(left_modifier_l, &h->pred_mode_Y[7] );
861
modify_pred(left_modifier_c, &pred_mode_uv );
863
if(!(h->flags & B_AVAIL)) {
864
modify_pred(top_modifier_l, &h->pred_mode_Y[4] );
865
modify_pred(top_modifier_l, &h->pred_mode_Y[5] );
866
modify_pred(top_modifier_c, &pred_mode_uv );
869
/* get coded block pattern */
870
if(h->pic_type == FF_I_TYPE)
871
cbp_code = get_ue_golomb(gb);
873
av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n");
876
h->cbp = cbp_tab[cbp_code][0];
877
if(h->cbp && !h->qp_fixed)
878
h->qp = (h->qp + get_se_golomb(gb)) & 63; //qp_delta
880
/* luma intra prediction interleaved with residual decode/transform/add */
881
for(block=0;block<4;block++) {
882
d = h->cy + h->luma_scan[block];
883
load_intra_pred_luma(h, top, &left, block);
884
h->intra_pred_l[h->pred_mode_Y[scan3x3[block]]]
885
(d, top, left, h->l_stride);
886
if(h->cbp & (1<<block))
887
decode_residual_block(h,gb,intra_2dvlc,1,h->qp,d,h->l_stride);
890
/* chroma intra prediction */
891
/* extend borders by one pixel */
892
h->left_border_u[9] = h->left_border_u[8];
893
h->left_border_v[9] = h->left_border_v[8];
894
h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8];
895
h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8];
896
if(h->mbx && h->mby) {
897
h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u;
898
h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v;
900
h->left_border_u[0] = h->left_border_u[1];
901
h->left_border_v[0] = h->left_border_v[1];
902
h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1];
903
h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1];
905
h->intra_pred_c[pred_mode_uv](h->cu, &h->top_border_u[h->mbx*10],
906
h->left_border_u, h->c_stride);
907
h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx*10],
908
h->left_border_v, h->c_stride);
910
decode_residual_chroma(h);
913
/* mark motion vectors as intra */
914
h->mv[MV_FWD_X0] = intra_mv;
915
set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
916
h->mv[MV_BWD_X0] = intra_mv;
917
set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
918
if(h->pic_type != FF_B_TYPE)
919
*h->col_type = I_8X8;
924
static void decode_mb_p(AVSContext *h, enum mb_t mb_type) {
925
GetBitContext *gb = &h->s.gb;
931
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_PSKIP, BLK_16X16, 0);
934
ref[0] = h->ref_flag ? 0 : get_bits1(gb);
935
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16,ref[0]);
938
ref[0] = h->ref_flag ? 0 : get_bits1(gb);
939
ref[2] = h->ref_flag ? 0 : get_bits1(gb);
940
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, ref[0]);
941
mv_pred(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, ref[2]);
944
ref[0] = h->ref_flag ? 0 : get_bits1(gb);
945
ref[1] = h->ref_flag ? 0 : get_bits1(gb);
946
mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, ref[0]);
947
mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT, BLK_8X16, ref[1]);
950
ref[0] = h->ref_flag ? 0 : get_bits1(gb);
951
ref[1] = h->ref_flag ? 0 : get_bits1(gb);
952
ref[2] = h->ref_flag ? 0 : get_bits1(gb);
953
ref[3] = h->ref_flag ? 0 : get_bits1(gb);
954
mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_MEDIAN, BLK_8X8, ref[0]);
955
mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_MEDIAN, BLK_8X8, ref[1]);
956
mv_pred(h, MV_FWD_X2, MV_FWD_X1, MV_PRED_MEDIAN, BLK_8X8, ref[2]);
957
mv_pred(h, MV_FWD_X3, MV_FWD_X0, MV_PRED_MEDIAN, BLK_8X8, ref[3]);
959
inter_pred(h, mb_type);
961
if(mb_type != P_SKIP)
962
decode_residual_inter(h);
963
filter_mb(h,mb_type);
964
*h->col_type = mb_type;
967
static void decode_mb_b(AVSContext *h, enum mb_t mb_type) {
969
enum sub_mb_t sub_type[4];
975
h->mv[MV_FWD_X0] = dir_mv;
976
set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
977
h->mv[MV_BWD_X0] = dir_mv;
978
set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
982
if(!(*h->col_type)) {
983
/* intra MB at co-location, do in-plane prediction */
984
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1);
985
mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0);
987
/* direct prediction from co-located P MB, block-wise */
988
for(block=0;block<4;block++)
989
mv_pred_direct(h,&h->mv[mv_scan[block]],
990
&h->col_mv[(h->mby*h->mb_width+h->mbx)*4 + block]);
993
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);
996
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);
997
mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X16);
1000
mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_MEDIAN, BLK_16X16, 0);
1003
for(block=0;block<4;block++)
1004
sub_type[block] = get_bits(&h->s.gb,2);
1005
for(block=0;block<4;block++) {
1006
switch(sub_type[block]) {
1008
if(!(*h->col_type)) {
1009
/* intra MB at co-location, do in-plane prediction */
1010
mv_pred(h, mv_scan[block], mv_scan[block]-3,
1011
MV_PRED_BSKIP, BLK_8X8, 1);
1012
mv_pred(h, mv_scan[block]+MV_BWD_OFFS,
1013
mv_scan[block]-3+MV_BWD_OFFS,
1014
MV_PRED_BSKIP, BLK_8X8, 0);
1016
mv_pred_direct(h,&h->mv[mv_scan[block]],
1017
&h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + block]);
1020
mv_pred(h, mv_scan[block], mv_scan[block]-3,
1021
MV_PRED_MEDIAN, BLK_8X8, 1);
1024
mv_pred(h, mv_scan[block], mv_scan[block]-3,
1025
MV_PRED_MEDIAN, BLK_8X8, 1);
1026
mv_pred_sym(h, &h->mv[mv_scan[block]], BLK_8X8);
1030
for(block=0;block<4;block++) {
1031
if(sub_type[block] == B_SUB_BWD)
1032
mv_pred(h, mv_scan[block]+MV_BWD_OFFS,
1033
mv_scan[block]+MV_BWD_OFFS-3,
1034
MV_PRED_MEDIAN, BLK_8X8, 0);
1038
assert((mb_type > B_SYM_16X16) && (mb_type < B_8X8));
1039
flags = partition_flags[mb_type];
1040
if(mb_type & 1) { /* 16x8 macroblock types */
1042
mv_pred(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_TOP, BLK_16X8, 1);
1044
mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_16X8);
1046
mv_pred(h, MV_FWD_X2, MV_FWD_A1, MV_PRED_LEFT, BLK_16X8, 1);
1048
mv_pred_sym(h, &h->mv[MV_FWD_X2], BLK_16X8);
1050
mv_pred(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_TOP, BLK_16X8, 0);
1052
mv_pred(h, MV_BWD_X2, MV_BWD_A1, MV_PRED_LEFT, BLK_16X8, 0);
1053
} else { /* 8x16 macroblock types */
1055
mv_pred(h, MV_FWD_X0, MV_FWD_B3, MV_PRED_LEFT, BLK_8X16, 1);
1057
mv_pred_sym(h, &h->mv[MV_FWD_X0], BLK_8X16);
1059
mv_pred(h, MV_FWD_X1, MV_FWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, 1);
1061
mv_pred_sym(h, &h->mv[MV_FWD_X1], BLK_8X16);
1063
mv_pred(h, MV_BWD_X0, MV_BWD_B3, MV_PRED_LEFT, BLK_8X16, 0);
1065
mv_pred(h, MV_BWD_X1, MV_BWD_C2, MV_PRED_TOPRIGHT,BLK_8X16, 0);
1068
inter_pred(h, mb_type);
1069
if(mb_type != B_SKIP)
1070
decode_residual_inter(h);
1071
filter_mb(h,mb_type);
1074
/*****************************************************************************
1078
****************************************************************************/
1080
static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) {
1082
av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc);
1084
if((h->mby == 0) && (!h->qp_fixed)){
1085
h->qp_fixed = get_bits1(gb);
1086
h->qp = get_bits(gb,6);
1088
/* inter frame or second slice can have weighting params */
1089
if((h->pic_type != FF_I_TYPE) || (!h->pic_structure && h->mby >= h->mb_width/2))
1090
if(get_bits1(gb)) { //slice_weighting_flag
1091
av_log(h->s.avctx, AV_LOG_ERROR,
1092
"weighted prediction not yet supported\n");
1097
static inline void check_for_slice(AVSContext *h) {
1098
GetBitContext *gb = &h->s.gb;
1100
align = (-get_bits_count(gb)) & 7;
1101
if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {
1102
get_bits_long(gb,24+align);
1103
h->stc = get_bits(gb,8);
1104
decode_slice_header(h,gb);
1108
616
/*****************************************************************************
1112
620
****************************************************************************/
1114
static void init_pic(AVSContext *h) {
622
void ff_cavs_init_pic(AVSContext *h) {
1117
625
/* clear some predictors */
1118
626
for(i=0;i<=20;i+=4)
1120
h->mv[MV_BWD_X0] = dir_mv;
627
h->mv[i] = ff_cavs_un_mv;
628
h->mv[MV_BWD_X0] = ff_cavs_dir_mv;
1121
629
set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
1122
h->mv[MV_FWD_X0] = dir_mv;
630
h->mv[MV_FWD_X0] = ff_cavs_dir_mv;
1123
631
set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
1124
632
h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;
1125
633
h->cy = h->picture.data[0];
1136
static int decode_pic(AVSContext *h) {
1137
MpegEncContext *s = &h->s;
1141
if (!s->context_initialized) {
1142
s->avctx->idct_algo = FF_IDCT_CAVS;
1143
if (MPV_common_init(s) < 0)
1145
ff_init_scantable(s->dsp.idct_permutation,&h->scantable,ff_zigzag_direct);
1147
get_bits(&s->gb,16);//bbv_dwlay
1148
if(h->stc == PIC_PB_START_CODE) {
1149
h->pic_type = get_bits(&s->gb,2) + FF_I_TYPE;
1150
if(h->pic_type > FF_B_TYPE) {
1151
av_log(s->avctx, AV_LOG_ERROR, "illegal picture type\n");
1154
/* make sure we have the reference frames we need */
1155
if(!h->DPB[0].data[0] ||
1156
(!h->DPB[1].data[0] && h->pic_type == FF_B_TYPE))
1159
h->pic_type = FF_I_TYPE;
1160
if(get_bits1(&s->gb))
1161
get_bits(&s->gb,16);//time_code
1163
/* release last B frame */
1164
if(h->picture.data[0])
1165
s->avctx->release_buffer(s->avctx, (AVFrame *)&h->picture);
1167
s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture);
1169
h->picture.poc = get_bits(&s->gb,8)*2;
1171
/* get temporal distances and MV scaling factors */
1172
if(h->pic_type != FF_B_TYPE) {
1173
h->dist[0] = (h->picture.poc - h->DPB[0].poc + 512) % 512;
1175
h->dist[0] = (h->DPB[0].poc - h->picture.poc + 512) % 512;
1177
h->dist[1] = (h->picture.poc - h->DPB[1].poc + 512) % 512;
1178
h->scale_den[0] = h->dist[0] ? 512/h->dist[0] : 0;
1179
h->scale_den[1] = h->dist[1] ? 512/h->dist[1] : 0;
1180
if(h->pic_type == FF_B_TYPE) {
1181
h->sym_factor = h->dist[0]*h->scale_den[1];
1183
h->direct_den[0] = h->dist[0] ? 16384/h->dist[0] : 0;
1184
h->direct_den[1] = h->dist[1] ? 16384/h->dist[1] : 0;
1188
get_ue_golomb(&s->gb); //bbv_check_times
1189
h->progressive = get_bits1(&s->gb);
1191
h->pic_structure = 1;
1192
else if(!(h->pic_structure = get_bits1(&s->gb) && (h->stc == PIC_PB_START_CODE)) )
1193
get_bits1(&s->gb); //advanced_pred_mode_disable
1194
skip_bits1(&s->gb); //top_field_first
1195
skip_bits1(&s->gb); //repeat_first_field
1196
h->qp_fixed = get_bits1(&s->gb);
1197
h->qp = get_bits(&s->gb,6);
1198
if(h->pic_type == FF_I_TYPE) {
1199
if(!h->progressive && !h->pic_structure)
1200
skip_bits1(&s->gb);//what is this?
1201
skip_bits(&s->gb,4); //reserved bits
1203
if(!(h->pic_type == FF_B_TYPE && h->pic_structure == 1))
1204
h->ref_flag = get_bits1(&s->gb);
1205
skip_bits(&s->gb,4); //reserved bits
1206
h->skip_mode_flag = get_bits1(&s->gb);
1208
h->loop_filter_disable = get_bits1(&s->gb);
1209
if(!h->loop_filter_disable && get_bits1(&s->gb)) {
1210
h->alpha_offset = get_se_golomb(&s->gb);
1211
h->beta_offset = get_se_golomb(&s->gb);
1213
h->alpha_offset = h->beta_offset = 0;
1216
if(h->pic_type == FF_I_TYPE) {
1219
} while(next_mb(h));
1220
} else if(h->pic_type == FF_P_TYPE) {
1222
if(h->skip_mode_flag) {
1223
skip_count = get_ue_golomb(&s->gb);
1224
while(skip_count--) {
1225
decode_mb_p(h,P_SKIP);
1229
mb_type = get_ue_golomb(&s->gb) + P_16X16;
1231
mb_type = get_ue_golomb(&s->gb) + P_SKIP;
1232
if(mb_type > P_8X8) {
1233
decode_mb_i(h, mb_type - P_8X8 - 1);
1235
decode_mb_p(h,mb_type);
1236
} while(next_mb(h));
1237
} else { /* FF_B_TYPE */
1239
if(h->skip_mode_flag) {
1240
skip_count = get_ue_golomb(&s->gb);
1241
while(skip_count--) {
1242
decode_mb_b(h,B_SKIP);
1246
mb_type = get_ue_golomb(&s->gb) + B_DIRECT;
1248
mb_type = get_ue_golomb(&s->gb) + B_SKIP;
1249
if(mb_type > B_8X8) {
1250
decode_mb_i(h, mb_type - B_8X8 - 1);
1252
decode_mb_b(h,mb_type);
1253
} while(next_mb(h));
1256
if(h->pic_type != FF_B_TYPE) {
1257
if(h->DPB[1].data[0])
1258
s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]);
1259
memcpy(&h->DPB[1], &h->DPB[0], sizeof(Picture));
1260
memcpy(&h->DPB[0], &h->picture, sizeof(Picture));
1261
memset(&h->picture,0,sizeof(Picture));
1266
644
/*****************************************************************************
1268
646
* headers and interface
1290
668
h->block = av_mallocz(64*sizeof(DCTELEM));
1293
static int decode_seq_header(AVSContext *h) {
1294
MpegEncContext *s = &h->s;
1295
extern const AVRational ff_frame_rate_tab[];
1296
int frame_rate_code;
1298
h->profile = get_bits(&s->gb,8);
1299
h->level = get_bits(&s->gb,8);
1300
skip_bits1(&s->gb); //progressive sequence
1301
s->width = get_bits(&s->gb,14);
1302
s->height = get_bits(&s->gb,14);
1303
skip_bits(&s->gb,2); //chroma format
1304
skip_bits(&s->gb,3); //sample_precision
1305
h->aspect_ratio = get_bits(&s->gb,4);
1306
frame_rate_code = get_bits(&s->gb,4);
1307
skip_bits(&s->gb,18);//bit_rate_lower
1308
skip_bits1(&s->gb); //marker_bit
1309
skip_bits(&s->gb,12);//bit_rate_upper
1310
s->low_delay = get_bits1(&s->gb);
1311
h->mb_width = (s->width + 15) >> 4;
1312
h->mb_height = (s->height + 15) >> 4;
1313
h->s.avctx->time_base.den = ff_frame_rate_tab[frame_rate_code].num;
1314
h->s.avctx->time_base.num = ff_frame_rate_tab[frame_rate_code].den;
1315
h->s.avctx->width = s->width;
1316
h->s.avctx->height = s->height;
1322
static void cavs_flush(AVCodecContext * avctx) {
1323
AVSContext *h = avctx->priv_data;
1324
h->got_keyframe = 0;
1327
static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size,
1328
uint8_t * buf, int buf_size) {
1329
AVSContext *h = avctx->priv_data;
1330
MpegEncContext *s = &h->s;
1332
const uint8_t *buf_end;
1333
const uint8_t *buf_ptr;
1334
AVFrame *picture = data;
1339
if (buf_size == 0) {
1340
if(!s->low_delay && h->DPB[0].data[0]) {
1341
*data_size = sizeof(AVPicture);
1342
*picture = *(AVFrame *) &h->DPB[0];
1348
buf_end = buf + buf_size;
1350
buf_ptr = ff_find_start_code(buf_ptr,buf_end, &stc);
1351
if(stc & 0xFFFFFE00)
1352
return FFMAX(0, buf_ptr - buf - s->parse_context.last_index);
1353
input_size = (buf_end - buf_ptr)*8;
1355
case SEQ_START_CODE:
1356
init_get_bits(&s->gb, buf_ptr, input_size);
1357
decode_seq_header(h);
1359
case PIC_I_START_CODE:
1360
if(!h->got_keyframe) {
1361
if(h->DPB[0].data[0])
1362
avctx->release_buffer(avctx, (AVFrame *)&h->DPB[0]);
1363
if(h->DPB[1].data[0])
1364
avctx->release_buffer(avctx, (AVFrame *)&h->DPB[1]);
1365
h->got_keyframe = 1;
1367
case PIC_PB_START_CODE:
1369
if(!h->got_keyframe)
1371
init_get_bits(&s->gb, buf_ptr, input_size);
1375
*data_size = sizeof(AVPicture);
1376
if(h->pic_type != FF_B_TYPE) {
1377
if(h->DPB[1].data[0]) {
1378
*picture = *(AVFrame *) &h->DPB[1];
1383
*picture = *(AVFrame *) &h->picture;
1385
case EXT_START_CODE:
1386
//mpeg_decode_extension(avctx,buf_ptr, input_size);
1388
case USER_START_CODE:
1389
//mpeg_decode_user_data(avctx,buf_ptr, input_size);
1392
if (stc >= SLICE_MIN_START_CODE &&
1393
stc <= SLICE_MAX_START_CODE) {
1394
init_get_bits(&s->gb, buf_ptr, input_size);
1395
decode_slice_header(h, &s->gb);
1402
static int cavs_decode_init(AVCodecContext * avctx) {
671
av_cold int ff_cavs_init(AVCodecContext *avctx) {
1403
672
AVSContext *h = avctx->priv_data;
1404
673
MpegEncContext * const s = &h->s;