} 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;
formatContext->videoTotalTrackNum = 0;
formatContext->audioTotalTrackNum = 1;
-
formatContext->privateFormatData = NULL;
return MMFILE_FORMAT_SUCCESS;
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 */
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;
-
-}
-
-