Mercurial > mplayer.hg
comparison libmpdemux/muxer_mpeg.c @ 14840:d49482c5d8ac
soft telecine support! :)) patch by nico
author | rfelker |
---|---|
date | Sun, 27 Feb 2005 06:24:19 +0000 |
parents | d5683a00b74c |
children | 991f5a7b1b7d |
comparison
equal
deleted
inserted
replaced
14839:6e8905b4410c | 14840:d49482c5d8ac |
---|---|
73 static int conf_ts_allframes = 0; | 73 static int conf_ts_allframes = 0; |
74 static int conf_init_adelay = 0; | 74 static int conf_init_adelay = 0; |
75 static int conf_drop = 0; | 75 static int conf_drop = 0; |
76 static int conf_skip_padding = 0; | 76 static int conf_skip_padding = 0; |
77 static int conf_reorder = 0; | 77 static int conf_reorder = 0; |
78 static int conf_telecine = 0; | |
78 | 79 |
79 enum FRAME_TYPE { | 80 enum FRAME_TYPE { |
80 I_FRAME = 1, | 81 I_FRAME = 1, |
81 P_FRAME = 2, | 82 P_FRAME = 2, |
82 B_FRAME = 3 | 83 B_FRAME = 3 |
147 uint16_t framebuf_cnt; | 148 uint16_t framebuf_cnt; |
148 uint16_t framebuf_used; | 149 uint16_t framebuf_used; |
149 uint16_t max_pl_size; | 150 uint16_t max_pl_size; |
150 int32_t last_tr; | 151 int32_t last_tr; |
151 uint32_t max_tr; | 152 uint32_t max_tr; |
152 uint8_t id, reorder, is_mpeg12; | 153 uint8_t id, reorder, is_mpeg12, telecine; |
154 uint64_t vframes; | |
155 uint8_t rff, tff; | |
153 mp_mpeg_header_t picture; | 156 mp_mpeg_header_t picture; |
154 } muxer_headers_t; | 157 } muxer_headers_t; |
155 | 158 |
156 | 159 |
157 m_option_t mpegopts_conf[] = { | 160 m_option_t mpegopts_conf[] = { |
171 {"drop", &conf_drop, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | 174 {"drop", &conf_drop, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
172 {"tsaf", &conf_ts_allframes, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | 175 {"tsaf", &conf_ts_allframes, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
173 {"skip_padding", &conf_skip_padding, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | 176 {"skip_padding", &conf_skip_padding, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
174 {"reorder", &conf_reorder, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | 177 {"reorder", &conf_reorder, CONF_TYPE_FLAG, 0, 0, 1, NULL}, |
175 {"noreorder", &conf_reorder, CONF_TYPE_FLAG, 0, 0, 0, NULL}, | 178 {"noreorder", &conf_reorder, CONF_TYPE_FLAG, 0, 0, 0, NULL}, |
179 {"telecine", &conf_telecine, CONF_TYPE_FLAG, 0, 0, 1, NULL}, | |
180 {"telecine2", &conf_telecine, CONF_TYPE_FLAG, 0, 0, 2, NULL}, | |
176 {NULL, NULL, 0, 0, 0, 0, NULL} | 181 {NULL, NULL, 0, 0, 0, 0, NULL} |
177 }; | 182 }; |
178 | 183 |
179 static void fix_audio_sys_header(muxer_priv_t *priv, uint8_t id, uint8_t newid, uint32_t size) | 184 static void fix_audio_sys_header(muxer_priv_t *priv, uint8_t id, uint8_t newid, uint32_t size) |
180 { | 185 { |
389 if(priv->is_xvcd) | 394 if(priv->is_xvcd) |
390 spriv->min_pes_hlen = 18; | 395 spriv->min_pes_hlen = 18; |
391 else if(priv->is_xsvcd) | 396 else if(priv->is_xsvcd) |
392 spriv->min_pes_hlen = 22; | 397 spriv->min_pes_hlen = 22; |
393 spriv->reorder = conf_reorder; | 398 spriv->reorder = conf_reorder; |
399 spriv->telecine = conf_telecine; | |
394 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added video stream %d, ckid=%X\n", muxer->num_videos, s->ckid); | 400 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added video stream %d, ckid=%X\n", muxer->num_videos, s->ckid); |
395 } else { // MUXER_TYPE_AUDIO | 401 } else { // MUXER_TYPE_AUDIO |
396 spriv->type = 0; | 402 spriv->type = 0; |
397 spriv->pts = 1; | 403 spriv->pts = 1; |
398 spriv->dts = 0; | 404 spriv->dts = 0; |
1797 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR! unknown fps code: %d", fps); | 1803 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR! unknown fps code: %d", fps); |
1798 return 0; | 1804 return 0; |
1799 } | 1805 } |
1800 } | 1806 } |
1801 | 1807 |
1808 static int soft_telecine(muxer_headers_t *vpriv, uint8_t *fps_ptr, uint8_t *se_ptr, uint8_t *pce_ptr) | |
1809 { | |
1810 uint8_t fps; | |
1811 | |
1812 if(fps_ptr != NULL) | |
1813 { | |
1814 fps = *fps_ptr & 0x0f; | |
1815 if(fps > FRAMERATE_24) | |
1816 { | |
1817 mp_msg(MSGT_MUXER, MSGL_ERR, "\nERROR! FRAMERATE IS INVALID: %d, disabling telecining\n", (int) fps); | |
1818 vpriv->telecine = 0; | |
1819 return 0; | |
1820 } | |
1821 *fps_ptr = (*fps_ptr & 0xf0) | (fps + 3); | |
1822 } | |
1823 | |
1824 if(se_ptr && (vpriv->telecine==2)) | |
1825 se_ptr[1] &= 0xf7; | |
1826 | |
1827 if(! pce_ptr) | |
1828 return 0; | |
1829 | |
1830 //in pce_ptr starting from bit 0 bit 24 is tff, bit 30 is rff, | |
1831 if(pce_ptr[3] & 0x2) | |
1832 { | |
1833 mp_msg(MSGT_MUXER, MSGL_ERR, "\nERROR! RFF bit is already set, disabling telecining\n"); | |
1834 vpriv->telecine = 0; | |
1835 return 0; | |
1836 } | |
1837 | |
1838 if(! vpriv->vframes) //initial value of tff | |
1839 vpriv->tff = (pce_ptr[3] & 0x80) >> 7; | |
1840 | |
1841 //sets curent tff/rff bits | |
1842 mp_msg(MSGT_MUXER, MSGL_V, "\nTFF: %d, RFF: %d\n", vpriv->tff, vpriv->rff); | |
1843 pce_ptr[3] = (pce_ptr[3] & 0xfd) | ((vpriv->tff << 7) & 0x80) | ((vpriv->rff << 1) & 0x2); | |
1844 | |
1845 if(! vpriv->vframes) | |
1846 mp_msg(MSGT_MUXER, MSGL_INFO, "\nENABLED SOFT TELECINING, FPS=%s, INITIAL PATTERN IS TFF:%d, RFF:%d\n", | |
1847 framerates[fps+3], vpriv->tff, vpriv->rff); | |
1848 | |
1849 if(vpriv->rff) | |
1850 { | |
1851 vpriv->rff = 0; | |
1852 vpriv->tff = !vpriv->tff; | |
1853 } | |
1854 else | |
1855 vpriv->rff = 1; | |
1856 | |
1857 return 1; | |
1858 } | |
1859 | |
1802 static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_headers_t *spriv, float fps, size_t len) | 1860 static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_headers_t *spriv, float fps, size_t len) |
1803 { | 1861 { |
1804 size_t ptr = 0, sz = 0, tmp = 0; | 1862 size_t ptr = 0, sz = 0, tmp = 0; |
1863 uint8_t *fps_ptr = NULL; //pointer to the fps byte in the sequence header | |
1864 uint8_t *se_ptr = NULL; //pointer to sequence extension | |
1865 uint8_t *pce_ptr = NULL; //pointer to picture coding extension | |
1805 | 1866 |
1806 mp_msg(MSGT_MUXER, MSGL_V,"parse_mpeg12_video, len=%u\n", (uint32_t) len); | 1867 mp_msg(MSGT_MUXER, MSGL_V,"parse_mpeg12_video, len=%u\n", (uint32_t) len); |
1807 if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || len<6) | 1868 if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || len<6) |
1808 { | 1869 { |
1809 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%d!\n", len); | 1870 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%d!\n", len); |
1816 int pt; | 1877 int pt; |
1817 | 1878 |
1818 if(s->buffer[3] == 0xb3) //sequence | 1879 if(s->buffer[3] == 0xb3) //sequence |
1819 { | 1880 { |
1820 //uint8_t fps = s->buffer[7] & 0x0f; | 1881 //uint8_t fps = s->buffer[7] & 0x0f; |
1882 fps_ptr = &(s->buffer[7]); | |
1821 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[4])); | 1883 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[4])); |
1822 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps); | 1884 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps); |
1823 | 1885 |
1824 spriv->delta_clock = (double) 1/fps; | 1886 spriv->delta_clock = (double) 1/fps; |
1825 mp_msg(MSGT_MUXER, MSGL_V, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps); | 1887 mp_msg(MSGT_MUXER, MSGL_V, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps); |
1831 tmp += 64; | 1893 tmp += 64; |
1832 | 1894 |
1833 if(s->buffer[tmp-1] & 1) | 1895 if(s->buffer[tmp-1] & 1) |
1834 tmp += 64; | 1896 tmp += 64; |
1835 | 1897 |
1836 if(s->buffer[tmp] == 0 && s->buffer[tmp+1] == 0 && s->buffer[tmp+2] == 1 && s->buffer[tmp+3] == 0xb5) | 1898 if(s->buffer[tmp] == 0 && s->buffer[tmp+1] == 0 && s->buffer[tmp+2] == 1 && s->buffer[tmp+3] == 0xb5) |
1899 { | |
1900 se_ptr = &(s->buffer[tmp+4]); | |
1837 mp_header_process_extension(&(spriv->picture), &(s->buffer[tmp+4])); | 1901 mp_header_process_extension(&(spriv->picture), &(s->buffer[tmp+4])); |
1902 } | |
1838 } | 1903 } |
1839 | 1904 |
1840 | 1905 |
1841 if(spriv->picture.mpeg1 == 0 && priv->patch_sde) | 1906 if(spriv->picture.mpeg1 == 0 && priv->patch_sde) |
1842 { | 1907 { |
1877 while (ptr < len-5 && | 1942 while (ptr < len-5 && |
1878 (s->buffer[ptr] != 0 || s->buffer[ptr+1] != 0 || s->buffer[ptr+2] != 1 || s->buffer[ptr+3] != 0xb5)) | 1943 (s->buffer[ptr] != 0 || s->buffer[ptr+1] != 0 || s->buffer[ptr+2] != 1 || s->buffer[ptr+3] != 0xb5)) |
1879 ptr++; | 1944 ptr++; |
1880 if(ptr < len-5) | 1945 if(ptr < len-5) |
1881 { | 1946 { |
1947 pce_ptr = &(s->buffer[ptr+4]); | |
1882 mp_header_process_extension(&(spriv->picture), &(s->buffer[ptr+4])); | 1948 mp_header_process_extension(&(spriv->picture), &(s->buffer[ptr+4])); |
1883 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300) | 1949 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300) |
1884 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100; | 1950 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100; |
1885 } | 1951 } |
1886 else | 1952 else |
1911 break; | 1977 break; |
1912 default: // intra-coded | 1978 default: // intra-coded |
1913 sz = len; // no extra buffer for it... | 1979 sz = len; // no extra buffer for it... |
1914 } | 1980 } |
1915 | 1981 |
1982 if(spriv->telecine) | |
1983 soft_telecine(spriv, fps_ptr, se_ptr, pce_ptr); | |
1984 | |
1985 spriv->vframes++; | |
1916 reorder_frame(spriv, s->buffer, len, pt, temp_ref, spriv->delta_pts); | 1986 reorder_frame(spriv, s->buffer, len, pt, temp_ref, spriv->delta_pts); |
1917 } | 1987 } |
1918 | 1988 |
1919 mp_msg(MSGT_MUXER, MSGL_V,"parse_mpeg12_video, return %u\n", (uint32_t) len); | 1989 mp_msg(MSGT_MUXER, MSGL_V,"parse_mpeg12_video, return %u\n", (uint32_t) len); |
1920 return sz; | 1990 return sz; |
2086 } | 2156 } |
2087 else if(is_mpeg4(stream_format)) | 2157 else if(is_mpeg4(stream_format)) |
2088 { | 2158 { |
2089 spriv->is_mpeg12 = 0; | 2159 spriv->is_mpeg12 = 0; |
2090 spriv->reorder = 0; | 2160 spriv->reorder = 0; |
2161 spriv->telecine = 0; | |
2091 if(spriv->size == 0) | 2162 if(spriv->size == 0) |
2092 priv->use_psm = 1; | 2163 priv->use_psm = 1; |
2093 if(len) | 2164 if(len) |
2094 sz = parse_mpeg4_video(s, priv, spriv, fps, len); | 2165 sz = parse_mpeg4_video(s, priv, spriv, fps, len); |
2095 else { | 2166 else { |