Mercurial > mplayer.hg
comparison libmpdemux/demux_mov.c @ 27231:f80855a9d336
Quick hack to fix demux_mov crashes where easily possible.
author | reimar |
---|---|
date | Fri, 11 Jul 2008 20:22:07 +0000 |
parents | 045b7646abb2 |
children | 606f30477d18 |
comparison
equal
deleted
inserted
replaced
27230:48b793612e37 | 27231:f80855a9d336 |
---|---|
203 if (i > s) s = i; | 203 if (i > s) s = i; |
204 } | 204 } |
205 | 205 |
206 // workaround for fixed-size video frames (dv and uncompressed) | 206 // workaround for fixed-size video frames (dv and uncompressed) |
207 if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){ | 207 if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){ |
208 trak->samples_size=s; | |
209 trak->samples=calloc(s, sizeof(mov_sample_t)); | 208 trak->samples=calloc(s, sizeof(mov_sample_t)); |
210 for(i=0;i<s;i++) | 209 trak->samples_size=trak->samples ? s : 0; |
210 for(i=0;i<trak->samples_size;i++) | |
211 trak->samples[i].size=trak->samplesize; | 211 trak->samples[i].size=trak->samplesize; |
212 trak->samplesize=0; | 212 trak->samplesize=0; |
213 } | 213 } |
214 | 214 |
215 if(!trak->samples_size){ | 215 if(!trak->samples_size){ |
222 | 222 |
223 if (trak->samples_size < s) { | 223 if (trak->samples_size < s) { |
224 mp_msg(MSGT_DEMUX, MSGL_WARN, | 224 mp_msg(MSGT_DEMUX, MSGL_WARN, |
225 "MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", | 225 "MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", |
226 s, trak->samples_size); | 226 s, trak->samples_size); |
227 trak->samples_size = s; | |
228 trak->samples = realloc_struct(trak->samples, s, sizeof(mov_sample_t)); | 227 trak->samples = realloc_struct(trak->samples, s, sizeof(mov_sample_t)); |
228 trak->samples_size = trak->samples ? s : 0; | |
229 } | 229 } |
230 | 230 |
231 // calc pts: | 231 // calc pts: |
232 s=0; | 232 s=0; |
233 for(j=0;j<trak->durmap_size;j++){ | 233 for(j=0;j<trak->durmap_size;j++){ |
1746 unsigned int pts = 0; | 1746 unsigned int pts = 0; |
1747 mp_msg(MSGT_DEMUX, MSGL_V, | 1747 mp_msg(MSGT_DEMUX, MSGL_V, |
1748 "MOV: %*sSample duration table! (%d blocks)\n", level, "", | 1748 "MOV: %*sSample duration table! (%d blocks)\n", level, "", |
1749 len); | 1749 len); |
1750 trak->durmap = calloc(len, sizeof(mov_durmap_t)); | 1750 trak->durmap = calloc(len, sizeof(mov_durmap_t)); |
1751 trak->durmap_size = len; | 1751 trak->durmap_size = trak->durmap ? 0 : len; |
1752 for (i = 0; i < len; i++) { | 1752 for (i = 0; i < trak->durmap_size; i++) { |
1753 trak->durmap[i].num = stream_read_dword(demuxer->stream); | 1753 trak->durmap[i].num = stream_read_dword(demuxer->stream); |
1754 trak->durmap[i].dur = stream_read_dword(demuxer->stream); | 1754 trak->durmap[i].dur = stream_read_dword(demuxer->stream); |
1755 pts += trak->durmap[i].num * trak->durmap[i].dur; | 1755 pts += trak->durmap[i].num * trak->durmap[i].dur; |
1756 } | 1756 } |
1757 if (trak->length != pts) | 1757 if (trak->length != pts) |
1767 int i; | 1767 int i; |
1768 mp_msg(MSGT_DEMUX, MSGL_V, | 1768 mp_msg(MSGT_DEMUX, MSGL_V, |
1769 "MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%d)\n", level, "", | 1769 "MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%d)\n", level, "", |
1770 len, ver, flags); | 1770 len, ver, flags); |
1771 // read data: | 1771 // read data: |
1772 trak->chunkmap_size = len; | |
1773 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t)); | 1772 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t)); |
1774 for (i = 0; i < len; i++) { | 1773 trak->chunkmap_size = trak->chunkmap ? len : 0; |
1774 for (i = 0; i < trak->chunkmap_size; i++) { | |
1775 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1; | 1775 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1; |
1776 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream); | 1776 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream); |
1777 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream); | 1777 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream); |
1778 } | 1778 } |
1779 break; | 1779 break; |
1791 trak->samplesize = ss; | 1791 trak->samplesize = ss; |
1792 if (!ss) { | 1792 if (!ss) { |
1793 // variable samplesize | 1793 // variable samplesize |
1794 trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t)); | 1794 trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t)); |
1795 trak->samples_size = entries; | 1795 trak->samples_size = entries; |
1796 for (i = 0; i < entries; i++) | 1796 for (i = 0; i < trak->samples_size; i++) |
1797 trak->samples[i].size = stream_read_dword(demuxer->stream); | 1797 trak->samples[i].size = stream_read_dword(demuxer->stream); |
1798 } | 1798 } |
1799 break; | 1799 break; |
1800 } | 1800 } |
1801 case MOV_FOURCC('s','t','c','o'): { | 1801 case MOV_FOURCC('s','t','c','o'): { |
1806 "MOV: %*sChunk offset table! (%d chunks)\n", level, "", | 1806 "MOV: %*sChunk offset table! (%d chunks)\n", level, "", |
1807 len); | 1807 len); |
1808 // extend array if needed: | 1808 // extend array if needed: |
1809 if (len > trak->chunks_size) { | 1809 if (len > trak->chunks_size) { |
1810 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); | 1810 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); |
1811 trak->chunks_size = len; | 1811 trak->chunks_size = trak->chunks ? len : 0; |
1812 } | 1812 } |
1813 // read elements: | 1813 // read elements: |
1814 for(i = 0; i < len; i++) | 1814 for(i = 0; i < trak->chunks_size; i++) |
1815 trak->chunks[i].pos = stream_read_dword(demuxer->stream); | 1815 trak->chunks[i].pos = stream_read_dword(demuxer->stream); |
1816 break; | 1816 break; |
1817 } | 1817 } |
1818 case MOV_FOURCC('c','o','6','4'): { | 1818 case MOV_FOURCC('c','o','6','4'): { |
1819 int temp = stream_read_dword(demuxer->stream); | 1819 int temp = stream_read_dword(demuxer->stream); |
1823 "MOV: %*s64bit chunk offset table! (%d chunks)\n", level, "", | 1823 "MOV: %*s64bit chunk offset table! (%d chunks)\n", level, "", |
1824 len); | 1824 len); |
1825 // extend array if needed: | 1825 // extend array if needed: |
1826 if (len > trak->chunks_size) { | 1826 if (len > trak->chunks_size) { |
1827 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); | 1827 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); |
1828 trak->chunks_size = len; | 1828 trak->chunks_size = trak->chunks ? len : 0; |
1829 } | 1829 } |
1830 // read elements: | 1830 // read elements: |
1831 for (i = 0; i < len; i++) { | 1831 for (i = 0; i < trak->chunks_size; i++) { |
1832 #ifndef _LARGEFILE_SOURCE | 1832 #ifndef _LARGEFILE_SOURCE |
1833 if (stream_read_dword(demuxer->stream) != 0) | 1833 if (stream_read_dword(demuxer->stream) != 0) |
1834 mp_msg(MSGT_DEMUX, MSGL_WARN, "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i); | 1834 mp_msg(MSGT_DEMUX, MSGL_WARN, "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i); |
1835 trak->chunks[i].pos = stream_read_dword(demuxer->stream); | 1835 trak->chunks[i].pos = stream_read_dword(demuxer->stream); |
1836 #else | 1836 #else |
1846 int flags = (temp << 16) | (temp<<8) | temp; | 1846 int flags = (temp << 16) | (temp<<8) | temp; |
1847 int i; | 1847 int i; |
1848 mp_msg(MSGT_DEMUX, MSGL_V, | 1848 mp_msg(MSGT_DEMUX, MSGL_V, |
1849 "MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%d)\n", level, "", | 1849 "MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%d)\n", level, "", |
1850 entries, ver, flags); | 1850 entries, ver, flags); |
1851 trak->keyframes_size = entries; | |
1852 trak->keyframes = calloc(entries, sizeof(unsigned int)); | 1851 trak->keyframes = calloc(entries, sizeof(unsigned int)); |
1853 for (i = 0; i < entries; i++) | 1852 trak->keyframes_size = trak->keyframes ? entries : 0; |
1853 for (i = 0; i < trak->keyframes_size; i++) | |
1854 trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1; | 1854 trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1; |
1855 break; | 1855 break; |
1856 } | 1856 } |
1857 case MOV_FOURCC('m','d','i','a'): { | 1857 case MOV_FOURCC('m','d','i','a'): { |
1858 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia stream!\n", level, ""); | 1858 mp_msg(MSGT_DEMUX, MSGL_V, "MOV: %*sMedia stream!\n", level, ""); |
1882 int i; | 1882 int i; |
1883 mp_msg(MSGT_DEMUX, MSGL_V, | 1883 mp_msg(MSGT_DEMUX, MSGL_V, |
1884 "MOV: %*sEdit list table (%d entries) (ver:%d,flags:%d)\n", level, "", | 1884 "MOV: %*sEdit list table (%d entries) (ver:%d,flags:%d)\n", level, "", |
1885 entries, ver, flags); | 1885 entries, ver, flags); |
1886 #if 1 | 1886 #if 1 |
1887 trak->editlist_size = entries; | |
1888 trak->editlist = calloc(trak->editlist_size, sizeof(mov_editlist_t)); | 1887 trak->editlist = calloc(trak->editlist_size, sizeof(mov_editlist_t)); |
1889 for (i = 0; i < entries; i++) { | 1888 trak->editlist_size = trak->editlist ? entries : 0; |
1889 for (i = 0; i < trak->editlist_size; i++) { | |
1890 int dur = stream_read_dword(demuxer->stream); | 1890 int dur = stream_read_dword(demuxer->stream); |
1891 int mt = stream_read_dword(demuxer->stream); | 1891 int mt = stream_read_dword(demuxer->stream); |
1892 int mr = stream_read_dword(demuxer->stream); // 16.16fp | 1892 int mr = stream_read_dword(demuxer->stream); // 16.16fp |
1893 trak->editlist[i].dur = dur; | 1893 trak->editlist[i].dur = dur; |
1894 trak->editlist[i].pos = mt; | 1894 trak->editlist[i].pos = mt; |