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;