#include "mm_file_format_audio.h"
#include "mm_file_format_mp3.h"
-#define __MMFILE_NEW_FRAME_FUNC
-
-#define AV_MP3_FIND_SYNC_LEN 1024*30
-#undef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
+#define MMFILE_MIN(a, b) ((a) < (b) ? (a) : (b))
static const unsigned char mp3FrameMasking[4] = {0xFF, 0xFE, 0x0C, 0x00};
static unsigned char mp3FrameDataValid[4];
int mmfile_format_close_mp3(MMFileFormatContext *formatContext);
/* internal */
-static int mmf_file_mp3_get_tag_info(char *src, AvFileContentInfo *pInfo);
-static int mmf_file_mp3_get_stream_info(char *src, AvFileContentInfo *pInfo);
-
+static bool __get_tag_info(char *src, AvFileContentInfo *pInfo);
+static bool __get_stream_info(char *src, AvFileContentInfo *pInfo);
int mmfile_format_open_mp3(MMFileFormatContext *formatContext)
{
AvFileContentInfo *privateData = NULL;;
- int ret = 0;
-
debug_fenter(RELEASE);
mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
-
- ret = MMFileFormatIsValidMP3(NULL, formatContext->uriFileName, 5);
- if (ret == 0) {
- debug_error(DEBUG, "It is not mp3 file\n");
- return MMFILE_FORMAT_FAIL;
- }
+ mm_file_retvm_if_fails(DEBUG, MMFileFormatIsValidMP3(NULL, formatContext->uriFileName, 5), MMFILE_FORMAT_FAIL);
formatContext->ReadStream = mmfile_format_read_stream_mp3;
formatContext->ReadFrame = mmfile_format_read_frame_mp3;
}
-
int mmfile_format_read_stream_mp3(MMFileFormatContext *formatContext)
{
AvFileContentInfo *privateData = NULL;
mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
mm_file_retvm_if_fails(DEBUG, formatContext->privateFormatData, MMFILE_FORMAT_FAIL);
- if (MMFILE_FORMAT_SUCCESS != mmf_file_mp3_get_stream_info(formatContext->uriFileName, formatContext->privateFormatData)) {
+ if (!__get_stream_info(formatContext->uriFileName, formatContext->privateFormatData)) {
debug_error(DEBUG, "getting stream information is failed");
return MMFILE_FORMAT_FAIL;
}
}
-
int mmfile_format_read_frame_mp3(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame)
{
return MMFILE_FORMAT_SUCCESS;
mm_file_retvm_if_fails(DEBUG, formatContext, MMFILE_FORMAT_FAIL);
mm_file_retvm_if_fails(DEBUG, formatContext->privateFormatData, MMFILE_FORMAT_FAIL);
- if (MMFILE_FORMAT_SUCCESS != mmf_file_mp3_get_tag_info(formatContext->uriFileName, formatContext->privateFormatData)) {
+ if (!__get_tag_info(formatContext->uriFileName, formatContext->privateFormatData)) {
debug_error(DEBUG, "getting tag information is failed");
return MMFILE_FORMAT_FAIL;
}
debug_msg(RELEASE, "ID3 tag V2 File");
formatContext->artworkMime = g_strdup(privateData->imageInfo.imageExt);
} else {
- debug_error(DEBUG, "Album art image exist but there is no type information of album art\n");
+ debug_error(DEBUG, "Album art image exist but there is no type information of album art");
}
}
return MMFILE_FORMAT_SUCCESS;
}
-static int
-__AvExtractI4(unsigned char *buf)
+static int __AvExtractInt(unsigned char *buf, unsigned int size)
{
- int I4;
+ int ret = *buf;
- I4 = buf[0];
- I4 <<= 8;
- I4 |= buf[1];
- I4 <<= 8;
- I4 |= buf[2];
- I4 <<= 8;
- I4 |= buf[3];
+ while (--size)
+ ret = (ret << 8) | *(++buf);
- return I4;
+ return ret;
}
-static int
-__AvExtractI2(unsigned char *buf)
-{
- int I2;
-
- I2 = buf[0];
- I2 <<= 8;
- I2 |= buf[1];
- I2 <<= 8;
-
- return I2;
-}
-static int
-__AvGetXingHeader(AvXHeadData *headData, unsigned char *buf)
+static bool __AvGetXingHeader(AvXHeadData *headData, unsigned char *buf)
{
int index, headFlags;
int hId, hMode, hSrIndex;
/* There could be 2 attrs in this header : Xing or Info */
if (buf[0] == 'X') {
- if (buf[1] != 'i') return 0;
- if (buf[2] != 'n') return 0;
- if (buf[3] != 'g') return 0;
+ mm_file_retv_if_fails(buf[1] == 'i', false);
+ mm_file_retv_if_fails(buf[2] == 'n', false);
+ mm_file_retv_if_fails(buf[3] == 'g', false);
} else if (buf[0] == 'I') {
- if (buf[1] != 'n') return 0;
- if (buf[2] != 'f') return 0;
- if (buf[3] != 'o') return 0;
+ mm_file_retv_if_fails(buf[1] == 'n', false);
+ mm_file_retv_if_fails(buf[2] == 'f', false);
+ mm_file_retv_if_fails(buf[3] == 'o', false);
} else {
- return 0;
+ return false;
}
buf += 4;
if (hId == 0)
headData->sampRate >>= 1;
- headFlags = headData->flags = __AvExtractI4(buf); /* get flags */
+ headFlags = headData->flags = __AvExtractInt(buf, 4); /* get flags */
buf += 4;
if (headFlags & FRAMES_FLAG) {
- headData->frames = __AvExtractI4(buf);
+ headData->frames = __AvExtractInt(buf, 4);
buf += 4;
}
if (headFlags & BYTES_FLAG) {
- headData->bytes = __AvExtractI4(buf);
+ headData->bytes = __AvExtractInt(buf, 4);
buf += 4;
}
}
headData->vbrScale = -1;
- if (headFlags & VBR_SCALE_FLAG) {
- headData->vbrScale = __AvExtractI4(buf);
- }
+ if (headFlags & VBR_SCALE_FLAG)
+ headData->vbrScale = __AvExtractInt(buf, 4);
- debug_msg(RELEASE, "Xing header: sampling-rate:%d, stream-size:%d, frame-number:%d\n",
+ debug_msg(RELEASE, "Xing header: sampling-rate:%d, stream-size:%d, frame-number:%d",
headData->sampRate, headData->bytes, headData->frames);
- return 1; /* success */
+ return true; /* success */
}
-static int
-__AvGetVBRIHeader(AvVBRIHeadData *headData, unsigned char *buf)
+static bool __AvGetVBRIHeader(AvVBRIHeadData *headData, unsigned char *buf)
{
int hId, hSrIndex;
int mp3SampleRateTable[4] = { 44100, 48000, 32000, 99999 };
buf += (32 + 4);
- if (buf[0] != 'V') return 0; /* fail */
- if (buf[1] != 'B') return 0; /* header not found */
- if (buf[2] != 'R') return 0;
- if (buf[3] != 'I') return 0;
+ mm_file_retv_if_fails(buf[0] == 'V', false);
+ mm_file_retv_if_fails(buf[1] == 'B', false);
+ mm_file_retv_if_fails(buf[2] == 'R', false);
+ mm_file_retv_if_fails(buf[3] == 'I', false);
+
buf += 4;
headData->hId = hId;
if (hId == 0)
headData->sampRate >>= 1;
- headData->vID = __AvExtractI2(buf); /* get ver ID */
+ headData->vID = __AvExtractInt(buf, 2); /* get ver ID */
buf += 2;
- headData->delay = __AvExtractI2(buf);
+ headData->delay = __AvExtractInt(buf, 2);
buf += 2;
headData->qualityIndicator = buf[0];
buf += 2;
- headData->bytes = __AvExtractI4(buf);
+ headData->bytes = __AvExtractInt(buf, 4);
buf += 4;
- headData->frames = __AvExtractI4(buf);
+ headData->frames = __AvExtractInt(buf, 4);
buf += 4;
- headData->numOfTOC = __AvExtractI2(buf);
+ headData->numOfTOC = __AvExtractInt(buf, 2);
buf += 2;
- headData->vbriScale = __AvExtractI2(buf);
+ headData->vbriScale = __AvExtractInt(buf, 2);
buf += 2;
- headData->sizePerTable = __AvExtractI2(buf);
+ headData->sizePerTable = __AvExtractInt(buf, 2);
buf += 2;
- headData->framesPerTable = __AvExtractI2(buf);
+ headData->framesPerTable = __AvExtractInt(buf, 2);
- debug_msg(RELEASE, "Vbri header: sampling-rate:%d, stream-size:%d, frame-number:%d\n", headData->sampRate, headData->bytes, headData->frames);
+ debug_msg(RELEASE, "Vbri header: sampling-rate:%d, stream-size:%d, frame-number:%d", headData->sampRate, headData->bytes, headData->frames);
return true; /* success */
}
-static bool
-__AvIsValidHeader(AvFileContentInfo *pInfo, unsigned char *buf)
+
+static bool __AvIsValidHeader(AvFileContentInfo *pInfo, unsigned char *buf)
{
- bool bSync = false;
-
- if (VALID_SYNC(buf)) {
- mp3FrameDataValid[0] = (0xFF) & (mp3FrameMasking[0]);
- mp3FrameDataValid[1] = (0xE0 | (buf[AV_MP3HDR_VERSION_OFS] & AV_MP3HDR_VERSION_M) | (buf[AV_MP3HDR_LAYER_OFS] & AV_MP3HDR_LAYER_M)) & (mp3FrameMasking[1]);
- mp3FrameDataValid[2] = (buf[AV_MP3HDR_SAMPLERATE_OFS] & AV_MP3HDR_SAMPLERATE_M) & (mp3FrameMasking[2]);
- mp3FrameDataValid[3] = (buf[AV_MP3HDR_CHANNEL_OFS] & AV_MP3HDR_CHANNEL_M) & (mp3FrameMasking[3]);
-
- debug_msg(RELEASE, "*** [%02x][%02x][%02x][%02x] : [%02x][%02x][%02x][%02x]", buf[0], buf[1], buf[2], buf[3], mp3FrameDataValid[0], mp3FrameDataValid[1], mp3FrameDataValid[2], mp3FrameDataValid[3]);
-
- /*
- * MPEG Audio Layer I/II/III frame header
- * from : http://www.mp3-tech.org/programmer/frame_header.html *
- *
- * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
- *
- * A 11 (31-21) Frame sync (all bits must be set)
- * B 2 (20,19) MPEG Audio version ID
- * C 2 (18,17) Layer description
- * D 1 (16) Protection bit
- * E 4 (15,12) Bitrate index
- * F 2 (11,10) Sampling rate frequency index
- * G 1 (9) Padding bit
- * H 1 (8) Private bit. This one is only informative.
- * I 2 (7,6) Channel Mode
- * J 2 (5,4) Mode extension (Only used in Joint stereo)
- * K 1 (3) Copyright
- * L 1 (2) Original
- * M 2 (1,0) Emphasis
- *
- */
-
- /* Simple check for version, layer, bitrate, samplerate */
- if ((buf[1] & 0x18) != 0x08 && /* 000XX000 : MPEG Audio version ID, XX=01 - reserved => 00001000(0x08) */
- (buf[1] & 0x06) != 0x00 && /* 00000XX0 : Layer description, XX=00 - reserved => 00000000(0x00) */
- (buf[2] & 0xF0) != 0xF0 && /* XXXX0000 : Bitrate index, XX=1111 - bad => 11110000(0xF0) */
- (buf[2] & 0x0C) != 0x0C) { /* 0000XX00 : Sampling rate frequency index, XX=11 -reserved => 00001100(0x0C) */
- bSync = true;
- }
- debug_msg(RELEASE, "=> %s\n", bSync ? "Good!" : "Bad...");
+ bool bSync = false;
+
+ mm_file_retv_if_fails(VALID_SYNC(buf), false);
+
+ mp3FrameDataValid[0] = (0xFF) & (mp3FrameMasking[0]);
+ mp3FrameDataValid[1] = (0xE0 | (buf[AV_MP3HDR_VERSION_OFS] & AV_MP3HDR_VERSION_M) | (buf[AV_MP3HDR_LAYER_OFS] & AV_MP3HDR_LAYER_M)) & (mp3FrameMasking[1]);
+ mp3FrameDataValid[2] = (buf[AV_MP3HDR_SAMPLERATE_OFS] & AV_MP3HDR_SAMPLERATE_M) & (mp3FrameMasking[2]);
+ mp3FrameDataValid[3] = (buf[AV_MP3HDR_CHANNEL_OFS] & AV_MP3HDR_CHANNEL_M) & (mp3FrameMasking[3]);
+
+ debug_msg(RELEASE, "*** [%02x][%02x][%02x][%02x] : [%02x][%02x][%02x][%02x]", buf[0], buf[1], buf[2], buf[3], mp3FrameDataValid[0], mp3FrameDataValid[1], mp3FrameDataValid[2], mp3FrameDataValid[3]);
+
+ /*
+ * MPEG Audio Layer I/II/III frame header
+ * from : http://www.mp3-tech.org/programmer/frame_header.html *
+ *
+ * AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
+ *
+ * A 11 (31-21) Frame sync (all bits must be set)
+ * B 2 (20,19) MPEG Audio version ID
+ * C 2 (18,17) Layer description
+ * D 1 (16) Protection bit
+ * E 4 (15,12) Bitrate index
+ * F 2 (11,10) Sampling rate frequency index
+ * G 1 (9) Padding bit
+ * H 1 (8) Private bit. This one is only informative.
+ * I 2 (7,6) Channel Mode
+ * J 2 (5,4) Mode extension (Only used in Joint stereo)
+ * K 1 (3) Copyright
+ * L 1 (2) Original
+ * M 2 (1,0) Emphasis
+ *
+ */
+
+ /* Simple check for version, layer, bitrate, samplerate */
+ if ((buf[1] & 0x18) != 0x08 && /* 000XX000 : MPEG Audio version ID, XX=01 - reserved => 00001000(0x08) */
+ (buf[1] & 0x06) != 0x00 && /* 00000XX0 : Layer description, XX=00 - reserved => 00000000(0x00) */
+ (buf[2] & 0xF0) != 0xF0 && /* XXXX0000 : Bitrate index, XX=1111 - bad => 11110000(0xF0) */
+ (buf[2] & 0x0C) != 0x0C) { /* 0000XX00 : Sampling rate frequency index, XX=11 -reserved => 00001100(0x0C) */
+ bSync = true;
}
+ debug_msg(RELEASE, "=> %s", bSync ? "Good!" : "Bad...");
- if (bSync == true)
- return true;
- else
- return false;
+ return bSync;
}
-static bool
-__AvParseMp3Header(AvFileContentInfo *pInfo, unsigned char *header)
+static bool __AvParseMp3Header(AvFileContentInfo *pInfo, unsigned char *header)
{
unsigned char result;
- debug_msg(RELEASE, "### [%02x][%02x][%02x][%02x] ###\n", header[0], header[1], header[2], header[3]);
+ debug_msg(RELEASE, "### [%02x][%02x][%02x][%02x] ###", header[0], header[1], header[2], header[3]);
/* 1. Check the version of mp3 */
result = header[1] & MASK_MPEG;
return true;
}
-static bool
-__AvParseXingHeader(AvFileContentInfo *pInfo, unsigned char *buf)
+static bool __AvParseXingHeader(AvFileContentInfo *pInfo, unsigned char *buf)
{
- AvXHeadData data;
- memset(&data, 0x00, sizeof(AvXHeadData));
+ AvXHeadData data = {0, };
+ unsigned int pos = 0;
/* 1. Xing Header */
/* There could be 2 attrs in this header : Xing or Info */
- if ((pInfo->mpegVersion == AV_MPEG_VER_1) && (pInfo->channels == 2)) {
- if (buf[36] == 'X') {
- if (buf[37] != 'i') return false;
- if (buf[38] != 'n') return false;
- if (buf[39] != 'g') return false;
- } else if (buf[36] == 'I') {
- if (buf[37] != 'n') return false;
- if (buf[38] != 'f') return false;
- if (buf[39] != 'o') return false;
- } else {
- return false;
- }
- } else if ((pInfo->mpegVersion == AV_MPEG_VER_2 || pInfo->mpegVersion == AV_MPEG_VER_25) && (pInfo->channels == 1)) {
- if (buf[13] == 'X') {
- if (buf[14] != 'i') return false;
- if (buf[15] != 'n') return false;
- if (buf[16] != 'g') return false;
- } else if (buf[13] == 'I') {
- if (buf[14] != 'n') return false;
- if (buf[15] != 'f') return false;
- if (buf[16] != 'o') return false;
- } else {
- return false;
- }
+ if ((pInfo->mpegVersion == AV_MPEG_VER_1) && (pInfo->channels == 2))
+ pos = 36;
+ else if ((pInfo->mpegVersion == AV_MPEG_VER_2 || pInfo->mpegVersion == AV_MPEG_VER_25) && (pInfo->channels == 1))
+ pos = 13;
+ else
+ pos = 21;
+
+ if (buf[pos] == 'X') {
+ mm_file_retv_if_fails(buf[pos + 1] == 'i', false);
+ mm_file_retv_if_fails(buf[pos + 2] == 'n', false);
+ mm_file_retv_if_fails(buf[pos + 3] == 'g', false);
+ } else if (buf[pos] == 'I') {
+ mm_file_retv_if_fails(buf[pos + 1] == 'n', false);
+ mm_file_retv_if_fails(buf[pos + 2] == 'f', false);
+ mm_file_retv_if_fails(buf[pos + 3] == 'o', false);
} else {
- if (buf[21] == 'X') {
- if (buf[22] != 'i') return false;
- if (buf[23] != 'n') return false;
- if (buf[24] != 'g') return false;
- } else if (buf[21] == 'I') {
- if (buf[22] != 'n') return false;
- if (buf[23] != 'f') return false;
- if (buf[24] != 'o') return false;
- } else {
- return false;
- }
+ return false;
}
/* 2. TOC */
if (pInfo->pToc)
data.toc = (unsigned char *)(pInfo->pToc);
- if (__AvGetXingHeader(&data, (unsigned char *)buf) == 1) { /* VBR. */
+ if (__AvGetXingHeader(&data, (unsigned char *)buf)) { /* VBR. */
if (data.sampRate == 0 || data.bytes == 0 || data.frames == 0) {
- debug_error(DEBUG, "invalid Xing header\n");
+ debug_error(DEBUG, "invalid Xing header");
return false;
}
return false;
}
-static bool
-__AvParseVBRIHeader(AvFileContentInfo *pInfo, unsigned char *buf)
+static bool __AvParseVBRIHeader(AvFileContentInfo *pInfo, unsigned char *buf)
{
- AvVBRIHeadData data;
- memset(&data, 0x00, sizeof(AvVBRIHeadData));
+ AvVBRIHeadData data = {0, };
/* 1. Xing Header */
- if (buf[36] != 'V') return false;
- if (buf[37] != 'B') return false;
- if (buf[38] != 'R') return false;
- if (buf[39] != 'I') return false;
+ mm_file_retv_if_fails(buf[36] == 'V', false);
+ mm_file_retv_if_fails(buf[37] == 'B', false);
+ mm_file_retv_if_fails(buf[38] == 'R', false);
+ mm_file_retv_if_fails(buf[39] == 'I', false);
/* 2. TOC */
if (pInfo->pToc)
data.toc = (unsigned char *)(pInfo->pToc);
- if (__AvGetVBRIHeader(&data, (unsigned char *)buf) == 1) { /* VBR. */
- if (data.sampRate == 0 || data.bytes == 0 || data.frames == 0) {
- debug_error(DEBUG, "invalid Vbri header\n");
- return false;
- }
+ mm_file_retvm_if_fails(DEBUG, __AvGetVBRIHeader(&data, buf), false);
+ mm_file_retvm_if_fails(DEBUG, data.sampRate > 0, false);
+ mm_file_retvm_if_fails(DEBUG, data.bytes > 0, false);
+ mm_file_retvm_if_fails(DEBUG, data.frames > 0, false);
- pInfo->sampleRate = data.sampRate;
- pInfo->datafileLen = data.bytes;
- pInfo->frameNum = data.frames;
- pInfo->frameSize = (int)((float) data.bytes / (float) data.frames) ;
- pInfo->bVbr = true;
- return true;
- } else
- return false;
+ pInfo->sampleRate = data.sampRate;
+ pInfo->datafileLen = data.bytes;
+ pInfo->frameNum = data.frames;
+ pInfo->frameSize = (int)((float) data.bytes / (float) data.frames) ;
+ pInfo->bVbr = true;
+
+ return true;
}
-#ifdef __MMFILE_NEW_FRAME_FUNC /* from gst */
-static bool
-__AvGetMp3FrameSize(AvFileContentInfo *pInfo)
+static bool __AvGetMp3FrameSize(AvFileContentInfo *pInfo)
{
unsigned int frameSize = 0;
if (pInfo == NULL)
return true;
}
-#endif
-static bool
-__AvGetBitrate(AvFileContentInfo *pInfo)
+static bool __AvGetBitrate(AvFileContentInfo *pInfo)
{
float br, factor;
- int padding;
+ int padding = 0;
- if (pInfo == NULL || pInfo->bVbr == false)
- return false;
+ mm_file_retv_if_fails(pInfo, false);
+ mm_file_retv_if_fails(pInfo->bVbr, false);
if (pInfo->bPadding)
padding = 1;
- else
- padding = 0;
if (pInfo->mpegVersion == AV_MPEG_VER_1) { /* MPEG version 1 */
if (pInfo->layer == AV_MP3_LAYER_1) /* Layer 1 */
static bool __AvGetID3v1Header(unsigned char *buf, size_t buf_size, int *offset)
{
- unsigned char TagV1ID[4] = { 0x54, 0x41, 0x47}; /* TAG */
+ unsigned char TagV1ID[4] = { 0x54, 0x41, 0x47}; /* TAG */
int id3v1_offset = 0;
- if (!buf || buf_size < 3) {
- debug_error(DEBUG, "Invalid parameters!");
- return false;
- }
+ mm_file_retvm_if_fails(DEBUG, buf, false);
+ mm_file_retvm_if_fails(DEBUG, buf_size >= 3, false);
id3v1_offset = __AvMemstr(buf, TagV1ID, 3, TAGV1_SEEK_GAP + 5);
- if (id3v1_offset < 0) {
- debug_msg(RELEASE, "ID3v1 is not existing");
- return false;
- }
+ mm_file_retvm_if_fails(DEBUG, id3v1_offset >= 0, false);
if (offset)
*offset = id3v1_offset;
static bool __AvGetID3v2Header(unsigned char *buf, size_t buf_size, AvTagVer2AdditionalData *id3v2info)
{
- if (!buf || buf_size < MP3_TAGv2_HEADER_LEN || !id3v2info) {
- debug_error(DEBUG, "Invalid parameters!");
- return false;
- }
-
- if (!IS_ID3V2_TAG(buf)) { /* ID3 */
- debug_error(RELEASE, "Invalid ID3v2 identifier !");
- return false;
- }
+ mm_file_retvm_if_fails(DEBUG, buf, false);
+ mm_file_retvm_if_fails(DEBUG, buf_size >= MP3_TAGv2_HEADER_LEN, false);
+ mm_file_retvm_if_fails(DEBUG, id3v2info, false);
+ mm_file_retvm_if_fails(DEBUG, IS_ID3V2_TAG(buf), false);
/* weak id3v2 tag check */
if (buf[3] == 0xFF || buf[4] == 0xFF || buf[6] >= 0x80 || buf[7] >= 0x80 || buf[8] >= 0x80 || buf[9] >= 0x80) {
id3v2info->tagVersion = buf[3];
id3v2info->tagLen = MP3_TAGv2_HEADER_LEN;
id3v2info->tagLen += (unsigned long)buf[6] << 21 | (unsigned long)buf[7] << 14 | (unsigned long)buf[8] << 7 | (unsigned long)buf[9];
- debug_msg(RELEASE, "ID3v2 version(%d), length (%d)\n", id3v2info->tagVersion, id3v2info->tagLen);
+ debug_msg(RELEASE, "ID3v2 version(%d), length (%d)", id3v2info->tagVersion, id3v2info->tagLen);
return true;
}
-static int __AvGetLastID3v2Offset(MMFileIOHandle *fp, int *offset)
+static bool __AvGetLastID3v2Offset(MMFileIOHandle *fp, int *offset)
{
unsigned char tagHeader[MP3_TAGv2_HEADER_LEN] = {0, };
int total_taglen = 0;
read = mmfile_read(fp, tagHeader, MP3_TAGv2_HEADER_LEN);
if (read != MP3_TAGv2_HEADER_LEN) {
- debug_error(DEBUG, "mmfile_read failed\n");
- return 0;
+ debug_error(DEBUG, "mmfile_read failed");
+ return false;
}
if (!__AvGetID3v2Header(tagHeader, MP3_TAGv2_HEADER_LEN, &tagInfo)) {
- debug_msg(RELEASE, "Invalid ID3 header\n");
+ debug_msg(RELEASE, "Invalid ID3 header");
goto search_end;
}
/**@note unfortunately, some contents has many id3 tag.*/
total_taglen += tagInfo.tagLen;
- debug_msg(RELEASE, "tag size: %u, offset: %u\n", tagInfo.tagLen, total_taglen);
+ debug_msg(RELEASE, "tag size: %u, offset: %u", tagInfo.tagLen, total_taglen);
mmfile_seek(fp, total_taglen, MMFILE_SEEK_SET);
*offset = total_taglen;
goto _START_TAG_SEARCH;
search_end:
- return 1;
+ return true;
}
-static bool __AvGetID3v1Tags(unsigned char *buf, int offset, AvFileContentInfo *pInfo)
+static void __AvGetID3v1Tags(unsigned char *buf, int offset, AvFileContentInfo *pInfo)
{
- unsigned char TmpBuff[MP3TAGINFO_SIZE] = {0, };
+ unsigned char TmpBuff[MP3TAGINFO_SIZE] = {0, };
if (!buf || !pInfo || offset < 0) {
debug_error(DEBUG, "Invalid parameters!");
- return true;
+ return;
}
if (pInfo->tagV2Info.tagLen != 0 || offset != TAGV1_SEEK_GAP) {
debug_msg(RELEASE, "No need to check id3v1");
- return true;
+ return;
}
memcpy(TmpBuff, buf, MP3TAGINFO_SIZE);
- return mm_file_id3tag_parse_v110(pInfo, TmpBuff);
+ if (!mm_file_id3tag_parse_v110(pInfo, TmpBuff))
+ debug_msg(RELEASE, "mm_file_id3tag_parse_v110 fails");
}
static void __AvGetID3v2Tags(unsigned char *buf, AvFileContentInfo *pInfo)
else if (pInfo->tagV2Info.tagVersion == 0x04)
mm_file_id3tag_parse_v224(pInfo, buf); /* currently 2.4 ver pased by 2.3 routine */
else
- debug_msg(RELEASE, "Invalid tag version(%d)\n", pInfo->tagV2Info.tagVersion);
+ debug_msg(RELEASE, "Invalid tag version(%d)", pInfo->tagV2Info.tagVersion);
}
/*
* Param _pFile [in] Specifies the file pointer of mp3 file.
* This function returns the start position of header.
*/
-static int
-__AvFindStartOfMp3Header(unsigned char *buf, unsigned long bufLen, AvFileContentInfo *pInfo)
+static int __AvFindStartOfMp3Header(unsigned char *buf, unsigned long bufLen, AvFileContentInfo *pInfo)
{
unsigned int index = 0;
unsigned long id3v2TagLen = 0;
bool bFoundSync = false;
unsigned long minLen;
- if (!buf || !pInfo) {
- debug_error(DEBUG, "Invalid parameters");
- return -1;
- }
+ mm_file_retvm_if_fails(DEBUG, buf, -1);
+ mm_file_retvm_if_fails(DEBUG, pInfo, -1);
id3v2TagLen = pInfo->tagV2Info.tagLen;
- debug_msg(RELEASE, "id3v2TagLen(%lu)\n", id3v2TagLen);
+ debug_msg(RELEASE, "id3v2TagLen(%lu)", id3v2TagLen);
while (1) {
if (preHeaderGap == bufLen - 2)
pHeader = g_malloc0(256);
strncpy((char *)pHeader, (char *)buf, 256);
} else {
- debug_error(DEBUG, "Header field is not exist\n");
+ debug_error(DEBUG, "Header field is not exist");
return -1;
}
- if (__AvParseMp3Header(pInfo, pHeader) == false) {
+ if (!__AvParseMp3Header(pInfo, pHeader)) {
/*return -1; */
mmfile_free(pHeader);
- debug_warning(DEBUG, "Mp3 parse header failed & index(%d)\n", index);
+ debug_warning(DEBUG, "Mp3 parse header failed & index(%d)", index);
buf++;
index++;
continue;
} else {
- debug_msg(RELEASE, "This header is valid. index(%d)\n", index);
+ debug_msg(RELEASE, "This header is valid. index(%d)", index);
}
if (__AvParseXingHeader(pInfo, pHeader) || __AvParseVBRIHeader(pInfo, pHeader))
pInfo->datafileLen = pInfo->fileLen - pInfo->headerPos;
frameLen = pInfo->frameSize;
if (frameLen) {
- debug_msg(RELEASE, "<<< frameLen=[%lu] >>> \n", frameLen);
-
-#ifndef __MMFILE_NEW_FRAME_FUNC /* FIXME : what purpose to do this? */
- /* Account for loss of precision in the frame length calculation*/
- frameLen--;
-#endif
-
+ debug_msg(RELEASE, "<<< frameLen=[%lu] >>> ", frameLen);
/* Check if the remaining buffer size is large enough to
* look for another sync */
if ((index + frameLen) < (bufLen - (minLen - 1))) {
nextFrameOff = frameLen;
- nextFrameOffEnd = nextFrameOff + MIN(6, bufLen - (index + frameLen) - (minLen - 1));
+ nextFrameOffEnd = nextFrameOff + MMFILE_MIN(6, bufLen - (index + frameLen) - (minLen - 1));
/* Search the next few bytes for the next sync */
while (nextFrameOff < nextFrameOffEnd) {
}
} else {
- debug_warning(DEBUG, "Is not vaild header pHeader\n");
+ debug_warning(DEBUG, "Is not vaild header pHeader");
}
}
mmfile_free(pHeader);
} else {
- debug_warning(RELEASE, "Mp3 file first byte is 0xff, but not header sync\n");
+ debug_warning(RELEASE, "Mp3 file first byte is 0xff, but not header sync");
}
}
buf++;
mmfile_free(pHeader);
if (index > (bufLen - minLen)) {
- debug_warning(DEBUG, "Mp3 file sync is not found : index(%u) bufLen(%lu), minLen(%lu)\n", index, bufLen, minLen);
+ debug_warning(DEBUG, "Mp3 file sync is not found : index(%u) bufLen(%lu), minLen(%lu)", index, bufLen, minLen);
return -1;
}
if (bFoundSync == true) {
- debug_msg(RELEASE, "Mp3 file found a sync Success!\n");
+ debug_msg(RELEASE, "Mp3 file found a sync Success!");
} else {
- debug_msg(RELEASE, "Mp3 file found a sync Failed!\n");
+ debug_msg(RELEASE, "Mp3 file found a sync Failed!");
return -1;
}
* Param pInfo [out] Specifies a struct pointer for ID3 tag information.
* This function returns true on success, or false on failure.
*/
-static int mmf_file_mp3_get_tag_info(char *filename, AvFileContentInfo *pInfo)
+static bool __get_tag_info(char *filename, AvFileContentInfo *pInfo)
{
MMFileIOHandle *hFile;
unsigned char *buf = NULL;
unsigned char *v2TagExistCheck = NULL;
unsigned char TagBuff[MP3TAGINFO_SIZE + TAGV1_SEEK_GAP];
int tagHeaderPos = 0;
- int ret = 0;
debug_fenter(RELEASE);
- if (pInfo == NULL || filename == NULL)
- return MMFILE_FORMAT_FAIL;
+ mm_file_retv_if_fails(pInfo, false);
+ mm_file_retv_if_fails(filename, false);
memset(pInfo, 0x00, sizeof(AvFileContentInfo));
pInfo->genre = 148;
/*open*/
- ret = mmfile_open(&hFile, filename, MMFILE_RDONLY);
- if (ret == MMFILE_UTIL_FAIL) {
- debug_error(DEBUG, "open failed.\n");
- return MMFILE_FORMAT_FAIL;
- }
+ mm_file_retvm_if_fails(DEBUG, mmfile_open(&hFile, filename, MMFILE_RDONLY) == MMFILE_UTIL_SUCCESS, false);
pInfo->fileLen = mmfile_get_size(hFile);
if (pInfo->fileLen <= 0) {
- debug_error(DEBUG, "file is too small.\n");
+ debug_error(DEBUG, "file is too small.");
goto EXCEPTION;
}
v2TagExistCheck = g_malloc0(MP3_TAGv2_HEADER_LEN);
if (mmfile_read(hFile, v2TagExistCheck, MP3_TAGv2_HEADER_LEN) != MP3_TAGv2_HEADER_LEN) {
- debug_error(DEBUG, "v2TagExistCheck value read fail!\n");
+ debug_error(DEBUG, "v2TagExistCheck value read fail!");
mmfile_free(v2TagExistCheck);
goto EXCEPTION;
}
if (mmfile_seek(hFile, 0L, SEEK_SET) < 0)
goto EXCEPTION;
- debug_msg(RELEASE, "pInfo->fileLen(%lld)\n", pInfo->fileLen);
+ debug_msg(RELEASE, "pInfo->fileLen(%lld)", pInfo->fileLen);
/* read file to get ID3v2 tags from offset 0 */
if (pInfo->fileLen <= (long long)pInfo->tagV2Info.tagLen)
pInfo->tagV2Info.tagLen = pInfo->fileLen;
- debug_msg(RELEASE, "buf size(%d)\n", pInfo->tagV2Info.tagLen);
+ debug_msg(RELEASE, "buf size(%d)", pInfo->tagV2Info.tagLen);
buf = g_malloc0(pInfo->tagV2Info.tagLen);
/* check and get TAG(ID3v1) information */
if (__AvGetID3v1Header(TagBuff, MP3TAGINFO_SIZE + TAGV1_SEEK_GAP, &tagHeaderPos)) {
pInfo->bV1tagFound = true;
- if (!__AvGetID3v1Tags((TagBuff + tagHeaderPos), tagHeaderPos, pInfo))
- goto EXCEPTION;
+ __AvGetID3v1Tags((TagBuff + tagHeaderPos), tagHeaderPos, pInfo);
}
mm_file_id3tag_restore_content_info(pInfo);
mmfile_close(hFile);
/*debug print*/
- debug_msg(RELEASE, "Title : %s\n", pInfo->tagInfo[AV_ID3TAG_TITLE].value);
- debug_msg(RELEASE, "Artist : %s\n", pInfo->tagInfo[AV_ID3TAG_ARTIST].value);
- debug_msg(RELEASE, "Album : %s\n", pInfo->tagInfo[AV_ID3TAG_ALBUM].value);
- debug_msg(RELEASE, "Album_Artist: %s\n", pInfo->tagInfo[AV_ID3TAG_ALBUM_ARTIST].value);
- debug_msg(RELEASE, "Year : %s\n", pInfo->tagInfo[AV_ID3TAG_YEAR].value);
- debug_msg(RELEASE, "Comment : %s\n", pInfo->tagInfo[AV_ID3TAG_COMMENT].value);
- debug_msg(RELEASE, "TrackNum : %s\n", pInfo->tagInfo[AV_ID3TAG_TRACKNUM].value);
- debug_msg(RELEASE, "Genre : %s\n", pInfo->tagInfo[AV_ID3TAG_GENRE].value);
- debug_msg(RELEASE, "Copyright : %s\n", pInfo->tagInfo[AV_ID3TAG_COPYRIGHT].value);
- debug_msg(RELEASE, "RecDate : %s\n", pInfo->tagInfo[AV_ID3TAG_RECDATE].value);
- debug_msg(RELEASE, "PartOfASet : %s\n", pInfo->tagInfo[AV_ID3TAG_PART_OF_SET].value);
- debug_msg(RELEASE, "Encoded by : %s\n", pInfo->tagInfo[AV_ID3TAG_ENCBY].value);
- debug_msg(RELEASE, "URL : %s\n", pInfo->tagInfo[AV_ID3TAG_URL].value);
- debug_msg(RELEASE, "Ori. Artist : %s\n", pInfo->tagInfo[AV_ID3TAG_ORIGIN_ARTIST].value);
- debug_msg(RELEASE, "Composer : %s\n", pInfo->tagInfo[AV_ID3TAG_COMPOSER].value);
- debug_msg(RELEASE, "Conductor : %s\n", pInfo->tagInfo[AV_ID3TAG_CONDUCTOR].value);
- debug_msg(RELEASE, "Artwork : mime(%s) addr(%p) size(%d)\n", pInfo->imageInfo.imageMIMEType, pInfo->imageInfo.pImageBuf, pInfo->imageInfo.imageLen);
- debug_msg(RELEASE, "UnsyncLyrics : %s\n", pInfo->tagInfo[AV_ID3TAG_UNSYNCLYRICS].value);
+ debug_msg(RELEASE, "Title : %s", pInfo->tagInfo[AV_ID3TAG_TITLE].value);
+ debug_msg(RELEASE, "Artist : %s", pInfo->tagInfo[AV_ID3TAG_ARTIST].value);
+ debug_msg(RELEASE, "Album : %s", pInfo->tagInfo[AV_ID3TAG_ALBUM].value);
+ debug_msg(RELEASE, "Album_Artist: %s", pInfo->tagInfo[AV_ID3TAG_ALBUM_ARTIST].value);
+ debug_msg(RELEASE, "Year : %s", pInfo->tagInfo[AV_ID3TAG_YEAR].value);
+ debug_msg(RELEASE, "Comment : %s", pInfo->tagInfo[AV_ID3TAG_COMMENT].value);
+ debug_msg(RELEASE, "TrackNum : %s", pInfo->tagInfo[AV_ID3TAG_TRACKNUM].value);
+ debug_msg(RELEASE, "Genre : %s", pInfo->tagInfo[AV_ID3TAG_GENRE].value);
+ debug_msg(RELEASE, "Copyright : %s", pInfo->tagInfo[AV_ID3TAG_COPYRIGHT].value);
+ debug_msg(RELEASE, "RecDate : %s", pInfo->tagInfo[AV_ID3TAG_RECDATE].value);
+ debug_msg(RELEASE, "PartOfASet : %s", pInfo->tagInfo[AV_ID3TAG_PART_OF_SET].value);
+ debug_msg(RELEASE, "Encoded by : %s", pInfo->tagInfo[AV_ID3TAG_ENCBY].value);
+ debug_msg(RELEASE, "URL : %s", pInfo->tagInfo[AV_ID3TAG_URL].value);
+ debug_msg(RELEASE, "Ori. Artist : %s", pInfo->tagInfo[AV_ID3TAG_ORIGIN_ARTIST].value);
+ debug_msg(RELEASE, "Composer : %s", pInfo->tagInfo[AV_ID3TAG_COMPOSER].value);
+ debug_msg(RELEASE, "Conductor : %s", pInfo->tagInfo[AV_ID3TAG_CONDUCTOR].value);
+ debug_msg(RELEASE, "Artwork : mime(%s) addr(%p) size(%d)", pInfo->imageInfo.imageMIMEType, pInfo->imageInfo.pImageBuf, pInfo->imageInfo.imageLen);
+ debug_msg(RELEASE, "UnsyncLyrics : %s", pInfo->tagInfo[AV_ID3TAG_UNSYNCLYRICS].value);
- return MMFILE_FORMAT_SUCCESS;
+ return true;
EXCEPTION:
- debug_error(DEBUG, "Error occured!\n");
+ debug_error(DEBUG, "Error occured!");
mmfile_close(hFile);
- return MMFILE_FORMAT_FAIL;
+ return false;
}
/*
* Param pInfo [out] Specifies a struct pointer for MP3 stream information.
* This function returns true on success, or false on failure.
*/
-static int mmf_file_mp3_get_stream_info(char *filename, AvFileContentInfo *pInfo)
+static bool __get_stream_info(char *filename, AvFileContentInfo *pInfo)
{
MMFileIOHandle *hFile;
unsigned char header[256];
unsigned char *buf = NULL;
unsigned long bufLen = 0;
unsigned char TagBuff[MP3TAGINFO_SIZE + TAGV1_SEEK_GAP];
- int ret = 0;
debug_fenter(RELEASE);
- if (!pInfo || !filename)
- return MMFILE_FORMAT_FAIL;
+ mm_file_retv_if_fails(pInfo, false);
+ mm_file_retv_if_fails(filename, false);
memset(pInfo, 0x00, sizeof(AvFileContentInfo));
pInfo->genre = 148;
/*open*/
- ret = mmfile_open(&hFile, filename, MMFILE_RDONLY);
- if (ret == MMFILE_UTIL_FAIL) {
- debug_error(DEBUG, "open failed.\n");
- return MMFILE_FORMAT_FAIL;
- }
+ mm_file_retvm_if_fails(DEBUG, mmfile_open(&hFile, filename, MMFILE_RDONLY) == MMFILE_UTIL_SUCCESS, false);
pInfo->fileLen = mmfile_get_size(hFile);
if (pInfo->fileLen <= 0) {
- debug_error(DEBUG, "file is too small.\n");
+ debug_error(DEBUG, "file is too small.");
goto EXCEPTION;
}
/* get total length from the beginning of first ID3v2 to the end of last ID3v2
to get the offset of MP3 data */
__AvGetLastID3v2Offset(hFile, &pInfo->tagV2Info.tagLen);
- debug_msg(RELEASE, "ID3 tag end offset: %u\n", pInfo->tagV2Info.tagLen);
+ debug_msg(RELEASE, "ID3 tag end offset: %u", pInfo->tagV2Info.tagLen);
- debug_msg(RELEASE, "pInfo->fileLen(%lld)\n", pInfo->fileLen);
+ debug_msg(RELEASE, "pInfo->fileLen(%lld)", pInfo->fileLen);
/* read file to find MP3 header */
if (pInfo->fileLen - (long long)pInfo->tagV2Info.tagLen > (long long)_AV_MP3_HEADER_POSITION_MAX) {
bufLen = pInfo->fileLen;
}
- debug_msg(RELEASE, "buf size(%lu)\n", bufLen);
+ debug_msg(RELEASE, "buf size(%lu)", bufLen);
buf = g_malloc0(bufLen);
/* get offset of MP3 header */
pInfo->headerPos = (long) __AvFindStartOfMp3Header(buf, bufLen, pInfo);
- debug_msg(RELEASE, "Header Pos: %ld\n", pInfo->headerPos);
+ debug_msg(RELEASE, "Header Pos: %ld", pInfo->headerPos);
mmfile_free(buf);
} else {
__AvGetMp3FrameSize(pInfo);
pInfo->datafileLen = pInfo->fileLen - pInfo->headerPos;
- debug_msg(RELEASE, "Mp3 File FrameSize (%d) pInfo->headerPos(%ld)\n", pInfo->frameSize, pInfo->headerPos);
+ debug_msg(RELEASE, "Mp3 File FrameSize (%d) pInfo->headerPos(%ld)", pInfo->frameSize, pInfo->headerPos);
}
if (pInfo->mpegVersion == 1) {
mmfile_close(hFile);
/*debug print*/
- debug_msg(RELEASE, "Mp3 File pInfo->duration (%lld) \n", pInfo->duration);
- debug_msg(RELEASE, "** MP3 **\n");
- debug_msg(RELEASE, "Version : %u\n", pInfo->mpegVersion);
- debug_msg(RELEASE, "Layer : %u\n", pInfo->layer);
- debug_msg(RELEASE, "Channel idx: %u\n", pInfo->channelIndex);
- debug_msg(RELEASE, "Is VBR : %d\n", (pInfo->bVbr == true ? 1 : 0));
- debug_msg(RELEASE, "Bitrate : %u\n", pInfo->bitRate);
- debug_msg(RELEASE, "SampleRate : %u\n", pInfo->sampleRate);
- debug_msg(RELEASE, "Channels : %u\n", pInfo->channels);
+ debug_msg(RELEASE, "Mp3 File pInfo->duration (%lld) ", pInfo->duration);
+ debug_msg(RELEASE, "** MP3 **");
+ debug_msg(RELEASE, "Version : %u", pInfo->mpegVersion);
+ debug_msg(RELEASE, "Layer : %u", pInfo->layer);
+ debug_msg(RELEASE, "Channel idx: %u", pInfo->channelIndex);
+ debug_msg(RELEASE, "Is VBR : %d", (pInfo->bVbr == true ? 1 : 0));
+ debug_msg(RELEASE, "Bitrate : %u", pInfo->bitRate);
+ debug_msg(RELEASE, "SampleRate : %u", pInfo->sampleRate);
+ debug_msg(RELEASE, "Channels : %u", pInfo->channels);
- return MMFILE_FORMAT_SUCCESS;
+ return true;
EXCEPTION:
- debug_error(DEBUG, "Error occured!\n");
+ debug_error(DEBUG, "Error occured!");
mmfile_close(hFile);
- return MMFILE_FORMAT_FAIL;
+ return false;
}