lavfi/movie: force channel layout if not set by the decoder
This ensures that the output buffers will have the channel layout set, which is required by filters. Also consistent with ffmpeg.c behavior.
This commit is contained in:
		
							parent
							
								
									c809b89a12
								
							
						
					
					
						commit
						52bd9cb4d2
					
				@ -162,6 +162,29 @@ static int open_stream(void *log, MovieStream *st)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int guess_channel_layout(MovieStream *st, int st_index, void *log_ctx)
 | 
			
		||||
{
 | 
			
		||||
    AVCodecContext *dec_ctx = st->st->codec;
 | 
			
		||||
    char buf[256];
 | 
			
		||||
    int64_t chl = av_get_default_channel_layout(dec_ctx->channels);
 | 
			
		||||
 | 
			
		||||
    if (!chl) {
 | 
			
		||||
        av_log(log_ctx, AV_LOG_ERROR,
 | 
			
		||||
               "Channel layout is not set in stream %d, and could not "
 | 
			
		||||
               "be guessed from the number of channels (%d)\n",
 | 
			
		||||
               st_index, dec_ctx->channels);
 | 
			
		||||
        return AVERROR(EINVAL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_get_channel_layout_string(buf, sizeof(buf), dec_ctx->channels, chl);
 | 
			
		||||
    av_log(log_ctx, AV_LOG_WARNING,
 | 
			
		||||
           "Channel layout is not set in output stream %d, "
 | 
			
		||||
           "guessed channel layout is '%s'\n",
 | 
			
		||||
           st_index, buf);
 | 
			
		||||
    dec_ctx->channel_layout = chl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_cold int movie_init(AVFilterContext *ctx, const char *args)
 | 
			
		||||
{
 | 
			
		||||
    MovieContext *movie = ctx->priv;
 | 
			
		||||
@ -282,6 +305,12 @@ static av_cold int movie_init(AVFilterContext *ctx, const char *args)
 | 
			
		||||
        ret = open_stream(ctx, &movie->st[i]);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
        if ( movie->st[i].st->codec->codec->type == AVMEDIA_TYPE_AUDIO &&
 | 
			
		||||
            !movie->st[i].st->codec->channel_layout) {
 | 
			
		||||
            ret = guess_channel_layout(&movie->st[i], i, ctx);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(movie->frame = avcodec_alloc_frame()) ) {
 | 
			
		||||
@ -337,8 +366,7 @@ static int movie_query_formats(AVFilterContext *ctx)
 | 
			
		||||
            ff_formats_ref(ff_make_format_list(list), &outlink->in_formats);
 | 
			
		||||
            list[0] = c->sample_rate;
 | 
			
		||||
            ff_formats_ref(ff_make_format_list(list), &outlink->in_samplerates);
 | 
			
		||||
            list64[0] = c->channel_layout ? c->channel_layout :
 | 
			
		||||
                        av_get_default_channel_layout(c->channels);
 | 
			
		||||
            list64[0] = c->channel_layout;
 | 
			
		||||
            ff_channel_layouts_ref(avfilter_make_format64_list(list64),
 | 
			
		||||
                                   &outlink->in_channel_layouts);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user