431
430
if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
432
431
|| s->h_edge_pos < 22 || v_edge_pos < 22
433
432
|| (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) {
433
|| (unsigned)(src_y - 1) > v_edge_pos - (my&3) - 16 - 3) {
435
434
uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
437
436
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);
437
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
438
17 + s->mspel * 2, 17 + s->mspel * 2,
439
src_x - s->mspel, src_y - s->mspel,
440
s->h_edge_pos, v_edge_pos);
442
441
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);
442
s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
443
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
444
s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
445
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
448
447
srcV = uvbuf + 16;
449
448
/* if we deal with range reduction we need to scale source blocks */
668
667
|| (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
669
668
srcY -= s->mspel * (1 + (s->linesize << fieldmv));
670
669
/* 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);
670
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
671
9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
672
src_x - s->mspel, src_y - (s->mspel << fieldmv),
673
s->h_edge_pos, v_edge_pos);
675
674
srcY = s->edge_emu_buffer;
676
675
/* if we deal with range reduction we need to scale source blocks */
677
676
if (v->rangeredfrm) {
795
794
/* calculate chroma MV vector from four luma MVs */
796
795
if (!v->field_mode || (v->field_mode && !v->numref)) {
797
796
valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
797
chroma_ref_type = v->reffield;
798
798
if (!valid_count) {
799
799
s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
800
800
s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
868
868
|| s->h_edge_pos < 18 || v_edge_pos < 18
869
869
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
870
870
|| (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);
871
s->vdsp.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->vdsp.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);
877
877
srcU = s->edge_emu_buffer;
878
878
srcV = s->edge_emu_buffer + 16;
973
973
|| s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
974
974
|| (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
975
975
|| (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);
976
s->vdsp.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->vdsp.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);
982
982
srcU = s->edge_emu_buffer;
983
983
srcV = s->edge_emu_buffer + 16;
1173
1182
refdist = dir ? v->brfd : v->frfd;
1174
1183
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];
1185
scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1186
scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1187
scalezone1_x = ff_vc1_field_mvpred_scales[table_index][3][refdist];
1188
zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist];
1181
1190
if (FFABS(n) > 255)
1182
1191
scaledvalue = n;
1206
1215
refdist = dir ? v->brfd : v->frfd;
1207
1216
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];
1218
scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
1219
scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
1220
scalezone1_y = ff_vc1_field_mvpred_scales[table_index][4][refdist];
1221
zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist];
1214
1223
if (FFABS(n) > 63)
1215
1224
scaledvalue = n;
1237
1246
int scaledvalue;
1239
1248
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];
1249
scalezone1_x = ff_vc1_b_field_mvpred_scales[3][brfd];
1250
zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd];
1251
scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1252
scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1245
1254
if (FFABS(n) > 255)
1246
1255
scaledvalue = n;
1264
1273
int scaledvalue;
1266
1275
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];
1276
scalezone1_y = ff_vc1_b_field_mvpred_scales[4][brfd];
1277
zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd];
1278
scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
1279
scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
1272
1281
if (FFABS(n) > 63)
1273
1282
scaledvalue = n;
1347
1356
int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
1348
int opposit, a_f, b_f, c_f;
1357
int opposite, a_f, b_f, c_f;
1349
1358
int16_t field_predA[2];
1350
1359
int16_t field_predB[2];
1351
1360
int16_t field_predC[2];
1455
1464
if (v->field_mode) {
1456
if (num_samefield <= num_oppfield)
1457
opposit = 1 - pred_flag;
1459
opposit = pred_flag;
1466
// REFFIELD determines if the last field or the second-last field is
1467
// to be used as reference
1468
opposite = 1 - v->reffield;
1470
if (num_samefield <= num_oppfield)
1471
opposite = 1 - pred_flag;
1473
opposite = pred_flag;
1463
1478
if (a_valid && !a_f) {
1464
1479
field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
1465
1480
field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
1878
1889
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) {
1890
|| (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3
1891
|| (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) {
1881
1892
uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
1883
1894
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);
1895
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
1896
17 + s->mspel * 2, 17 + s->mspel * 2,
1897
src_x - s->mspel, src_y - s->mspel,
1898
s->h_edge_pos, v_edge_pos);
1888
1899
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);
1900
s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
1901
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1902
s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
1903
uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
1894
1905
srcV = uvbuf + 16;
1895
1906
/* 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
1987
/** Reconstruct motion vector for B-frame and do motion compensation
1992
1989
static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
2240
2237
if (v->bmvtype == BMV_TYPE_DIRECT) {
2241
2238
int total_opp, k, f;
2242
2239
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);
2240
s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2241
v->bfraction, 0, s->quarter_sample);
2242
s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2243
v->bfraction, 0, s->quarter_sample);
2244
s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
2245
v->bfraction, 1, s->quarter_sample);
2246
s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
2247
v->bfraction, 1, s->quarter_sample);
2252
2249
total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
2253
2250
+ v->mv_f_next[0][s->block_index[1] + v->blocks_off]
3949
3947
s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
3950
3948
for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
3951
3949
if (idx_mbmode <= 5) { // 1-MV
3950
dmv_x = dmv_y = pred_flag = 0;
3953
3951
if (idx_mbmode & 1) {
3954
3952
get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
4447
4445
s->first_slice_line = 0;
4449
4447
if (v->s.loop_filter)
4450
ff_draw_horiz_band(s, (s->mb_height - 1) * 16, 16);
4448
ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
4450
/* This is intentionally mb_height and not end_mb_y - unlike in advanced
4451
* profile, these only differ are when decoding MSS2 rectangles. */
4451
4452
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
4899
4900
av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
4901
4902
if (get_bits_count(gb) >= gb->size_in_bits +
4902
(avctx->codec_id == CODEC_ID_WMV3IMAGE ? 64 : 0))
4903
(avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
4903
4904
av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
4904
4905
if (get_bits_count(gb) < gb->size_in_bits - 8)
4905
4906
av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
4937
4938
int iline = s->current_picture.f.linesize[plane];
4938
4939
int ycoord = yoff[sprite] + yadv[sprite] * row;
4939
4940
int yline = ycoord >> 16;
4940
4942
ysub[sprite] = ycoord & 0xFFFF;
4942
4944
iplane = s->last_picture.f.data[plane];
4943
4945
iline = s->last_picture.f.linesize[plane];
4947
next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
4945
4948
if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
4946
4949
src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
4947
4950
if (ysub[sprite])
4948
src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + (yline + 1) * iline;
4951
src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
4950
4953
if (sr_cache[sprite][0] != yline) {
4951
4954
if (sr_cache[sprite][1] == yline) {
4959
4962
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);
4963
v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
4964
iplane + next_line, xoff[sprite],
4965
xadv[sprite], width);
4961
4966
sr_cache[sprite][1] = yline + 1;
4963
4968
src_h[sprite][0] = v->sr_rows[sprite][0];
5022
5027
v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
5023
5028
v->sprite_output_frame.reference = 0;
5024
if (avctx->get_buffer(avctx, &v->sprite_output_frame) < 0) {
5029
if (ff_get_buffer(avctx, &v->sprite_output_frame) < 0) {
5025
5030
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
5125
av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
5128
for (i = 0; i < 64; i++) {
5129
#define transpose(x) ((x >> 3) | ((x & 7) << 3))
5130
v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
5131
v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
5132
v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
5133
v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
5134
v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
5120
5140
/** Initialize a VC1/WMV3 decoder
5121
5141
* @todo TODO: Handle VC-1 IDUs (Transport level?)
5122
5142
* @todo TODO: Decypher remaining bits in extra_data
5137
5156
if (!(avctx->flags & CODEC_FLAG_GRAY))
5138
5157
avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
5140
avctx->pix_fmt = PIX_FMT_GRAY8;
5159
avctx->pix_fmt = AV_PIX_FMT_GRAY8;
5141
5160
avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
5142
5161
v->s.avctx = avctx;
5143
5162
avctx->flags |= CODEC_FLAG_EMU_EDGE;
5162
5181
init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
5164
if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
5183
if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0)
5167
5186
count = avctx->extradata_size*8 - get_bits_count(&gb);
5196
5215
init_get_bits(&gb, buf2, buf2_size * 8);
5197
5216
switch (AV_RB32(start)) {
5198
5217
case VC1_CODE_SEQHDR:
5199
if (vc1_decode_sequence_header(avctx, v, &gb) < 0) {
5218
if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0) {
5203
5222
seq_initialized = 1;
5205
5224
case VC1_CODE_ENTRYPOINT:
5206
if (vc1_decode_entry_point(avctx, v, &gb) < 0) {
5225
if (ff_vc1_decode_entry_point(avctx, v, &gb) < 0) {
5229
5248
s->mb_height = (avctx->coded_height + 15) >> 4;
5231
5250
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]);
5251
ff_vc1_init_transposed_scantables(v);
5243
memcpy(v->zz_8x8, wmv1_scantable, 4*64);
5253
memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
5244
5254
v->left_blk_sh = 3;
5245
5255
v->top_blk_sh = 0;
5248
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5258
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5249
5259
v->sprite_width = avctx->coded_width;
5250
5260
v->sprite_height = avctx->coded_height;
5264
5274
/** Close a VC1/WMV3 decoder
5265
5275
* @warning Initial try at using MpegEncContext stuff
5267
static av_cold int vc1_decode_end(AVCodecContext *avctx)
5277
av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
5269
5279
VC1Context *v = avctx->priv_data;
5272
if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
5282
if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5273
5283
&& v->sprite_output_frame.data[0])
5274
5284
avctx->release_buffer(avctx, &v->sprite_output_frame);
5275
5285
for (i = 0; i < 4; i++)
5276
5286
av_freep(&v->sr_rows[i >> 1][i & 1]);
5277
5287
av_freep(&v->hrd_rate);
5278
5288
av_freep(&v->hrd_buffer);
5279
MPV_common_end(&v->s);
5289
ff_MPV_common_end(&v->s);
5280
5290
av_freep(&v->mv_type_mb_plane);
5281
5291
av_freep(&v->direct_mb_plane);
5282
5292
av_freep(&v->forward_mb_plane);
5302
5312
* @todo TODO: Handle VC-1 IDUs (Transport level?)
5304
5314
static int vc1_decode_frame(AVCodecContext *avctx, void *data,
5305
int *data_size, AVPacket *avpkt)
5315
int *got_frame, AVPacket *avpkt)
5307
5317
const uint8_t *buf = avpkt->data;
5308
5318
int buf_size = avpkt->size, n_slices = 0, i;
5322
5332
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
5323
5333
/* special case for last picture */
5324
5334
if (s->low_delay == 0 && s->next_picture_ptr) {
5325
*pict = *(AVFrame*)s->next_picture_ptr;
5335
*pict = s->next_picture_ptr->f;
5326
5336
s->next_picture_ptr = NULL;
5328
*data_size = sizeof(AVFrame);
5334
5344
if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
5335
5345
if (v->profile < PROFILE_ADVANCED)
5336
avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
5346
avctx->pix_fmt = AV_PIX_FMT_VDPAU_WMV3;
5338
avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
5348
avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
5341
5351
//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) {
5352
if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5343
5353
int buf_size2 = 0;
5344
5354
buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5381
5392
case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
5382
5393
buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
5383
5394
init_get_bits(&s->gb, buf2, buf_size2 * 8);
5384
vc1_decode_entry_point(avctx, v, &s->gb);
5395
ff_vc1_decode_entry_point(avctx, v, &s->gb);
5386
5397
case VC1_CODE_SLICE: {
5388
slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5399
tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
5391
5403
slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
5392
5404
if (!slices[n_slices].buf)
5435
5447
if (v->res_sprite) {
5436
5448
v->new_sprite = !get_bits1(&s->gb);
5437
5449
v->two_sprites = get_bits1(&s->gb);
5438
/* res_sprite means a Windows Media Image stream, CODEC_ID_*IMAGE means
5450
/* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
5439
5451
we're using the sprite compositor. These are intentionally kept separate
5440
5452
so you can get the raw sprites by using the wmv3 decoder for WMVP or
5441
5453
the vc1 one for WVP2 */
5442
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5454
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5443
5455
if (v->new_sprite) {
5444
5456
// switch AVCodecContext parameters to those of the sprites
5445
5457
avctx->width = avctx->coded_width = v->sprite_width;
5453
5465
if (s->context_initialized &&
5454
5466
(s->width != avctx->coded_width ||
5455
5467
s->height != avctx->coded_height)) {
5456
vc1_decode_end(avctx);
5468
ff_vc1_decode_end(avctx);
5459
5471
if (!s->context_initialized) {
5460
if (ff_msmpeg4_decode_init(avctx) < 0 || vc1_decode_init_alloc_tables(v) < 0)
5472
if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)
5463
5475
s->low_delay = !avctx->has_b_frames || v->res_sprite;
5480
5492
// do parse frame header
5481
5493
v->pic_header_flag = 0;
5482
5494
if (v->profile < PROFILE_ADVANCED) {
5483
if (vc1_parse_frame_header(v, &s->gb) == -1) {
5495
if (ff_vc1_parse_frame_header(v, &s->gb) == -1) {
5487
if (vc1_parse_frame_header_adv(v, &s->gb) == -1) {
5499
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)
5504
if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
5493
5505
&& s->pict_type != AV_PICTURE_TYPE_I) {
5494
5506
av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
5586
5599
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)) {
5600
if (v->field_mode && i == n_slices1 + 2) {
5601
if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5602
av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
5605
} else if (get_bits1(&s->gb)) {
5590
5606
v->pic_header_flag = 1;
5591
vc1_parse_frame_header_adv(v, &s->gb);
5607
if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
5608
av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
5594
5613
s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
5612
5631
s->linesize >>= 1;
5613
5632
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);
5634
av_dlog(s->avctx, "Consumed %i/%i bits\n",
5635
get_bits_count(&s->gb), s->gb.size_in_bits);
5616
5636
// if (get_bits_count(&s->gb) > buf_size * 8)
5618
5638
ff_er_frame_end(s);
5641
ff_MPV_frame_end(s);
5623
if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
5643
if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
5625
5645
avctx->width = avctx->coded_width = v->output_width;
5626
5646
avctx->height = avctx->coded_height = v->output_height;
5633
5653
*pict = v->sprite_output_frame;
5634
*data_size = sizeof(AVFrame);
5636
5656
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
5637
*pict = *(AVFrame*)s->current_picture_ptr;
5657
*pict = s->current_picture_ptr->f;
5638
5658
} else if (s->last_picture_ptr != NULL) {
5639
*pict = *(AVFrame*)s->last_picture_ptr;
5659
*pict = s->last_picture_ptr->f;
5641
5661
if (s->last_picture_ptr || s->low_delay) {
5642
*data_size = sizeof(AVFrame);
5643
5663
ff_print_debug_info(s, pict);
5671
5691
AVCodec ff_vc1_decoder = {
5673
5693
.type = AVMEDIA_TYPE_VIDEO,
5694
.id = AV_CODEC_ID_VC1,
5675
5695
.priv_data_size = sizeof(VC1Context),
5676
5696
.init = vc1_decode_init,
5677
.close = vc1_decode_end,
5697
.close = ff_vc1_decode_end,
5678
5698
.decode = vc1_decode_frame,
5679
5699
.flush = ff_mpeg_flush,
5680
5700
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5687
5707
AVCodec ff_wmv3_decoder = {
5688
5708
.name = "wmv3",
5689
5709
.type = AVMEDIA_TYPE_VIDEO,
5690
.id = CODEC_ID_WMV3,
5710
.id = AV_CODEC_ID_WMV3,
5691
5711
.priv_data_size = sizeof(VC1Context),
5692
5712
.init = vc1_decode_init,
5693
.close = vc1_decode_end,
5713
.close = ff_vc1_decode_end,
5694
5714
.decode = vc1_decode_frame,
5695
5715
.flush = ff_mpeg_flush,
5696
5716
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
5704
5724
AVCodec ff_wmv3_vdpau_decoder = {
5705
5725
.name = "wmv3_vdpau",
5706
5726
.type = AVMEDIA_TYPE_VIDEO,
5707
.id = CODEC_ID_WMV3,
5727
.id = AV_CODEC_ID_WMV3,
5708
5728
.priv_data_size = sizeof(VC1Context),
5709
5729
.init = vc1_decode_init,
5710
.close = vc1_decode_end,
5730
.close = ff_vc1_decode_end,
5711
5731
.decode = vc1_decode_frame,
5712
5732
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5713
5733
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
5714
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE},
5734
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_WMV3, AV_PIX_FMT_NONE },
5715
5735
.profiles = NULL_IF_CONFIG_SMALL(profiles)
5720
5740
AVCodec ff_vc1_vdpau_decoder = {
5721
5741
.name = "vc1_vdpau",
5722
5742
.type = AVMEDIA_TYPE_VIDEO,
5743
.id = AV_CODEC_ID_VC1,
5724
5744
.priv_data_size = sizeof(VC1Context),
5725
5745
.init = vc1_decode_init,
5726
.close = vc1_decode_end,
5746
.close = ff_vc1_decode_end,
5727
5747
.decode = vc1_decode_frame,
5728
5748
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
5729
5749
.long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
5730
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE},
5750
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_VC1, AV_PIX_FMT_NONE },
5731
5751
.profiles = NULL_IF_CONFIG_SMALL(profiles)
5736
5756
AVCodec ff_wmv3image_decoder = {
5737
5757
.name = "wmv3image",
5738
5758
.type = AVMEDIA_TYPE_VIDEO,
5739
.id = CODEC_ID_WMV3IMAGE,
5759
.id = AV_CODEC_ID_WMV3IMAGE,
5740
5760
.priv_data_size = sizeof(VC1Context),
5741
5761
.init = vc1_decode_init,
5742
.close = vc1_decode_end,
5762
.close = ff_vc1_decode_end,
5743
5763
.decode = vc1_decode_frame,
5744
5764
.capabilities = CODEC_CAP_DR1,
5745
5765
.flush = vc1_sprite_flush,
5752
5772
AVCodec ff_vc1image_decoder = {
5753
5773
.name = "vc1image",
5754
5774
.type = AVMEDIA_TYPE_VIDEO,
5755
.id = CODEC_ID_VC1IMAGE,
5775
.id = AV_CODEC_ID_VC1IMAGE,
5756
5776
.priv_data_size = sizeof(VC1Context),
5757
5777
.init = vc1_decode_init,
5758
.close = vc1_decode_end,
5778
.close = ff_vc1_decode_end,
5759
5779
.decode = vc1_decode_frame,
5760
5780
.capabilities = CODEC_CAP_DR1,
5761
5781
.flush = vc1_sprite_flush,