Format WAV cleanup 27/232827/2
authorMinje Ahn <minje.ahn@samsung.com>
Fri, 8 May 2020 00:40:20 +0000 (09:40 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Fri, 8 May 2020 03:10:09 +0000 (12:10 +0900)
Change-Id: I9d22133e4dc7f49bb4cbc227cf56ab9132b35345
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
formats/ffmpeg/mm_file_format_wav.c

index 979d2249562ab837f3c537381e4b18f10a391e75..151d9a6d771c052e1ea90c02273f012205b29827 100755 (executable)
@@ -175,34 +175,163 @@ typedef struct {
 
 } MM_FILE_WAVE_INFO;
 
+static bool __get_fmt_subchunk_offset(MMFileIOHandle *fp, long long limit, long long *offset)
+{
+       long long fmt_offset;
+       int readed;
+       int i;
+       unsigned char buf[4];
 
-/* internal */
-static unsigned char *mmf_file_wave_get_header(char *src);
-static int mmf_file_wave_get_info(unsigned char *header, MM_FILE_WAVE_INFO *info);
+       fmt_offset = mmfile_tell(fp);
+       if (fmt_offset < 0)
+               return false;
 
+       for (i = 0; i < limit; i++) {
+               mmfile_seek(fp, fmt_offset + i, MMFILE_SEEK_SET);
+               readed = mmfile_read(fp, buf, 4);
+               mm_file_retvm_if_fails(DEBUG, readed != 4, false);
 
-/* mm plugin porting */
-int mmfile_format_read_stream_wav(MMFileFormatContext *formatContext);
-int mmfile_format_read_frame_wav(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
-int mmfile_format_read_tag_wav(MMFileFormatContext *formatContext);
-int mmfile_format_close_wav(MMFileFormatContext *formatContext);
+               if (buf[0] == 'f' && buf[1] == 'm' && buf[2] == 't' && buf[3] == ' ') {
+                       *offset = fmt_offset + i;
+                       return true;
+               }
+       }
 
+       return false;
+}
 
+static unsigned char * __mmf_file_wave_get_header(char *src)
+{
+       int                             readed = 0;
+       MMFileIOHandle  *fp = NULL;
+       long long               src_size = 0L;
+       unsigned char   *header = NULL;
+       long long               offset = 0;
+       long long               limit;
 
-int mmfile_format_open_wav(MMFileFormatContext *formatContext)
+       /*open*/
+       mm_file_retvm_if_fails(DEBUG, mmfile_open(&fp, src, MMFILE_RDONLY) == MMFILE_UTIL_SUCCESS, NULL);
+
+       /*get file size*/
+       src_size = mmfile_get_size(fp);
+       if (src_size < MMF_FILE_WAVE_HEADER_LEN) {
+               debug_error(DEBUG, "header is too small.\n");
+               goto failed;
+       }
+
+       header = g_malloc0(MMF_FILE_WAVE_HEADER_LEN);
+
+       /*read chunk data*/
+       readed = mmfile_read(fp, header, MMF_FILE_WAVE_CHUNK_LEN);
+       if (readed != MMF_FILE_WAVE_CHUNK_LEN) {
+               debug_error(DEBUG, "read error. size = %d\n", readed);
+               goto failed;
+       }
+
+       /*search 'fmt ' sub chunk*/
+       limit = (src_size - MMF_FILE_WAVE_HEADER_LEN > 10240 ? 10240 : src_size - MMF_FILE_WAVE_HEADER_LEN);
+       if (!__get_fmt_subchunk_offset(fp, limit, &offset)) {
+               debug_error(DEBUG, "failed to search 'fmt ' chunk\n");
+               goto failed;
+       }
+
+       debug_msg(RELEASE, "fmt offset: %lld\n", offset);
+
+       mmfile_seek(fp, offset, MMFILE_SEEK_SET);
+
+       /*read sub chunk data*/
+       readed = mmfile_read(fp, header + MMF_FILE_WAVE_CHUNK_LEN, MMF_FILE_WAVE_SUBCHUNK_LEN);
+       if (readed != MMF_FILE_WAVE_SUBCHUNK_LEN) {
+               debug_error(DEBUG, "read error. size = %d\n", readed);
+               goto failed;
+       }
+
+       mmfile_close(fp);
+
+       return header;
+
+failed:
+       mmfile_free(header);
+       mmfile_close(fp);
+
+       return NULL;
+}
+
+#ifdef __MMFILE_TEST_MODE__
+static const char * _dump_codec_name(short codec)
 {
-       int ret = 0;
+       int sz = sizeof(g_audio_cdc_tbl) / sizeof(MMF_FILE_WAVE_CODEC_NAME);
+       int i;
 
-       if (NULL == formatContext) {
-               debug_error(DEBUG, "formatContext is NULL\n");
-               return MMFILE_FORMAT_FAIL;
+       for (i = 0; i < sz; i++) {
+               if (g_audio_cdc_tbl[i].codec == codec)
+                       return g_audio_cdc_tbl[i].name;
        }
 
-       ret = MMFileFormatIsValidWAV(NULL, formatContext->uriFileName, 0);
-       if (ret == 0) {
-               debug_error(DEBUG, "It is not wav file\n");
+       return NULL;
+}
+#endif
+
+static int __mmf_file_wave_get_info(unsigned char *header, MM_FILE_WAVE_INFO *info)
+{
+       if (!header || !info)
                return MMFILE_FORMAT_FAIL;
-       }
+
+       /*get chunk size*/
+       info->size = *((int *)(header + 4));
+
+       /*get format*/
+       info->format = *((short *)(header + 20));
+
+       /*get channel*/
+       info->channel = *((short *)(header + 22));
+
+       /*get sampling-rate*/
+       info->sample_rate = *((int *)(header + 24));
+
+       /*get byte rate*/
+       info->byte_rate = *((int *)(header + 28));
+
+       /*get byte align*/
+       info->block_align = *((short *)(header + 32));
+
+       /*get bits per sample*/
+       info->bits_per_sample = *((short *)(header + 34));
+
+       info->size                              = mmfile_io_le_int32(info->size);
+       info->format                    = mmfile_io_le_int16(info->format);
+       info->channel                   = mmfile_io_le_int16(info->channel);
+       info->sample_rate               = mmfile_io_le_int32(info->sample_rate);
+       info->byte_rate                 = mmfile_io_le_int32(info->byte_rate);
+       info->block_align               = mmfile_io_le_int16(info->block_align);
+       info->bits_per_sample   = mmfile_io_le_int16(info->bits_per_sample);
+
+#ifdef __MMFILE_TEST_MODE__
+       debug_msg(RELEASE, "----------------------------------------------\n");
+       debug_msg(RELEASE, "chunk size: %d\n", info->size);
+       debug_msg(RELEASE, "WAVE form Registration Number: 0x%04X\n", info->format);
+       debug_msg(RELEASE, "WAVE form wFormatTag ID: %s\n", _dump_codec_name(info->format));
+       debug_msg(RELEASE, "channel: %d\n", info->channel);
+       debug_msg(RELEASE, "sampling-rate: %d\n", info->sample_rate);
+       debug_msg(RELEASE, "byte-rate: %d\n", info->byte_rate);
+       debug_msg(RELEASE, "byte align: %d\n", info->block_align);
+       debug_msg(RELEASE, "bit per sample: %d\n", info->bits_per_sample);
+       debug_msg(RELEASE, "----------------------------------------------\n");
+#endif
+
+       return MMFILE_FORMAT_SUCCESS;
+}
+
+/* mm plugin porting */
+int mmfile_format_read_stream_wav(MMFileFormatContext *formatContext);
+int mmfile_format_read_frame_wav(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
+int mmfile_format_read_tag_wav(MMFileFormatContext *formatContext);
+int mmfile_format_close_wav(MMFileFormatContext *formatContext);
+
+int mmfile_format_open_wav(MMFileFormatContext *formatContext)
+{
+       mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
+       mm_file_retvm_if_fails(DEBUG, MMFileFormatIsValidWAV(NULL, formatContext->uriFileName, 0), MMFILE_FORMAT_FAIL);
 
        formatContext->ReadStream   = mmfile_format_read_stream_wav;
        formatContext->ReadFrame    = mmfile_format_read_frame_wav;
@@ -211,7 +340,6 @@ int mmfile_format_open_wav(MMFileFormatContext *formatContext)
 
        formatContext->videoTotalTrackNum = 0;
        formatContext->audioTotalTrackNum = 1;
-
        formatContext->privateFormatData = NULL;
 
        return MMFILE_FORMAT_SUCCESS;
@@ -219,42 +347,37 @@ int mmfile_format_open_wav(MMFileFormatContext *formatContext)
 
 static bool __check_uhqa(int sample_rate,  short bits_per_sample)
 {
-       bool ret = FALSE;
-
        debug_error(RELEASE, "[sample rate %d, sample format %d]", sample_rate, bits_per_sample);
 
        if ((sample_rate >= 44100) && (bits_per_sample >= 24)) {
                debug_msg(RELEASE, "UHQA CONTENT");
-               ret = TRUE;
-       } else {
-               ret = FALSE;
+               return true;
        }
 
-       return ret;
+       return false;
 }
 
-
 int mmfile_format_read_stream_wav(MMFileFormatContext *formatContext)
 {
        unsigned char *header = NULL;
        MM_FILE_WAVE_INFO *waveinfo = NULL;
        long long     filesize = 0;
        MMFileIOHandle *fp = NULL;
-       int ret = 0;
+       int ret = MMFILE_FORMAT_FAIL;
 
        mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
 
-       header = mmf_file_wave_get_header(formatContext->uriFileName);
+       header = __mmf_file_wave_get_header(formatContext->uriFileName);
        mm_file_retvm_if_fails(DEBUG, header, MMFILE_FORMAT_FAIL);
 
        waveinfo = g_new0(MM_FILE_WAVE_INFO, 1);
 
-       ret = mmf_file_wave_get_info(header, waveinfo);
+       ret = __mmf_file_wave_get_info(header, waveinfo);
        mmfile_free(header);
-       if (ret == -1) {
+       if (ret == MMFILE_FORMAT_FAIL) {
                debug_error(DEBUG, "error: mmf_file_wave_get_info\n");
                mmfile_free(waveinfo);
-               return MMFILE_FORMAT_FAIL;
+               return ret;
        }
 
        /* Get file size. because sometimes waveinfo->size is wrong */
@@ -309,195 +432,21 @@ int mmfile_format_read_stream_wav(MMFileFormatContext *formatContext)
        return MMFILE_FORMAT_SUCCESS;
 }
 
-
-
 int mmfile_format_read_frame_wav(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame)
 {
        return MMFILE_FORMAT_SUCCESS;
 }
 
-
-
 int mmfile_format_read_tag_wav(MMFileFormatContext *formatContext)
 {
        return MMFILE_FORMAT_SUCCESS;
 }
 
-
-
 int mmfile_format_close_wav(MMFileFormatContext *formatContext)
 {
-       if (formatContext == NULL) {
-               debug_error(DEBUG, "formatContext is NULL\n");
-               return MMFILE_FORMAT_FAIL;
-       }
-
+       mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
        mmfile_free(formatContext->privateFormatData);
 
        return MMFILE_FORMAT_SUCCESS;
 }
 
-#ifdef __MMFILE_TEST_MODE__
-static const char *
-_dump_codec_name(short codec)
-{
-       int sz = sizeof(g_audio_cdc_tbl) / sizeof(MMF_FILE_WAVE_CODEC_NAME);
-       int i;
-
-       for (i = 0; i < sz; i++) {
-               if (g_audio_cdc_tbl[i].codec == codec) {
-                       return g_audio_cdc_tbl[i].name;
-               }
-       }
-
-       return NULL;
-}
-#endif
-
-static int _get_fmt_subchunk_offset(MMFileIOHandle *fp, long long limit, long long *offset)
-{
-       long long fmt_offset;
-       int readed;
-       int i;
-       unsigned char buf[4];
-
-       fmt_offset = mmfile_tell(fp);
-       if (fmt_offset < 0)
-               return 0;
-
-       for (i = 0; i < limit; i++) {
-               mmfile_seek(fp, fmt_offset + i, MMFILE_SEEK_SET);
-               readed = mmfile_read(fp, buf, 4);
-               if (readed != 4) {
-                       debug_error(DEBUG, "failed to read. size = %d\n", readed);
-                       return 0;
-               }
-
-               if (buf[0] == 'f' && buf[1] == 'm' && buf[2] == 't' && buf[3] == ' ') {
-                       *offset = fmt_offset + i;
-                       return 1;
-               }
-       }
-
-       return 0;
-}
-
-static unsigned char *
-mmf_file_wave_get_header(char *src)
-{
-       int                             readed = 0;
-       MMFileIOHandle  *fp = NULL;
-       int                             ret = 0;
-       long long               src_size = 0L;
-       unsigned char   *header = NULL;
-       long long               offset = 0;
-       long long               limit;
-
-       header = g_malloc0(MMF_FILE_WAVE_HEADER_LEN);
-
-       /*open*/
-       ret = mmfile_open(&fp, src, MMFILE_RDONLY);
-       if (ret == MMFILE_UTIL_FAIL) {
-               debug_error(DEBUG, "open failed.\n");
-               goto failed;
-       }
-
-
-       /*get file size*/
-       src_size = mmfile_get_size(fp);
-       if (src_size < MMF_FILE_WAVE_HEADER_LEN) {
-               debug_error(DEBUG, "header is too small.\n");
-               goto failed;
-       }
-
-       /*read chunk data*/
-       readed = mmfile_read(fp, header, MMF_FILE_WAVE_CHUNK_LEN);
-       if (readed != MMF_FILE_WAVE_CHUNK_LEN) {
-               debug_error(DEBUG, "read error. size = %d\n", readed);
-               goto failed;
-       }
-
-       /*seach 'fmt ' sub chunk*/
-       limit = (src_size - MMF_FILE_WAVE_HEADER_LEN > 10240 ? 10240 : src_size - MMF_FILE_WAVE_HEADER_LEN);
-       ret = _get_fmt_subchunk_offset(fp, limit, &offset);
-       if (ret == 0) {
-               debug_error(DEBUG, "failed to seach 'fmt ' chunk\n");
-               goto failed;
-       }
-
-       debug_msg(RELEASE, "fmt offset: %lld\n", offset);
-
-       mmfile_seek(fp, offset, MMFILE_SEEK_SET);
-
-       /*read sub chunk data*/
-       readed = mmfile_read(fp, header + MMF_FILE_WAVE_CHUNK_LEN, MMF_FILE_WAVE_SUBCHUNK_LEN);
-       if (readed != MMF_FILE_WAVE_SUBCHUNK_LEN) {
-               debug_error(DEBUG, "read error. size = %d\n", readed);
-               goto failed;
-       }
-
-       mmfile_close(fp);
-
-       return header;
-
-failed:
-       mmfile_free(header);
-       mmfile_close(fp);
-
-       return NULL;
-}
-
-static int
-mmf_file_wave_get_info(unsigned char *header, MM_FILE_WAVE_INFO *info)
-{
-       if (!header || !info) {
-               return -1;
-       }
-
-       /*get chunk size*/
-       info->size = *((int *)(header + 4));
-
-       /*get format*/
-       info->format = *((short *)(header + 20));
-
-       /*get channel*/
-       info->channel = *((short *)(header + 22));
-
-       /*get sampling-rate*/
-       info->sample_rate = *((int *)(header + 24));
-
-       /*get byte rate*/
-       info->byte_rate = *((int *)(header + 28));
-
-       /*get byte align*/
-       info->block_align = *((short *)(header + 32));
-
-       /*get bits per sample*/
-       info->bits_per_sample = *((short *)(header + 34));
-
-       info->size                              = mmfile_io_le_int32(info->size);
-       info->format                    = mmfile_io_le_int16(info->format);
-       info->channel                   = mmfile_io_le_int16(info->channel);
-       info->sample_rate               = mmfile_io_le_int32(info->sample_rate);
-       info->byte_rate                 = mmfile_io_le_int32(info->byte_rate);
-       info->block_align               = mmfile_io_le_int16(info->block_align);
-       info->bits_per_sample   = mmfile_io_le_int16(info->bits_per_sample);
-
-#ifdef __MMFILE_TEST_MODE__
-       debug_msg(RELEASE, "----------------------------------------------\n");
-       debug_msg(RELEASE, "chunk size: %d\n", info->size);
-       debug_msg(RELEASE, "WAVE form Registration Number: 0x%04X\n", info->format);
-       debug_msg(RELEASE, "WAVE form wFormatTag ID: %s\n", _dump_codec_name(info->format));
-       debug_msg(RELEASE, "channel: %d\n", info->channel);
-       debug_msg(RELEASE, "sampling-rate: %d\n", info->sample_rate);
-       debug_msg(RELEASE, "byte-rate: %d\n", info->byte_rate);
-       debug_msg(RELEASE, "byte align: %d\n", info->block_align);
-       debug_msg(RELEASE, "bit per sample: %d\n", info->bits_per_sample);
-       debug_msg(RELEASE, "----------------------------------------------\n");
-#endif
-
-       return 0;
-
-}
-
-