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)