From 1d390247c1e9bd95288d3679adeb9400399fdf0f Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Fri, 8 May 2020 09:40:20 +0900 Subject: [PATCH] Format WAV cleanup Change-Id: I9d22133e4dc7f49bb4cbc227cf56ab9132b35345 Signed-off-by: Minje Ahn --- formats/ffmpeg/mm_file_format_wav.c | 359 ++++++++++++++++-------------------- 1 file changed, 154 insertions(+), 205 deletions(-) diff --git a/formats/ffmpeg/mm_file_format_wav.c b/formats/ffmpeg/mm_file_format_wav.c index 979d224..151d9a6 100755 --- a/formats/ffmpeg/mm_file_format_wav.c +++ b/formats/ffmpeg/mm_file_format_wav.c @@ -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; - -} - - -- 2.7.4