}
memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
- init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
-
if (s->watermark_key) {
- uint32_t header = AV_RL32(&s->gb_slice.buffer[1]);
- AV_WL32(&s->gb_slice.buffer[1], header ^ s->watermark_key);
+ uint32_t header = AV_RL32(&s->slice_buf[1]);
+ AV_WL32(&s->slice_buf[1], header ^ s->watermark_key);
}
+ init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
+
if (length > 0) {
memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
}
av_log(s->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
return -1;
}
- if (get_bits1(&s->gb_slice)) {
- avpriv_report_missing_feature(s->avctx, "Media key encryption");
- return AVERROR_PATCHWELCOME;
- }
s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
if ((header & 0x9F) == 2) {
- i = (s->mb_num < 64) ? 5 : av_log2(s->mb_num - 1);
+ i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
get_bits(&s->gb_slice, i);
+ } else if (get_bits1(&s->gb_slice)) {
+ avpriv_report_missing_feature(s->avctx, "Media key encryption");
+ return AVERROR_PATCHWELCOME;
}
s->slice_num = get_bits(&s->gb_slice, 8);
GetBitContext gb;
int frame_size_code;
int unk0, unk1, unk2, unk3, unk4;
+ int w,h;
size = AV_RB32(&extradata[4]);
if (size > extradata_end - extradata - 8) {
frame_size_code = get_bits(&gb, 3);
switch (frame_size_code) {
case 0:
- avctx->width = 160;
- avctx->height = 120;
+ w = 160;
+ h = 120;
break;
case 1:
- avctx->width = 128;
- avctx->height = 96;
+ w = 128;
+ h = 96;
break;
case 2:
- avctx->width = 176;
- avctx->height = 144;
+ w = 176;
+ h = 144;
break;
case 3:
- avctx->width = 352;
- avctx->height = 288;
+ w = 352;
+ h = 288;
break;
case 4:
- avctx->width = 704;
- avctx->height = 576;
+ w = 704;
+ h = 576;
break;
case 5:
- avctx->width = 240;
- avctx->height = 180;
+ w = 240;
+ h = 180;
break;
case 6:
- avctx->width = 320;
- avctx->height = 240;
+ w = 320;
+ h = 240;
break;
case 7:
- avctx->width = get_bits(&gb, 12);
- avctx->height = get_bits(&gb, 12);
+ w = get_bits(&gb, 12);
+ h = get_bits(&gb, 12);
break;
}
+ ret = ff_set_dimensions(avctx, w, h);
+ if (ret < 0)
+ goto fail;
s->halfpel_flag = get_bits1(&gb);
s->thirdpel_flag = get_bits1(&gb);