avformat/rpl: Support files containing 8 bit PCM or VIDC audio
authorCameron Cawley <ccawley2011@gmail.com>
Fri, 12 Oct 2018 23:06:40 +0000 (00:06 +0100)
committerPaul B Mahol <onemda@gmail.com>
Fri, 26 Oct 2018 11:39:25 +0000 (13:39 +0200)
Signed-off-by: Cameron Cawley <ccawley2011@gmail.com>
libavformat/rpl.c

index d37360047860073b44d18d921eb400187222e1a2..6b45b35c3087286d9e14da2a259bc7e2cad33cb6 100644 (file)
@@ -119,6 +119,8 @@ static int rpl_read_header(AVFormatContext *s)
     AVStream *vst = NULL, *ast = NULL;
     int total_audio_size;
     int error = 0;
     AVStream *vst = NULL, *ast = NULL;
     int total_audio_size;
     int error = 0;
+    const char *endptr;
+    char audio_type[RPL_LINE_LENGTH];
 
     uint32_t i;
 
 
     uint32_t i;
 
@@ -188,7 +190,9 @@ static int rpl_read_header(AVFormatContext *s)
         ast->codecpar->codec_tag       = audio_format;
         ast->codecpar->sample_rate     = read_line_and_int(pb, &error);  // audio bitrate
         ast->codecpar->channels        = read_line_and_int(pb, &error);  // number of audio channels
         ast->codecpar->codec_tag       = audio_format;
         ast->codecpar->sample_rate     = read_line_and_int(pb, &error);  // audio bitrate
         ast->codecpar->channels        = read_line_and_int(pb, &error);  // number of audio channels
-        ast->codecpar->bits_per_coded_sample = read_line_and_int(pb, &error);  // audio bits per sample
+        error |= read_line(pb, line, sizeof(line));
+        ast->codecpar->bits_per_coded_sample = read_int(line, &endptr, &error);  // audio bits per sample
+        strcpy(audio_type, endptr);
         // At least one sample uses 0 for ADPCM, which is really 4 bits
         // per sample.
         if (ast->codecpar->bits_per_coded_sample == 0)
         // At least one sample uses 0 for ADPCM, which is really 4 bits
         // per sample.
         if (ast->codecpar->bits_per_coded_sample == 0)
@@ -205,6 +209,17 @@ static int rpl_read_header(AVFormatContext *s)
                     // 16-bit audio is always signed
                     ast->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
                     break;
                     // 16-bit audio is always signed
                     ast->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
                     break;
+                } else if (ast->codecpar->bits_per_coded_sample == 8) {
+                    if(strstr(audio_type, "unsigned") != NULL) {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_U8;
+                        break;
+                    } else if(strstr(audio_type, "linear") != NULL) {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_S8;
+                        break;
+                    } else {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_VIDC;
+                        break;
+                    }
                 }
                 // There are some other formats listed as legal per the spec;
                 // samples needed.
                 }
                 // There are some other formats listed as legal per the spec;
                 // samples needed.