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 {