You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/mlpdec: relax channels checking
Internal TrueHD decoder channel rematrix can mix 2 stereo substreams into single mono stream. Fixes #1726
This commit is contained in:
		| @@ -425,6 +425,7 @@ static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb) | |||||||
|                         mh.stream_type); |                         mh.stream_type); | ||||||
|             return AVERROR_PATCHWELCOME; |             return AVERROR_PATCHWELCOME; | ||||||
|         } |         } | ||||||
|  |         m->substream[1].mask = mh.channel_layout_thd_stream1; | ||||||
|         if (mh.channels_thd_stream1 == 2 && |         if (mh.channels_thd_stream1 == 2 && | ||||||
|             mh.channels_thd_stream2 == 2 && |             mh.channels_thd_stream2 == 2 && | ||||||
|             m->avctx->ch_layout.nb_channels == 2) |             m->avctx->ch_layout.nb_channels == 2) | ||||||
| @@ -438,16 +439,6 @@ static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb) | |||||||
|                 m->substream[2].mask = mh.channel_layout_thd_stream1; |                 m->substream[2].mask = mh.channel_layout_thd_stream1; | ||||||
|         if (m->avctx->ch_layout.nb_channels > 2) |         if (m->avctx->ch_layout.nb_channels > 2) | ||||||
|             m->substream[mh.num_substreams > 1].mask = mh.channel_layout_thd_stream1; |             m->substream[mh.num_substreams > 1].mask = mh.channel_layout_thd_stream1; | ||||||
|  |  | ||||||
|         if (m->avctx->ch_layout.nb_channels <= 2 && |  | ||||||
|             m->substream[substr].mask == AV_CH_LAYOUT_MONO && m->max_decoded_substream == 1) { |  | ||||||
|             av_log(m->avctx, AV_LOG_DEBUG, "Mono stream with 2 substreams, ignoring 2nd\n"); |  | ||||||
|             m->max_decoded_substream = 0; |  | ||||||
|             if (m->avctx->ch_layout.nb_channels == 2) { |  | ||||||
|                 av_channel_layout_uninit(&m->avctx->ch_layout); |  | ||||||
|                 m->avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     m->needs_reordering = mh.channel_arrangement >= 18 && mh.channel_arrangement <= 20; |     m->needs_reordering = mh.channel_arrangement >= 18 && mh.channel_arrangement <= 20; | ||||||
| @@ -541,12 +532,6 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, | |||||||
|         return AVERROR_INVALIDDATA; |         return AVERROR_INVALIDDATA; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (max_channel != max_matrix_channel) { |  | ||||||
|         av_log(m->avctx, AV_LOG_ERROR, |  | ||||||
|                "Max channel must be equal max matrix channel.\n"); |  | ||||||
|         return AVERROR_INVALIDDATA; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* This should happen for TrueHD streams with >6 channels and MLP's noise |     /* This should happen for TrueHD streams with >6 channels and MLP's noise | ||||||
|      * type. It is not yet known if this is allowed. */ |      * type. It is not yet known if this is allowed. */ | ||||||
|     if (max_channel > MAX_MATRIX_CHANNEL_MLP && !noise_type) { |     if (max_channel > MAX_MATRIX_CHANNEL_MLP && !noise_type) { | ||||||
| @@ -557,12 +542,6 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, | |||||||
|         return AVERROR_PATCHWELCOME; |         return AVERROR_PATCHWELCOME; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (min_channel > max_channel) { |  | ||||||
|         av_log(m->avctx, AV_LOG_ERROR, |  | ||||||
|                "Substream min channel cannot be greater than max channel.\n"); |  | ||||||
|         return AVERROR_INVALIDDATA; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     s->min_channel        = min_channel; |     s->min_channel        = min_channel; | ||||||
|     s->max_channel        = max_channel; |     s->max_channel        = max_channel; | ||||||
|     s->coded_channels     = ((1LL << (max_channel - min_channel + 1)) - 1) << min_channel; |     s->coded_channels     = ((1LL << (max_channel - min_channel + 1)) - 1) << min_channel; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user