@@ -1000,11 +1001,21 @@ int ist_filter_add(InputStream *ist, InputFilter
*ifilter, int is_simple,
ist->filters[ist->nb_filters - 1] = ifilter;
if (ist->par->codec_type == AVMEDIA_TYPE_VIDEO) {
+ const AVPacketSideData *sd =
av_packet_side_data_get(ist->par->coded_side_data,
+
ist->par->nb_coded_side_data,
+
AV_PKT_DATA_FRAME_CROPPING);
if (ist->framerate.num > 0 && ist->framerate.den > 0) {
opts->framerate = ist->framerate;
opts->flags |= IFILTER_FLAG_CFR;
} else
opts->framerate = av_guess_frame_rate(d->f.ctx, ist->st, NULL);
+ if (sd && sd->size == sizeof(uint32_t) * 4) {
+ opts->crop_top = AV_RL32(sd->data + 0);
+ opts->crop_bottom = AV_RL32(sd->data + 4);
+ opts->crop_left = AV_RL32(sd->data + 8);
+ opts->crop_right = AV_RL32(sd->data + 12);
+ opts->flags |= IFILTER_FLAG_CROP;
+ }
} else if (ist->par->codec_type == AVMEDIA_TYPE_SUBTITLE) {
/* Compute the size of the canvas for the subtitles stream.
If the subtitles codecpar has set a size, use it. Otherwise use the
@@ -1241,6 +1252,9 @@ static int ist_add(const OptionsContext *o, Demuxer *d,
AVStream *st)
ds->autorotate = 1;
MATCH_PER_STREAM_OPT(autorotate, i, ds->autorotate, ic, st);
+ ds->apply_cropping = 1;
+ MATCH_PER_STREAM_OPT(apply_cropping, i, ds->apply_cropping, ic, st);
+
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
if (codec_tag) {
uint32_t tag = strtol(codec_tag, &next, 0);
@@ -1362,6 +1376,8 @@ static int ist_add(const OptionsContext *o, Demuxer *d,
AVStream *st)
ds->dec_opts.flags |= DECODER_FLAG_BITEXACT * !!o->bitexact;
+ av_dict_set_int(&ds->decoder_opts, "apply_cropping", ds->apply_cropping, 0);