Merge "Add support for retrieving location information in mp4/3gpp files" into ics-mr1
This commit is contained in:
@ -54,6 +54,7 @@ enum {
|
|||||||
METADATA_KEY_BITRATE = 20,
|
METADATA_KEY_BITRATE = 20,
|
||||||
METADATA_KEY_TIMED_TEXT_LANGUAGES = 21,
|
METADATA_KEY_TIMED_TEXT_LANGUAGES = 21,
|
||||||
METADATA_KEY_IS_DRM = 22,
|
METADATA_KEY_IS_DRM = 22,
|
||||||
|
METADATA_KEY_LOCATION = 23,
|
||||||
|
|
||||||
// Add more here...
|
// Add more here...
|
||||||
};
|
};
|
||||||
|
@ -85,6 +85,7 @@ enum {
|
|||||||
kKeyDate = 'date', // cstring
|
kKeyDate = 'date', // cstring
|
||||||
kKeyWriter = 'writ', // cstring
|
kKeyWriter = 'writ', // cstring
|
||||||
kKeyCompilation = 'cpil', // cstring
|
kKeyCompilation = 'cpil', // cstring
|
||||||
|
kKeyLocation = 'loc ', // cstring
|
||||||
kKeyTimeScale = 'tmsl', // int32_t
|
kKeyTimeScale = 'tmsl', // int32_t
|
||||||
|
|
||||||
// video profile and level
|
// video profile and level
|
||||||
|
@ -458,5 +458,13 @@ public class MediaMetadataRetriever
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final int METADATA_KEY_IS_DRM = 22;
|
public static final int METADATA_KEY_IS_DRM = 22;
|
||||||
|
/**
|
||||||
|
* This key retrieves the location information, if available.
|
||||||
|
* The location should be specified according to ISO-6709 standard, under
|
||||||
|
* a mp4/3gp box "@xyz". Location with longitude of -90 degrees and latitude
|
||||||
|
* of 180 degrees will be retrieved as "-90.0000+180.0000", for instance.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int METADATA_KEY_LOCATION = 23;
|
||||||
// Add more here...
|
// Add more here...
|
||||||
}
|
}
|
||||||
|
@ -1136,6 +1136,41 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @xyz
|
||||||
|
case FOURCC('\xA9', 'x', 'y', 'z'):
|
||||||
|
{
|
||||||
|
// Best case the total data length inside "@xyz" box
|
||||||
|
// would be 8, for instance "@xyz" + "\x00\x04\x15\xc7" + "0+0/",
|
||||||
|
// where "\x00\x04" is the text string length with value = 4,
|
||||||
|
// "\0x15\xc7" is the language code = en, and "0+0" is a
|
||||||
|
// location (string) value with longitude = 0 and latitude = 0.
|
||||||
|
if (chunk_data_size < 8) {
|
||||||
|
return ERROR_MALFORMED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Worst case the location string length would be 18,
|
||||||
|
// for instance +90.0000-180.0000, without the trailing "/" and
|
||||||
|
// the string length + language code.
|
||||||
|
char buffer[18];
|
||||||
|
|
||||||
|
// Substracting 5 from the data size is because the text string length +
|
||||||
|
// language code takes 4 bytes, and the trailing slash "/" takes 1 byte.
|
||||||
|
off64_t location_length = chunk_data_size - 5;
|
||||||
|
if (location_length >= (off64_t) sizeof(buffer)) {
|
||||||
|
return ERROR_MALFORMED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mDataSource->readAt(
|
||||||
|
data_offset + 4, buffer, location_length) < location_length) {
|
||||||
|
return ERROR_IO;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[location_length] = '\0';
|
||||||
|
mFileMetaData->setCString(kKeyLocation, buffer);
|
||||||
|
*offset += chunk_size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case FOURCC('e', 's', 'd', 's'):
|
case FOURCC('e', 's', 'd', 's'):
|
||||||
{
|
{
|
||||||
if (chunk_data_size < 4) {
|
if (chunk_data_size < 4) {
|
||||||
|
@ -418,6 +418,7 @@ void StagefrightMetadataRetriever::parseMetaData() {
|
|||||||
{ kKeyYear, METADATA_KEY_YEAR },
|
{ kKeyYear, METADATA_KEY_YEAR },
|
||||||
{ kKeyWriter, METADATA_KEY_WRITER },
|
{ kKeyWriter, METADATA_KEY_WRITER },
|
||||||
{ kKeyCompilation, METADATA_KEY_COMPILATION },
|
{ kKeyCompilation, METADATA_KEY_COMPILATION },
|
||||||
|
{ kKeyLocation, METADATA_KEY_LOCATION },
|
||||||
};
|
};
|
||||||
static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
|
static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user