decoder/ffmpeg: fix playback of planar PCM data
Interleaving was completely wrong. This code was never used, so it didn't have an effect.
This commit is contained in:
		| @@ -236,12 +236,16 @@ time_to_ffmpeg(double t, const AVRational time_base) | ||||
| #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,25,0) | ||||
|  | ||||
| static void | ||||
| copy_interleave_frame2(uint8_t *dest, const uint8_t *const*src, | ||||
| 		       unsigned nchannels, size_t plane_size) | ||||
| copy_interleave_frame2(uint8_t *dest, uint8_t **src, | ||||
| 		       unsigned nframes, unsigned nchannels, | ||||
| 		       unsigned sample_size) | ||||
| { | ||||
| 	for (unsigned channel = 0; channel < nchannels; ++channel) { | ||||
| 		memcpy(dest, src[channel], plane_size); | ||||
| 		dest += plane_size; | ||||
| 	for (unsigned frame = 0; frame < nframes; ++frame) { | ||||
| 		for (unsigned channel = 0; channel < nchannels; ++channel) { | ||||
| 			memcpy(dest, src[channel] + frame * sample_size, | ||||
| 			       sample_size); | ||||
| 			dest += sample_size; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -265,9 +269,10 @@ copy_interleave_frame(const AVCodecContext *codec_context, | ||||
|  | ||||
| 	if (av_sample_fmt_is_planar(codec_context->sample_fmt) && | ||||
| 	    codec_context->channels > 1) { | ||||
| 		copy_interleave_frame2(buffer, | ||||
| 				       (const uint8_t *const*)frame->extended_data, | ||||
| 				       codec_context->channels, plane_size); | ||||
| 		copy_interleave_frame2(buffer, frame->extended_data, | ||||
| 				       frame->nb_samples, | ||||
| 				       codec_context->channels, | ||||
| 				       av_get_bytes_per_sample(codec_context->sample_fmt)); | ||||
| 	} else { | ||||
| 		memcpy(buffer, frame->extended_data[0], data_size); | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann