You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	flac: convert to new channel layout API
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
		
				
					committed by
					
						 James Almer
						James Almer
					
				
			
			
				
	
			
			
			
						parent
						
							06431f1997
						
					
				
				
					commit
					5e257c1f7b
				
			| @@ -29,15 +29,15 @@ | ||||
|  | ||||
| static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 }; | ||||
|  | ||||
| static const uint64_t flac_channel_layouts[8] = { | ||||
|     AV_CH_LAYOUT_MONO, | ||||
|     AV_CH_LAYOUT_STEREO, | ||||
|     AV_CH_LAYOUT_SURROUND, | ||||
|     AV_CH_LAYOUT_QUAD, | ||||
|     AV_CH_LAYOUT_5POINT0, | ||||
|     AV_CH_LAYOUT_5POINT1, | ||||
|     AV_CH_LAYOUT_6POINT1, | ||||
|     AV_CH_LAYOUT_7POINT1 | ||||
| static const AVChannelLayout flac_channel_layouts[8] = { | ||||
|     AV_CHANNEL_LAYOUT_MONO, | ||||
|     AV_CHANNEL_LAYOUT_STEREO, | ||||
|     AV_CHANNEL_LAYOUT_SURROUND, | ||||
|     AV_CHANNEL_LAYOUT_QUAD, | ||||
|     AV_CHANNEL_LAYOUT_5POINT0, | ||||
|     AV_CHANNEL_LAYOUT_5POINT1, | ||||
|     AV_CHANNEL_LAYOUT_6POINT1, | ||||
|     AV_CHANNEL_LAYOUT_7POINT1 | ||||
| }; | ||||
|  | ||||
| static int64_t get_utf8(GetBitContext *gb) | ||||
| @@ -193,12 +193,18 @@ int ff_flac_is_extradata_valid(AVCodecContext *avctx, | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| void ff_flac_set_channel_layout(AVCodecContext *avctx) | ||||
| void ff_flac_set_channel_layout(AVCodecContext *avctx, int channels) | ||||
| { | ||||
|     if (avctx->channels <= FF_ARRAY_ELEMS(flac_channel_layouts)) | ||||
|         avctx->channel_layout = flac_channel_layouts[avctx->channels - 1]; | ||||
|     if (channels == avctx->ch_layout.nb_channels && | ||||
|         avctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) | ||||
|         return; | ||||
|  | ||||
|     av_channel_layout_uninit(&avctx->ch_layout); | ||||
|     if (channels <= FF_ARRAY_ELEMS(flac_channel_layouts)) | ||||
|         avctx->ch_layout = flac_channel_layouts[channels - 1]; | ||||
|     else | ||||
|         avctx->channel_layout = 0; | ||||
|         avctx->ch_layout = (AVChannelLayout){ .order = AV_CHANNEL_ORDER_UNSPEC, | ||||
|                                               .nb_channels = channels }; | ||||
| } | ||||
|  | ||||
| int ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, | ||||
| @@ -229,13 +235,9 @@ int ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, | ||||
|         return AVERROR_INVALIDDATA; | ||||
|     } | ||||
|  | ||||
|     avctx->channels = s->channels; | ||||
|     avctx->sample_rate = s->samplerate; | ||||
|     avctx->bits_per_raw_sample = s->bps; | ||||
|  | ||||
|     if (!avctx->channel_layout || | ||||
|         av_get_channel_layout_nb_channels(avctx->channel_layout) != avctx->channels) | ||||
|         ff_flac_set_channel_layout(avctx); | ||||
|     ff_flac_set_channel_layout(avctx, s->channels); | ||||
|  | ||||
|     s->samples = get_bits64(&gb, 36); | ||||
|  | ||||
|   | ||||
| @@ -131,7 +131,7 @@ int ff_flac_get_max_frame_size(int blocksize, int ch, int bps); | ||||
| int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, | ||||
|                                 FLACFrameInfo *fi, int log_level_offset); | ||||
|  | ||||
| void ff_flac_set_channel_layout(AVCodecContext *avctx); | ||||
| void ff_flac_set_channel_layout(AVCodecContext *avctx, int channels); | ||||
|  | ||||
| /** | ||||
|  * Parse the metadata block parameters from the header. | ||||
|   | ||||
| @@ -628,11 +628,8 @@ static int get_best_header(FLACParseContext *fpc, const uint8_t **poutbuf, | ||||
|         check_header_mismatch(fpc, header, child, 0); | ||||
|     } | ||||
|  | ||||
|     if (header->fi.channels != fpc->avctx->channels || | ||||
|         !fpc->avctx->channel_layout) { | ||||
|         fpc->avctx->channels = header->fi.channels; | ||||
|         ff_flac_set_channel_layout(fpc->avctx); | ||||
|     } | ||||
|     ff_flac_set_channel_layout(fpc->avctx, header->fi.channels); | ||||
|  | ||||
|     fpc->avctx->sample_rate = header->fi.samplerate; | ||||
|     fpc->pc->duration       = header->fi.blocksize; | ||||
|     *poutbuf = flac_fifo_read_wrap(fpc, header->offset, *poutbuf_size, | ||||
|   | ||||
| @@ -483,15 +483,14 @@ static int decode_frame(FLACContext *s) | ||||
|     if (   s->flac_stream_info.channels | ||||
|         && fi.channels != s->flac_stream_info.channels | ||||
|         && s->got_streaminfo) { | ||||
|         s->flac_stream_info.channels = s->avctx->channels = fi.channels; | ||||
|         ff_flac_set_channel_layout(s->avctx); | ||||
|         s->flac_stream_info.channels = fi.channels; | ||||
|         ff_flac_set_channel_layout(s->avctx, fi.channels); | ||||
|         ret = allocate_buffers(s); | ||||
|         if (ret < 0) | ||||
|             return ret; | ||||
|     } | ||||
|     s->flac_stream_info.channels = s->avctx->channels = fi.channels; | ||||
|     if (!s->avctx->channel_layout) | ||||
|         ff_flac_set_channel_layout(s->avctx); | ||||
|     s->flac_stream_info.channels = fi.channels; | ||||
|     ff_flac_set_channel_layout(s->avctx, fi.channels); | ||||
|     s->ch_mode = fi.ch_mode; | ||||
|  | ||||
|     if (!s->flac_stream_info.bps && !fi.bps) { | ||||
|   | ||||
| @@ -241,7 +241,7 @@ static av_cold void dprint_compression_options(FlacEncodeContext *s) | ||||
| static av_cold int flac_encode_init(AVCodecContext *avctx) | ||||
| { | ||||
|     int freq = avctx->sample_rate; | ||||
|     int channels = avctx->channels; | ||||
|     int channels = avctx->ch_layout.nb_channels; | ||||
|     FlacEncodeContext *s = avctx->priv_data; | ||||
|     int i, level, ret; | ||||
|     uint8_t *streaminfo; | ||||
| @@ -398,18 +398,18 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) | ||||
|     s->frame_count   = 0; | ||||
|     s->min_framesize = s->max_framesize; | ||||
|  | ||||
|     if (channels == 3 && | ||||
|             avctx->channel_layout != (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) || | ||||
|         channels == 4 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_2_2 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_QUAD || | ||||
|         channels == 5 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_5POINT0 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_5POINT0_BACK || | ||||
|         channels == 6 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_5POINT1 && | ||||
|             avctx->channel_layout != AV_CH_LAYOUT_5POINT1_BACK) { | ||||
|         if (avctx->channel_layout) { | ||||
|     if ((channels == 3 && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND)) || | ||||
|         (channels == 4 && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_2_2) && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_QUAD)) || | ||||
|         (channels == 5 && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0) && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0_BACK)) || | ||||
|         (channels == 6 && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1) && | ||||
|          av_channel_layout_compare(&avctx->ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))) { | ||||
|         if (avctx->ch_layout.order != AV_CHANNEL_ORDER_UNSPEC) { | ||||
|             av_log(avctx, AV_LOG_ERROR, "Channel layout not supported by Flac, " | ||||
|                                              "output stream will have incorrect " | ||||
|                                              "channel layout.\n"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user