#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "error_resilience.h"
-#include "hwaccel.h"
+#include "hwconfig.h"
#include "idctdsp.h"
#include "internal.h"
#include "mpegutils.h"
dy -= 1 << (shift + a + 1);
else
dx -= 1 << (shift + a + 1);
- mb_v = s->sprite_offset[0][n] + dx * s->mb_x * 16 + dy * s->mb_y * 16;
+ mb_v = s->sprite_offset[0][n] + dx * s->mb_x * 16U + dy * s->mb_y * 16U;
sum = 0;
for (y = 0; y < 16; y++) {
if (s->pict_type == AV_PICTURE_TYPE_I) {
while (show_bits(&s->gb, 9) == 1)
skip_bits(&s->gb, 9);
- if (get_bits_long(&s->gb, 19) != DC_MARKER) {
+ if (get_bits(&s->gb, 19) != DC_MARKER) {
av_log(s->avctx, AV_LOG_ERROR,
"marker missing after first I partition at %d %d\n",
s->mb_x, s->mb_y);
MpegEncContext *s = &ctx->m;
int width, height;
int bits_per_raw_sample;
+ int rgb, chroma_format;
// random_accessible_vol and video_object_type_indication have already
// been read by the caller decode_vol_header()
ctx->shape = get_bits(gb, 2); /* video_object_layer_shape */
skip_bits(gb, 4); /* video_object_layer_shape_extension */
skip_bits1(gb); /* progressive_sequence */
+ if (ctx->shape != RECT_SHAPE) {
+ avpriv_request_sample(s->avctx, "MPEG-4 Studio profile non rectangular shape");
+ return AVERROR_PATCHWELCOME;
+ }
if (ctx->shape != BIN_ONLY_SHAPE) {
- ctx->rgb = get_bits1(gb); /* rgb_components */
- s->chroma_format = get_bits(gb, 2); /* chroma_format */
- if (!s->chroma_format) {
+ rgb = get_bits1(gb); /* rgb_components */
+ chroma_format = get_bits(gb, 2); /* chroma_format */
+ if (!chroma_format || chroma_format == CHROMA_420 || (rgb && chroma_format == CHROMA_422)) {
av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
return AVERROR_INVALIDDATA;
}
bits_per_raw_sample = get_bits(gb, 4); /* bit_depth */
if (bits_per_raw_sample == 10) {
- if (ctx->rgb) {
+ if (rgb) {
s->avctx->pix_fmt = AV_PIX_FMT_GBRP10;
}
else {
- s->avctx->pix_fmt = s->chroma_format == CHROMA_422 ? AV_PIX_FMT_YUV422P10 : AV_PIX_FMT_YUV444P10;
+ s->avctx->pix_fmt = chroma_format == CHROMA_422 ? AV_PIX_FMT_YUV422P10 : AV_PIX_FMT_YUV444P10;
}
}
else {
avpriv_request_sample(s->avctx, "MPEG-4 Studio profile bit-depth %u", bits_per_raw_sample);
return AVERROR_PATCHWELCOME;
}
+ if (rgb != ctx->rgb || s->chroma_format != chroma_format)
+ s->context_reinit = 1;
s->avctx->bits_per_raw_sample = bits_per_raw_sample;
+ ctx->rgb = rgb;
+ s->chroma_format = chroma_format;
}
if (ctx->shape == RECT_SHAPE) {
check_marker(s->avctx, gb, "before video_object_layer_width");
if (ret < 0)
return ret;
- memcpy(((uint8_t*)s) + sizeof(MpegEncContext), ((uint8_t*)s1) + sizeof(MpegEncContext), sizeof(Mpeg4DecContext) - sizeof(MpegEncContext));
+ // copy all the necessary fields explicitly
+ s->time_increment_bits = s1->time_increment_bits;
+ s->shape = s1->shape;
+ s->vol_sprite_usage = s1->vol_sprite_usage;
+ s->sprite_brightness_change = s1->sprite_brightness_change;
+ s->num_sprite_warping_points = s1->num_sprite_warping_points;
+ s->rvlc = s1->rvlc;
+ s->resync_marker = s1->resync_marker;
+ s->t_frame = s1->t_frame;
+ s->new_pred = s1->new_pred;
+ s->enhancement_type = s1->enhancement_type;
+ s->scalability = s1->scalability;
+ s->use_intra_dc_vlc = s1->use_intra_dc_vlc;
+ s->intra_dc_threshold = s1->intra_dc_threshold;
+ s->divx_version = s1->divx_version;
+ s->divx_build = s1->divx_build;
+ s->xvid_build = s1->xvid_build;
+ s->lavc_build = s1->lavc_build;
+ s->showed_packed_warning = s1->showed_packed_warning;
+ s->vol_control_parameters = s1->vol_control_parameters;
+ s->cplx_estimation_trash_i = s1->cplx_estimation_trash_i;
+ s->cplx_estimation_trash_p = s1->cplx_estimation_trash_p;
+ s->cplx_estimation_trash_b = s1->cplx_estimation_trash_b;
+ s->rgb = s1->rgb;
+
+ memcpy(s->sprite_shift, s1->sprite_shift, sizeof(s1->sprite_shift));
+ memcpy(s->sprite_traj, s1->sprite_traj, sizeof(s1->sprite_traj));
if (CONFIG_MPEG4_DECODER && !init && s1->xvid_build >= 0)
ff_xvid_idct_init(&s->m.idsp, dst);
ctx->time_increment_bits = 4; /* default value for broken headers */
avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
- avctx->internal->allocate_progress = 1;
return 0;
}
Mpeg4DecContext *ctx = avctx->priv_data;
int i;
- if (!avctx->internal->is_copy) {
- for (i = 0; i < 12; i++)
- ff_free_vlc(&ctx->studio_intra_tab[i]);
+ for (i = 0; i < 12; i++)
+ ff_free_vlc(&ctx->studio_intra_tab[i]);
- ff_free_vlc(&ctx->studio_luma_dc);
- ff_free_vlc(&ctx->studio_chroma_dc);
- }
+ ff_free_vlc(&ctx->studio_luma_dc);
+ ff_free_vlc(&ctx->studio_chroma_dc);
return ff_h263_decode_end(avctx);
}
.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY |
AV_CODEC_CAP_FRAME_THREADS,
- .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
+ .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
+ FF_CODEC_CAP_ALLOCATE_PROGRESS |
+ FF_CODEC_CAP_INIT_CLEANUP,
.flush = ff_mpeg_flush,
.max_lowres = 3,
.pix_fmts = ff_h263_hwaccel_pixfmt_list_420,