Skip to content
Snippets Groups Projects
Commit c3923dd7 authored by David's avatar David
Browse files

Fix for 64-bit MOV with stsc atoms

parent b6152c2c
No related branches found
No related tags found
No related merge requests found
......@@ -46,6 +46,8 @@ uint32_t GetNumberPayloads(void *handle)
{
return mp4->indexcount;
}
return 0;
}
......@@ -86,6 +88,8 @@ uint32_t GetPayloadSize(void *handle, uint32_t index)
if(mp4->metasizes && mp4->metasize_count > index)
return mp4->metasizes[index];
return 0;
}
......@@ -422,17 +426,72 @@ void *OpenMP4Source(char *filename, uint32_t traktype, uint32_t traksubtype) //
len = fread(&skip, 1, 4, mp4->mediafp);
len += fread(&num, 1, 4, mp4->mediafp);
num = BYTESWAP32(num);
mp4->indexcount = num;
if (mp4->metaoffsets) free(mp4->metaoffsets);
mp4->metaoffsets = (uint64_t *)malloc(num * 8);
if (mp4->metaoffsets)
if (mp4->metastsc_count > 0 && num != mp4->metasize_count)
{
len += fread(mp4->metaoffsets, 1, num * 8, mp4->mediafp);
do
mp4->indexcount = mp4->metasize_count;
if (mp4->metaoffsets) free(mp4->metaoffsets);
mp4->metaoffsets = (uint64_t *)malloc(mp4->metasize_count * 8);
if (mp4->metaoffsets)
{
num--;
mp4->metaoffsets[num] = BYTESWAP64(mp4->metaoffsets[num]);
} while (num > 0);
uint64_t *metaoffsets64 = NULL;
metaoffsets64 = (uint64_t *)malloc(num * 8);
if (metaoffsets64)
{
uint64_t fileoffset = 0;
int stsc_pos = 0;
int stco_pos = 0;
len += fread(metaoffsets64, 1, num * 8, mp4->mediafp);
do
{
num--;
metaoffsets64[num] = BYTESWAP64(metaoffsets64[num]);
} while (num > 0);
fileoffset = metaoffsets64[0];
mp4->metaoffsets[0] = fileoffset;
//printf("%3d:%08x, delta = %08x\n", 0, (int)fileoffset, 0);
num = 1;
while (num < mp4->metasize_count)
{
if (num != mp4->metastsc[stsc_pos].chunk_num - 1 && 0 == (num - (mp4->metastsc[stsc_pos].chunk_num - 1)) % mp4->metastsc[stsc_pos].samples)
{
stco_pos++;
fileoffset = (uint64_t)metaoffsets64[stco_pos];
}
else
{
fileoffset += (uint64_t)mp4->metasizes[num - 1];
}
mp4->metaoffsets[num] = fileoffset;
//int delta = metaoffsets[num] - metaoffsets[num - 1];
//printf("%3d:%08x, delta = %08x\n", num, (int)fileoffset, delta);
num++;
}
if (mp4->metastsc) free(mp4->metastsc);
mp4->metastsc_count = 0;
free(metaoffsets64);
}
}
}
else
{
mp4->indexcount = num;
if (mp4->metaoffsets) free(mp4->metaoffsets);
mp4->metaoffsets = (uint64_t *)malloc(num * 8);
if (mp4->metaoffsets)
{
len += fread(mp4->metaoffsets, 1, num * 8, mp4->mediafp);
do
{
num--;
mp4->metaoffsets[num] = BYTESWAP64(mp4->metaoffsets[num]);
} while (num > 0);
}
}
LONGSEEK(mp4->mediafp, qtsize - 8 - len, SEEK_CUR); // skip over stco
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment