431
435
if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
432
436
|| s->h_edge_pos < 22 || v_edge_pos < 22
433
437
|| (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3
434
|| (unsigned)(src_y - s->mspel) > v_edge_pos - (my&3) - 16 - s->mspel * 3) {
438
|| (unsigned)(src_y - 1) > v_edge_pos - (my&3) - 16 - 3) {
435
439
uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
437
441
srcY -= s->mspel * (1 + s->linesize);
438
s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
439
17 + s->mspel * 2, 17 + s->mspel * 2,
440
src_x - s->mspel, src_y - s->mspel,
441
s->h_edge_pos, v_edge_pos);
442
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
443
17 + s->mspel * 2, 17 + s->mspel * 2,
444
src_x - s->mspel, src_y - s->mspel,
445
s->h_edge_pos, v_edge_pos);
442
446
srcY = s->edge_emu_buffer;
443
s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
444
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
445
s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
446
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
447
s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
448
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
449
s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
450
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
448
452
srcV = uvbuf + 16;
449
453
/* if we deal with range reduction we need to scale source blocks */
668
677
|| (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
669
678
srcY -= s->mspel * (1 + (s->linesize << fieldmv));
670
679
/* check emulate edge stride and offset */
671
s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
672
9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
673
src_x - s->mspel, src_y - (s->mspel << fieldmv),
674
s->h_edge_pos, v_edge_pos);
680
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
681
9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
682
src_x - s->mspel, src_y - (s->mspel << fieldmv),
683
s->h_edge_pos, v_edge_pos);
675
684
srcY = s->edge_emu_buffer;
676
685
/* if we deal with range reduction we need to scale source blocks */
677
686
if (v->rangeredfrm) {
795
804
/* calculate chroma MV vector from four luma MVs */
796
805
if (!v->field_mode || (v->field_mode && !v->numref)) {
797
806
valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
807
chroma_ref_type = v->reffield;
798
808
if (!valid_count) {
799
809
s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
800
810
s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
868
883
|| s->h_edge_pos < 18 || v_edge_pos < 18
869
884
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
870
885
|| (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) {
871
s->dsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize,
872
8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
873
s->h_edge_pos >> 1, v_edge_pos >> 1);
874
s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
875
8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
876
s->h_edge_pos >> 1, v_edge_pos >> 1);
886
s->vdsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize,
887
8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
888
s->h_edge_pos >> 1, v_edge_pos >> 1);
889
s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
890
8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
891
s->h_edge_pos >> 1, v_edge_pos >> 1);
877
892
srcU = s->edge_emu_buffer;
878
893
srcV = s->edge_emu_buffer + 16;
973
988
|| s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
974
989
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
975
990
|| (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) {
976
s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize,
977
5, (5 << fieldmv), uvsrc_x, uvsrc_y,
978
s->h_edge_pos >> 1, v_edge_pos);
979
s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
980
5, (5 << fieldmv), uvsrc_x, uvsrc_y,
981
s->h_edge_pos >> 1, v_edge_pos);
991
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize,
992
5, (5 << fieldmv), uvsrc_x, uvsrc_y,
993
s->h_edge_pos >> 1, v_edge_pos);
994
s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
995
5, (5 << fieldmv), uvsrc_x, uvsrc_y,
996
s->h_edge_pos >> 1, v_edge_pos);
982
997
srcU = s->edge_emu_buffer;
983
998
srcV = s->edge_emu_buffer + 16;
1173
1197
refdist = dir ? v->brfd : v->frfd;
1174
1198
if (refdist > 3)
1176
scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist];
1177
scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist];
1178
scalezone1_x = vc1_field_mvpred_scales[table_index][3][refdist];
1179
zone1offset_x = vc1_field_mvpred_scales[table_index][5][refdist];
1200
scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1201
scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1202
scalezone1_x = ff_vc1_field_mvpred_scales[table_index][3][refdist];
1203
zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist];
1181
1205
if (FFABS(n) > 255)
1182
1206
scaledvalue = n;
1206
1230
refdist = dir ? v->brfd : v->frfd;
1207
1231
if (refdist > 3)
1209
scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist];
1210
scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist];
1211
scalezone1_y = vc1_field_mvpred_scales[table_index][4][refdist];
1212
zone1offset_y = vc1_field_mvpred_scales[table_index][6][refdist];
1233
scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1234
scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1235
scalezone1_y = ff_vc1_field_mvpred_scales[table_index][4][refdist];
1236
zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist];
1214
1238
if (FFABS(n) > 63)
1215
1239
scaledvalue = n;
1237
1261
int scaledvalue;
1239
1263
brfd = FFMIN(v->brfd, 3);
1240
scalezone1_x = vc1_b_field_mvpred_scales[3][brfd];
1241
zone1offset_x = vc1_b_field_mvpred_scales[5][brfd];
1242
scaleopp1 = vc1_b_field_mvpred_scales[1][brfd];
1243
scaleopp2 = vc1_b_field_mvpred_scales[2][brfd];
1264
scalezone1_x = ff_vc1_b_field_mvpred_scales[3][brfd];
1265
zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd];
1266
scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1267
scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1245
1269
if (FFABS(n) > 255)
1246
1270
scaledvalue = n;
1264
1288
int scaledvalue;
1266
1290
brfd = FFMIN(v->brfd, 3);
1267
scalezone1_y = vc1_b_field_mvpred_scales[4][brfd];
1268
zone1offset_y = vc1_b_field_mvpred_scales[6][brfd];
1269
scaleopp1 = vc1_b_field_mvpred_scales[1][brfd];
1270
scaleopp2 = vc1_b_field_mvpred_scales[2][brfd];
1291
scalezone1_y = ff_vc1_b_field_mvpred_scales[4][brfd];
1292
zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd];
1293
scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1294
scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1272
1296
if (FFABS(n) > 63)
1273
1297
scaledvalue = n;
1347
1371
int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
1348
int opposit, a_f, b_f, c_f;
1372
int opposite, a_f, b_f, c_f;
1349
1373
int16_t field_predA[2];
1350
1374
int16_t field_predB[2];
1351
1375
int16_t field_predC[2];
1455
1479
if (v->field_mode) {
1456
if (num_samefield <= num_oppfield)
1457
opposit = 1 - pred_flag;
1459
opposit = pred_flag;
1481
// REFFIELD determines if the last field or the second-last field is
1482
// to be used as reference
1483
opposite = 1 - v->reffield;
1485
if (num_samefield <= num_oppfield)
1486
opposite = 1 - pred_flag;
1488
opposite = pred_flag;
1463
1493
if (a_valid && !a_f) {
1464
1494
field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
1465
1495
field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
1878
1904
if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22
1879
|| (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 16 - s->mspel * 3
1880
|| (unsigned)(src_y - s->mspel) > v_edge_pos - (my & 3) - 16 - s->mspel * 3) {
1905
|| (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3
1906
|| (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) {
1881
1907
uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
1883
1909
srcY -= s->mspel * (1 + s->linesize);
1884
s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
1885
17 + s->mspel * 2, 17 + s->mspel * 2,
1886
src_x - s->mspel, src_y - s->mspel,
1887
s->h_edge_pos, v_edge_pos);
1910
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
1911
17 + s->mspel * 2, 17 + s->mspel * 2,
1912
src_x - s->mspel, src_y - s->mspel,
1913
s->h_edge_pos, v_edge_pos);
1888
1914
srcY = s->edge_emu_buffer;
1889
s->dsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
1890
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1891
s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
1892
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1915
s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
1916
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1917
s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
1918
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1894
1920
srcV = uvbuf + 16;
1895
1921
/* if we deal with range reduction we need to scale source blocks */
1976
static av_always_inline int scale_mv_intfi(int value, int bfrac, int inv,
1977
int qs, int qs_last)
1985
return (value * n + 255) >> 9;
1987
return (value * n + 128) >> 8;
1990
2002
/** Reconstruct motion vector for B-frame and do motion compensation
1992
2004
static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
2240
2252
if (v->bmvtype == BMV_TYPE_DIRECT) {
2241
2253
int total_opp, k, f;
2242
2254
if (s->next_picture.f.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
2243
s->mv[0][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2244
v->bfraction, 0, s->quarter_sample, v->qs_last);
2245
s->mv[0][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2246
v->bfraction, 0, s->quarter_sample, v->qs_last);
2247
s->mv[1][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2248
v->bfraction, 1, s->quarter_sample, v->qs_last);
2249
s->mv[1][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2250
v->bfraction, 1, s->quarter_sample, v->qs_last);
2255
s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2256
v->bfraction, 0, s->quarter_sample);
2257
s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2258
v->bfraction, 0, s->quarter_sample);
2259
s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2260
v->bfraction, 1, s->quarter_sample);
2261
s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2262
v->bfraction, 1, s->quarter_sample);
2252
2264
total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
2253
2265
+ v->mv_f_next[0][s->block_index[1] + v->blocks_off]
3949
3962
s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
3950
3963
for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
3951
3964
if (idx_mbmode <= 5) { // 1-MV
3965
dmv_x = dmv_y = pred_flag = 0;
3953
3966
if (idx_mbmode & 1) {
3954
3967
get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4447
4460
s->first_slice_line = 0;
4449
4462
if (v->s.loop_filter)
4450
ff_draw_horiz_band(s, (s->mb_height - 1) * 16, 16);
4463
ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4465
/* This is intentionally mb_height and not end_mb_y - unlike in advanced
4466
* profile, these only differ are when decoding MSS2 rectangles. */
4451
4467
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
4899
4915
av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
4901
4917
if (get_bits_count(gb) >= gb->size_in_bits +
4902
(avctx->codec_id == CODEC_ID_WMV3IMAGE ? 64 : 0))
4918
(avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
4903
4919
av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
4904
4920
if (get_bits_count(gb) < gb->size_in_bits - 8)
4905
4921
av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
4937
4953
int iline = s->current_picture.f.linesize[plane];
4938
4954
int ycoord = yoff[sprite] + yadv[sprite] * row;
4939
4955
int yline = ycoord >> 16;
4940
4957
ysub[sprite] = ycoord & 0xFFFF;
4942
4959
iplane = s->last_picture.f.data[plane];
4943
4960
iline = s->last_picture.f.linesize[plane];
4962
next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
4945
4963
if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
4946
4964
src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
4947
4965
if (ysub[sprite])
4948
src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + (yline + 1) * iline;
4966
src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
4950
4968
if (sr_cache[sprite][0] != yline) {
4951
4969
if (sr_cache[sprite][1] == yline) {
4959
4977
if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
4960
v->vc1dsp.sprite_h(v->sr_rows[sprite][1], iplane + (yline + 1) * iline, xoff[sprite], xadv[sprite], width);
4978
v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
4979
iplane + next_line, xoff[sprite],
4980
xadv[sprite], width);
4961
4981
sr_cache[sprite][1] = yline + 1;
4963
4983
src_h[sprite][0] = v->sr_rows[sprite][0];
5022
5042
v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
5023
5043
v->sprite_output_frame.reference = 0;
5024
if (avctx->get_buffer(avctx, &v->sprite_output_frame) < 0) {
5044
if (ff_get_buffer(avctx, &v->sprite_output_frame) < 0) {
5025
5045
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
5140
av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
5143
for (i = 0; i < 64; i++) {
5144
#define transpose(x) ((x >> 3) | ((x & 7) << 3))
5145
v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
5146
v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
5147
v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
5148
v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
5149
v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5120
5155
/** Initialize a VC1/WMV3 decoder
5121
5156
* @todo TODO: Handle VC-1 IDUs (Transport level?)
5122
5157
* @todo TODO: Decypher remaining bits in extra_data
5137
5171
if (!(avctx->flags & CODEC_FLAG_GRAY))
5138
5172
avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5140
avctx->pix_fmt = PIX_FMT_GRAY8;
5174
avctx->pix_fmt = AV_PIX_FMT_GRAY8;
5141
5175
avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5142
5176
v->s.avctx = avctx;
5143
5177
avctx->flags |= CODEC_FLAG_EMU_EDGE;
5162
5196
init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5164
if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
5198
if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0)
5167
5201
count = avctx->extradata_size*8 - get_bits_count(&gb);
5196
5230
init_get_bits(&gb, buf2, buf2_size * 8);
5197
5231
switch (AV_RB32(start)) {
5198
5232
case VC1_CODE_SEQHDR:
5199
if (vc1_decode_sequence_header(avctx, v, &gb) < 0) {
5233
if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0) {
5203
5237
seq_initialized = 1;
5205
5239
case VC1_CODE_ENTRYPOINT:
5206
if (vc1_decode_entry_point(avctx, v, &gb) < 0) {
5240
if (ff_vc1_decode_entry_point(avctx, v, &gb) < 0) {
5229
5263
s->mb_height = (avctx->coded_height + 15) >> 4;
5231
5265
if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
5232
for (i = 0; i < 64; i++) {
5233
#define transpose(x) ((x >> 3) | ((x & 7) << 3))
5234
v->zz_8x8[0][i] = transpose(wmv1_scantable[0][i]);
5235
v->zz_8x8[1][i] = transpose(wmv1_scantable[1][i]);
5236
v->zz_8x8[2][i] = transpose(wmv1_scantable[2][i]);
5237
v->zz_8x8[3][i] = transpose(wmv1_scantable[3][i]);
5238
v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5266
ff_vc1_init_transposed_scantables(v);
5243
memcpy(v->zz_8x8, wmv1_scantable, 4*64);
5268
memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
5244
5269
v->left_blk_sh = 3;
5245
5270
v->top_blk_sh = 0;
5248
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5273
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5249
5274
v->sprite_width = avctx->coded_width;
5250
5275
v->sprite_height = avctx->coded_height;
5264
5289
/** Close a VC1/WMV3 decoder
5265
5290
* @warning Initial try at using MpegEncContext stuff
5267
static av_cold int vc1_decode_end(AVCodecContext *avctx)
5292
av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
5269
5294
VC1Context *v = avctx->priv_data;
5272
if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
5297
if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5273
5298
&& v->sprite_output_frame.data[0])
5274
5299
avctx->release_buffer(avctx, &v->sprite_output_frame);
5275
5300
for (i = 0; i < 4; i++)
5276
5301
av_freep(&v->sr_rows[i >> 1][i & 1]);
5277
5302
av_freep(&v->hrd_rate);
5278
5303
av_freep(&v->hrd_buffer);
5279
MPV_common_end(&v->s);
5304
ff_MPV_common_end(&v->s);
5280
5305
av_freep(&v->mv_type_mb_plane);
5281
5306
av_freep(&v->direct_mb_plane);
5282
5307
av_freep(&v->forward_mb_plane);
5302
5327
* @todo TODO: Handle VC-1 IDUs (Transport level?)
5304
5329
static int vc1_decode_frame(AVCodecContext *avctx, void *data,
5305
int *data_size, AVPacket *avpkt)
5330
int *got_frame, AVPacket *avpkt)
5307
5332
const uint8_t *buf = avpkt->data;
5308
5333
int buf_size = avpkt->size, n_slices = 0, i;
5322
5347
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
5323
5348
/* special case for last picture */
5324
5349
if (s->low_delay == 0 && s->next_picture_ptr) {
5325
*pict = *(AVFrame*)s->next_picture_ptr;
5350
*pict = s->next_picture_ptr->f;
5326
5351
s->next_picture_ptr = NULL;
5328
*data_size = sizeof(AVFrame);
5334
5359
if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
5335
5360
if (v->profile < PROFILE_ADVANCED)
5336
avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
5361
avctx->pix_fmt = AV_PIX_FMT_VDPAU_WMV3;
5338
avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
5363
avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
5341
5366
//for advanced profile we may need to parse and unescape data
5342
if (avctx->codec_id == CODEC_ID_VC1 || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5367
if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5343
5368
int buf_size2 = 0;
5344
5369
buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5381
5407
case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
5382
5408
buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5383
5409
init_get_bits(&s->gb, buf2, buf_size2 * 8);
5384
vc1_decode_entry_point(avctx, v, &s->gb);
5410
ff_vc1_decode_entry_point(avctx, v, &s->gb);
5386
5412
case VC1_CODE_SLICE: {
5388
slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5414
tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5391
5418
slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5392
5419
if (!slices[n_slices].buf)
5435
5462
if (v->res_sprite) {
5436
5463
v->new_sprite = !get_bits1(&s->gb);
5437
5464
v->two_sprites = get_bits1(&s->gb);
5438
/* res_sprite means a Windows Media Image stream, CODEC_ID_*IMAGE means
5465
/* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
5439
5466
we're using the sprite compositor. These are intentionally kept separate
5440
5467
so you can get the raw sprites by using the wmv3 decoder for WMVP or
5441
5468
the vc1 one for WVP2 */
5442
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5469
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5443
5470
if (v->new_sprite) {
5444
5471
// switch AVCodecContext parameters to those of the sprites
5445
5472
avctx->width = avctx->coded_width = v->sprite_width;
5453
5480
if (s->context_initialized &&
5454
5481
(s->width != avctx->coded_width ||
5455
5482
s->height != avctx->coded_height)) {
5456
vc1_decode_end(avctx);
5483
ff_vc1_decode_end(avctx);
5459
5486
if (!s->context_initialized) {
5460
if (ff_msmpeg4_decode_init(avctx) < 0 || vc1_decode_init_alloc_tables(v) < 0)
5487
if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)
5463
5490
s->low_delay = !avctx->has_b_frames || v->res_sprite;
5480
5507
// do parse frame header
5481
5508
v->pic_header_flag = 0;
5482
5509
if (v->profile < PROFILE_ADVANCED) {
5483
if (vc1_parse_frame_header(v, &s->gb) == -1) {
5510
if (ff_vc1_parse_frame_header(v, &s->gb) == -1) {
5487
if (vc1_parse_frame_header_adv(v, &s->gb) == -1) {
5514
if (ff_vc1_parse_frame_header_adv(v, &s->gb) == -1) {
5492
if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
5519
if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5493
5520
&& s->pict_type != AV_PICTURE_TYPE_I) {
5494
5521
av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
5586
5620
v->pic_header_flag = 0;
5587
if (v->field_mode && i == n_slices1 + 2)
5588
vc1_parse_frame_header_adv(v, &s->gb);
5589
else if (get_bits1(&s->gb)) {
5621
if (v->field_mode && i == n_slices1 + 2) {
5622
if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5623
av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
5626
} else if (get_bits1(&s->gb)) {
5590
5627
v->pic_header_flag = 1;
5591
vc1_parse_frame_header_adv(v, &s->gb);
5628
if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5629
av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
5594
5634
s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
5612
5652
s->linesize >>= 1;
5613
5653
s->uvlinesize >>= 1;
5615
//av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), s->gb.size_in_bits);
5655
av_dlog(s->avctx, "Consumed %i/%i bits\n",
5656
get_bits_count(&s->gb), s->gb.size_in_bits);
5616
5657
// if (get_bits_count(&s->gb) > buf_size * 8)
5618
5659
ff_er_frame_end(s);
5662
ff_MPV_frame_end(s);
5623
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5664
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5625
5666
avctx->width = avctx->coded_width = v->output_width;
5626
5667
avctx->height = avctx->coded_height = v->output_height;
5633
5674
*pict = v->sprite_output_frame;
5634
*data_size = sizeof(AVFrame);
5636
5677
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
5637
*pict = *(AVFrame*)s->current_picture_ptr;
5678
*pict = s->current_picture_ptr->f;
5638
5679
} else if (s->last_picture_ptr != NULL) {
5639
*pict = *(AVFrame*)s->last_picture_ptr;
5680
*pict = s->last_picture_ptr->f;
5641
5682
if (s->last_picture_ptr || s->low_delay) {
5642
*data_size = sizeof(AVFrame);
5643
5684
ff_print_debug_info(s, pict);
5671
5712
AVCodec ff_vc1_decoder = {
5673
5714
.type = AVMEDIA_TYPE_VIDEO,
5715
.id = AV_CODEC_ID_VC1,
5675
5716
.priv_data_size = sizeof(VC1Context),
5676
5717
.init = vc1_decode_init,
5677
.close = vc1_decode_end,
5718
.close = ff_vc1_decode_end,
5678
5719
.decode = vc1_decode_frame,
5679
5720
.flush = ff_mpeg_flush,
5680
5721
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5687
5728
AVCodec ff_wmv3_decoder = {
5688
5729
.name = "wmv3",
5689
5730
.type = AVMEDIA_TYPE_VIDEO,
5690
.id = CODEC_ID_WMV3,
5731
.id = AV_CODEC_ID_WMV3,
5691
5732
.priv_data_size = sizeof(VC1Context),
5692
5733
.init = vc1_decode_init,
5693
.close = vc1_decode_end,
5734
.close = ff_vc1_decode_end,
5694
5735
.decode = vc1_decode_frame,
5695
5736
.flush = ff_mpeg_flush,
5696
5737
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5704
5745
AVCodec ff_wmv3_vdpau_decoder = {
5705
5746
.name = "wmv3_vdpau",
5706
5747
.type = AVMEDIA_TYPE_VIDEO,
5707
.id = CODEC_ID_WMV3,
5748
.id = AV_CODEC_ID_WMV3,
5708
5749
.priv_data_size = sizeof(VC1Context),
5709
5750
.init = vc1_decode_init,
5710
.close = vc1_decode_end,
5751
.close = ff_vc1_decode_end,
5711
5752
.decode = vc1_decode_frame,
5712
5753
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5713
5754
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
5714
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE},
5755
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_WMV3, AV_PIX_FMT_NONE },
5715
5756
.profiles = NULL_IF_CONFIG_SMALL(profiles)
5720
5761
AVCodec ff_vc1_vdpau_decoder = {
5721
5762
.name = "vc1_vdpau",
5722
5763
.type = AVMEDIA_TYPE_VIDEO,
5764
.id = AV_CODEC_ID_VC1,
5724
5765
.priv_data_size = sizeof(VC1Context),
5725
5766
.init = vc1_decode_init,
5726
.close = vc1_decode_end,
5767
.close = ff_vc1_decode_end,
5727
5768
.decode = vc1_decode_frame,
5728
5769
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5729
5770
.long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
5730
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE},
5771
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_VC1, AV_PIX_FMT_NONE },
5731
5772
.profiles = NULL_IF_CONFIG_SMALL(profiles)
5736
5777
AVCodec ff_wmv3image_decoder = {
5737
5778
.name = "wmv3image",
5738
5779
.type = AVMEDIA_TYPE_VIDEO,
5739
.id = CODEC_ID_WMV3IMAGE,
5780
.id = AV_CODEC_ID_WMV3IMAGE,
5740
5781
.priv_data_size = sizeof(VC1Context),
5741
5782
.init = vc1_decode_init,
5742
.close = vc1_decode_end,
5783
.close = ff_vc1_decode_end,
5743
5784
.decode = vc1_decode_frame,
5744
5785
.capabilities = CODEC_CAP_DR1,
5745
5786
.flush = vc1_sprite_flush,
5752
5793
AVCodec ff_vc1image_decoder = {
5753
5794
.name = "vc1image",
5754
5795
.type = AVMEDIA_TYPE_VIDEO,
5755
.id = CODEC_ID_VC1IMAGE,
5796
.id = AV_CODEC_ID_VC1IMAGE,
5756
5797
.priv_data_size = sizeof(VC1Context),
5757
5798
.init = vc1_decode_init,
5758
.close = vc1_decode_end,
5799
.close = ff_vc1_decode_end,
5759
5800
.decode = vc1_decode_frame,
5760
5801
.capabilities = CODEC_CAP_DR1,
5761
5802
.flush = vc1_sprite_flush,