Mercurial > libavformat.hg
comparison mov.c @ 1020:32cfbb9cdbdd libavformat
fixing current_sample vs. next_sample mess
author | michael |
---|---|
date | Tue, 21 Mar 2006 18:32:58 +0000 |
parents | 90cb439ffca9 |
children | 1d2d3a9f2c30 |
comparison
equal
deleted
inserted
replaced
1019:a9d8381ff40d | 1020:32cfbb9cdbdd |
---|---|
1691 MOVStreamContext *sc; | 1691 MOVStreamContext *sc; |
1692 AVStream *st; | 1692 AVStream *st; |
1693 int64_t offset = INT64_MAX; | 1693 int64_t offset = INT64_MAX; |
1694 int64_t best_dts = INT64_MAX; | 1694 int64_t best_dts = INT64_MAX; |
1695 int i, a, b, m; | 1695 int i, a, b, m; |
1696 int next_sample= -99; | |
1696 int size; | 1697 int size; |
1697 int idx; | 1698 int idx; |
1698 size = 0x0FFFFFFF; | 1699 size = 0x0FFFFFFF; |
1699 | 1700 |
1700 if (mov->partial) { | 1701 if (mov->partial) { |
1706 //size = sc->sample_sizes[sc->current_sample]; | 1707 //size = sc->sample_sizes[sc->current_sample]; |
1707 // that ain't working... | 1708 // that ain't working... |
1708 //size = (sc->sample_size)?sc->sample_size:sc->sample_sizes[sc->current_sample]; | 1709 //size = (sc->sample_size)?sc->sample_size:sc->sample_sizes[sc->current_sample]; |
1709 size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; | 1710 size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; |
1710 | 1711 |
1711 sc->current_sample++; | 1712 next_sample= sc->current_sample+1; |
1713 | |
1712 sc->left_in_chunk--; | 1714 sc->left_in_chunk--; |
1713 | 1715 |
1714 if (sc->left_in_chunk <= 0) | 1716 if (sc->left_in_chunk <= 0) |
1715 mov->partial = 0; | 1717 mov->partial = 0; |
1716 offset = mov->next_chunk_offset; | 1718 offset = mov->next_chunk_offset; |
1732 int index= msc->sample_to_time_index; | 1734 int index= msc->sample_to_time_index; |
1733 int sample= msc->sample_to_time_sample; | 1735 int sample= msc->sample_to_time_sample; |
1734 int time= msc->sample_to_time_time; | 1736 int time= msc->sample_to_time_time; |
1735 int duration = msc->stts_data[index].duration; | 1737 int duration = msc->stts_data[index].duration; |
1736 int count = msc->stts_data[index].count; | 1738 int count = msc->stts_data[index].count; |
1737 if (sample + count < msc->current_sample) { | 1739 if (sample + count <= msc->current_sample) { |
1738 sample += count; | 1740 sample += count; |
1739 time += count*duration; | 1741 time += count*duration; |
1740 index ++; | 1742 index ++; |
1741 duration = msc->stts_data[index].duration; | 1743 duration = msc->stts_data[index].duration; |
1742 } | 1744 } |
1743 dts = time + (msc->current_sample-1 - sample) * (int64_t)duration; | 1745 dts = time + (msc->current_sample - sample) * (int64_t)duration; |
1744 dts = av_rescale(dts, AV_TIME_BASE, msc->time_scale); | 1746 dts = av_rescale(dts, AV_TIME_BASE, msc->time_scale); |
1745 dprintf("stream: %d dts: %"PRId64" best_dts: %"PRId64" offset: %"PRId64"\n", i, dts, best_dts, offset); | 1747 dprintf("stream: %d dts: %"PRId64" best_dts: %"PRId64" offset: %"PRId64"\n", i, dts, best_dts, offset); |
1746 if(dts < best_dts){ | 1748 if(dts < best_dts){ |
1747 best_dts= dts; | 1749 best_dts= dts; |
1748 sc = msc; | 1750 sc = msc; |
1815 /* we'll have to get those samples before next chunk */ | 1817 /* we'll have to get those samples before next chunk */ |
1816 sc->left_in_chunk = sc->sample_to_chunk[idx].count - 1; | 1818 sc->left_in_chunk = sc->sample_to_chunk[idx].count - 1; |
1817 size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; | 1819 size = (sc->sample_size > 1)?sc->sample_size:sc->sample_sizes[sc->current_sample]; |
1818 } | 1820 } |
1819 | 1821 |
1820 sc->current_sample++; | 1822 next_sample= sc->current_sample+1; |
1821 }else if(idx + 1 < sc->sample_to_chunk_sz){ | 1823 }else if(idx < sc->sample_to_chunk_sz){ |
1822 sc->current_sample += sc->sample_to_chunk[idx].count; | 1824 next_sample= sc->current_sample + sc->sample_to_chunk[idx].count; |
1823 } | 1825 }else |
1826 next_sample= sc->current_sample; | |
1824 | 1827 |
1825 readchunk: | 1828 readchunk: |
1826 dprintf("chunk: %"PRId64" -> %"PRId64" (%i)\n", offset, offset + size, size); | 1829 dprintf("chunk: %"PRId64" -> %"PRId64" (%i)\n", offset, offset + size, size); |
1827 if(size == 0x0FFFFFFF) | 1830 if(size == 0x0FFFFFFF) |
1828 size = mov->mdat_size + mov->mdat_offset - offset; | 1831 size = mov->mdat_size + mov->mdat_offset - offset; |
1862 if (sc && sc->sample_to_time_index < sc->stts_count && pkt) { | 1865 if (sc && sc->sample_to_time_index < sc->stts_count && pkt) { |
1863 unsigned int count; | 1866 unsigned int count; |
1864 uint64_t dts, pts; | 1867 uint64_t dts, pts; |
1865 unsigned int duration = sc->stts_data[sc->sample_to_time_index].duration; | 1868 unsigned int duration = sc->stts_data[sc->sample_to_time_index].duration; |
1866 count = sc->stts_data[sc->sample_to_time_index].count; | 1869 count = sc->stts_data[sc->sample_to_time_index].count; |
1867 if ((sc->sample_to_time_sample + count) < sc->current_sample) { | 1870 if ((sc->sample_to_time_sample + count) <= sc->current_sample) { |
1868 sc->sample_to_time_sample += count; | 1871 sc->sample_to_time_sample += count; |
1869 sc->sample_to_time_time += count*duration; | 1872 sc->sample_to_time_time += count*duration; |
1870 sc->sample_to_time_index ++; | 1873 sc->sample_to_time_index ++; |
1871 duration = sc->stts_data[sc->sample_to_time_index].duration; | 1874 duration = sc->stts_data[sc->sample_to_time_index].duration; |
1872 } | 1875 } |
1873 dts = sc->sample_to_time_time + (sc->current_sample-1 - sc->sample_to_time_sample) * (int64_t)duration; | 1876 dts = sc->sample_to_time_time + (sc->current_sample - sc->sample_to_time_sample) * (int64_t)duration; |
1874 /* find the corresponding pts */ | 1877 /* find the corresponding pts */ |
1875 if (sc->sample_to_ctime_index < sc->ctts_count) { | 1878 if (sc->sample_to_ctime_index < sc->ctts_count) { |
1876 int duration = sc->ctts_data[sc->sample_to_ctime_index].duration; | 1879 int duration = sc->ctts_data[sc->sample_to_ctime_index].duration; |
1877 int count = sc->ctts_data[sc->sample_to_ctime_index].count; | 1880 int count = sc->ctts_data[sc->sample_to_ctime_index].count; |
1878 | 1881 |
1879 if ((sc->sample_to_ctime_sample + count) < sc->current_sample) { | 1882 if ((sc->sample_to_ctime_sample + count) <= sc->current_sample) { |
1880 sc->sample_to_ctime_sample += count; | 1883 sc->sample_to_ctime_sample += count; |
1881 sc->sample_to_ctime_index ++; | 1884 sc->sample_to_ctime_index ++; |
1882 duration = sc->ctts_data[sc->sample_to_ctime_index].duration; | 1885 duration = sc->ctts_data[sc->sample_to_ctime_index].duration; |
1883 } | 1886 } |
1884 pts = dts + duration; | 1887 pts = dts + duration; |
1898 , sc->sample_to_time_index | 1901 , sc->sample_to_time_index |
1899 , sc->stts_count | 1902 , sc->stts_count |
1900 , count | 1903 , count |
1901 , duration); | 1904 , duration); |
1902 } | 1905 } |
1906 | |
1907 assert(next_sample>=0); | |
1908 sc->current_sample= next_sample; | |
1903 | 1909 |
1904 return 0; | 1910 return 0; |
1905 } | 1911 } |
1906 | 1912 |
1907 #if defined(MOV_SEEK) | 1913 #if defined(MOV_SEEK) |