Daniel Verkamp <dan...@drv.nu> added the comment:
Attached patch fixes the issue in the FLV muxer and the equivalent
problem in the demuxer.
Tested with the Windows Flash browser plugin - unsigned sounds correct,
signed does not.
_____________________________________________________
FFmpeg issue tracker <iss...@roundup.ffmpeg.org>
<https://roundup.ffmpeg.org/roundup/ffmpeg/issue1569>
_____________________________________________________
>From dc1fc04a56b5c9baa770f481a6f26de2151002db Mon Sep 17 00:00:00 2001
From: Daniel Verkamp <dan...@drv.nu>
Date: Sun, 13 Dec 2009 04:45:57 -0500
Subject: [PATCH] FLV 8-bit PCM is unsigned, not signed
Fixes issue #1569
---
libavformat/flvdec.c | 4 ++--
libavformat/flvenc.c | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index 2be5e2d..9c43149 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -50,7 +50,7 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream
*astream, int flv_c
switch(flv_codecid) {
//no distinction between S16 and S8 PCM codec flags
case FLV_CODECID_PCM:
- acodec->codec_id = acodec->bits_per_coded_sample == 8 ?
CODEC_ID_PCM_S8 :
+ acodec->codec_id = acodec->bits_per_coded_sample == 8 ?
CODEC_ID_PCM_U8 :
#if HAVE_BIGENDIAN
CODEC_ID_PCM_S16BE;
#else
@@ -58,7 +58,7 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream
*astream, int flv_c
#endif
break;
case FLV_CODECID_PCM_LE:
- acodec->codec_id = acodec->bits_per_coded_sample == 8 ?
CODEC_ID_PCM_S8 : CODEC_ID_PCM_S16LE; break;
+ acodec->codec_id = acodec->bits_per_coded_sample == 8 ?
CODEC_ID_PCM_U8 : CODEC_ID_PCM_S16LE; break;
case FLV_CODECID_AAC : acodec->codec_id = CODEC_ID_AAC;
break;
case FLV_CODECID_ADPCM: acodec->codec_id = CODEC_ID_ADPCM_SWF;
break;
case FLV_CODECID_SPEEX:
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index ce8f565..c255ff0 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -38,7 +38,7 @@ static const AVCodecTag flv_video_codec_ids[] = {
static const AVCodecTag flv_audio_codec_ids[] = {
{CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET},
- {CODEC_ID_PCM_S8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_PCM_U8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET},
{CODEC_ID_PCM_S16BE, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET},
{CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET},
{CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET},
@@ -107,7 +107,7 @@ static int get_audio_flags(AVCodecContext *enc){
case CODEC_ID_MP3:
flags |= FLV_CODECID_MP3 | FLV_SAMPLESSIZE_16BIT;
break;
- case CODEC_ID_PCM_S8:
+ case CODEC_ID_PCM_U8:
flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_8BIT;
break;
case CODEC_ID_PCM_S16BE:
@@ -248,7 +248,7 @@ static int flv_write_header(AVFormatContext *s)
put_amf_double(pb, audio_enc->sample_rate);
put_amf_string(pb, "audiosamplesize");
- put_amf_double(pb, audio_enc->codec_id == CODEC_ID_PCM_S8 ? 8 : 16);
+ put_amf_double(pb, audio_enc->codec_id == CODEC_ID_PCM_U8 ? 8 : 16);
put_amf_string(pb, "stereo");
put_amf_bool(pb, audio_enc->channels == 2);
--
1.6.5.2