[FFmpeg-devel] [PATCH 1/2 v2] fftools/ffmpeg: support applying container level cropping
James Almer
jamrial at gmail.com
Tue Jun 25 15:38:58 EEST 2024
On 6/25/2024 7:25 AM, Anton Khirnov wrote:
> Quoting James Almer (2024-05-31 01:22:51)
>> @@ -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);
>
> If I'm reading it right, this new option now applies only to decoder
> cropping (breaking syntax, because AVOptions always take an argument),
> while container cropping is always applied unconditionally.
>
> That seems wrong.
Yeah, for some reason i missed a "* !!ds->apply_cropping" next to the
IFILTER_FLAG_CROP above. With it container cropping is applied depending
on the value of apply_cropping.
And how can i work around the ffmpeg option shadowing the avcodec one of
the same name? Using a different name for container cropping option
exclusively in ffmpeg is not really nice for the user. They either care
about cropping no matter the source, or no cropping.
More information about the ffmpeg-devel
mailing list