[FFmpeg-devel] [PATCH v3] ffmpeg_opt: restore documented stream selection behaviour
Gyan Doshi
ffmpeg at gyani.pro
Sun Aug 1 07:22:27 EEST 2021
Pushed as c50f5460d2f059e5be393eac90e4eac55a6034c6
On 2021-07-31 09:32, Gyan Doshi wrote:
> Plan to push tomorrow.
>
> On 2021-07-29 10:14, Gyan Doshi wrote:
>> 11d3b03fcb added consideration of default stream disposition for audio
>> and video when choosing the 'best' stream among all the inputs. This can
>> lead to video streams with lower resolution or audio streams with fewer
>> channels being selected.
>>
>> Stream disposition, however, only sets a priority for a stream
>> among all other streams in the *same input*. It cannot set a priority
>> for a stream across all inputs.
>>
>> This patch sets a middle-way and selects the best stream from each file
>> with default disposition considered. Then it discards disposition weight
>> and selects best stream as per the original criteria of highest
>> resolution for video and most channels for audio.
>> ---
>> fftools/ffmpeg_opt.c | 77 ++++++++++++++++++++++++++++----------------
>> 1 file changed, 50 insertions(+), 27 deletions(-)
>>
>> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
>> index 1b43bab9fc..34cc6c4fd3 100644
>> --- a/fftools/ffmpeg_opt.c
>> +++ b/fftools/ffmpeg_opt.c
>> @@ -2260,23 +2260,35 @@ static int open_output_file(OptionsContext
>> *o, const char *filename)
>> if (!o->video_disable && av_guess_codec(oc->oformat, NULL,
>> filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
>> int best_score = 0, idx = -1;
>> int qcr = avformat_query_codec(oc->oformat,
>> oc->oformat->video_codec, 0);
>> - for (i = 0; i < nb_input_streams; i++) {
>> - int score;
>> - ist = input_streams[i];
>> - score = ist->st->codecpar->width *
>> ist->st->codecpar->height
>> - + 100000000 * !!(ist->st->event_flags &
>> AVSTREAM_EVENT_FLAG_NEW_PACKETS)
>> - + 5000000*!!(ist->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> - if (ist->user_set_discard == AVDISCARD_ALL)
>> - continue;
>> - if((qcr!=MKTAG('A', 'P', 'I', 'C')) &&
>> (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
>> - score = 1;
>> - if (ist->st->codecpar->codec_type ==
>> AVMEDIA_TYPE_VIDEO &&
>> - score > best_score) {
>> - if((qcr==MKTAG('A', 'P', 'I', 'C')) &&
>> !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
>> + for (j = 0; j < nb_input_files; j++) {
>> + InputFile *ifile = input_files[j];
>> + int file_best_score = 0, file_best_idx = -1;
>> + for (i = 0; i < ifile->nb_streams; i++) {
>> + int score;
>> + ist = input_streams[ifile->ist_index + i];
>> + score = ist->st->codecpar->width *
>> ist->st->codecpar->height
>> + + 100000000 * !!(ist->st->event_flags
>> & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
>> + + 5000000*!!(ist->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> + if (ist->user_set_discard == AVDISCARD_ALL)
>> continue;
>> - best_score = score;
>> - idx = i;
>> + if((qcr!=MKTAG('A', 'P', 'I', 'C')) &&
>> (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
>> + score = 1;
>> + if (ist->st->codecpar->codec_type ==
>> AVMEDIA_TYPE_VIDEO &&
>> + score > file_best_score) {
>> + if((qcr==MKTAG('A', 'P', 'I', 'C')) &&
>> !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
>> + continue;
>> + file_best_score = score;
>> + file_best_idx = ifile->ist_index + i;
>> + }
>> }
>> + if (file_best_idx >= 0) {
>> + if((qcr == MKTAG('A', 'P', 'I', 'C')) ||
>> !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
>> + file_best_score -=
>> 5000000*!!(input_streams[file_best_idx]->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> + if (file_best_score > best_score) {
>> + best_score = file_best_score;
>> + idx = file_best_idx;
>> + }
>> + }
>> }
>> if (idx >= 0)
>> new_video_stream(o, oc, idx);
>> @@ -2285,19 +2297,30 @@ static int open_output_file(OptionsContext
>> *o, const char *filename)
>> /* audio: most channels */
>> if (!o->audio_disable && av_guess_codec(oc->oformat, NULL,
>> filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
>> int best_score = 0, idx = -1;
>> - for (i = 0; i < nb_input_streams; i++) {
>> - int score;
>> - ist = input_streams[i];
>> - score = ist->st->codecpar->channels
>> - + 100000000 * !!(ist->st->event_flags &
>> AVSTREAM_EVENT_FLAG_NEW_PACKETS)
>> - + 5000000*!!(ist->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> - if (ist->user_set_discard == AVDISCARD_ALL)
>> - continue;
>> - if (ist->st->codecpar->codec_type ==
>> AVMEDIA_TYPE_AUDIO &&
>> - score > best_score) {
>> - best_score = score;
>> - idx = i;
>> + for (j = 0; j < nb_input_files; j++) {
>> + InputFile *ifile = input_files[j];
>> + int file_best_score = 0, file_best_idx = -1;
>> + for (i = 0; i < ifile->nb_streams; i++) {
>> + int score;
>> + ist = input_streams[ifile->ist_index + i];
>> + score = ist->st->codecpar->channels
>> + + 100000000 * !!(ist->st->event_flags &
>> AVSTREAM_EVENT_FLAG_NEW_PACKETS)
>> + + 5000000*!!(ist->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> + if (ist->user_set_discard == AVDISCARD_ALL)
>> + continue;
>> + if (ist->st->codecpar->codec_type ==
>> AVMEDIA_TYPE_AUDIO &&
>> + score > file_best_score) {
>> + file_best_score = score;
>> + file_best_idx = ifile->ist_index + i;
>> + }
>> }
>> + if (file_best_idx >= 0) {
>> + file_best_score -=
>> 5000000*!!(input_streams[file_best_idx]->st->disposition &
>> AV_DISPOSITION_DEFAULT);
>> + if (file_best_score > best_score) {
>> + best_score = file_best_score;
>> + idx = file_best_idx;
>> + }
>> + }
>> }
>> if (idx >= 0)
>> new_audio_stream(o, oc, idx);
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list