Mercurial > mplayer.hg
changeset 21482:1dd284e31549
reimplemented :telecine and :film2pal in terms of dgpulldown
author | nicodvb |
---|---|
date | Mon, 04 Dec 2006 21:20:01 +0000 |
parents | 95c9f47c1cd8 |
children | e065bb0c5485 |
files | libmpdemux/muxer_mpeg.c |
diffstat | 1 files changed, 15 insertions(+), 76 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/muxer_mpeg.c Mon Dec 04 20:38:46 2006 +0000 +++ b/libmpdemux/muxer_mpeg.c Mon Dec 04 21:20:01 2006 +0000 @@ -1579,27 +1579,8 @@ if(fps_ptr != NULL) { fps = *fps_ptr & 0x0f; - if(((!fps) || (fps > FRAMERATE_24)) && vpriv->telecine != TELECINE_DGPULLDOWN) - { - mp_msg(MSGT_MUXER, MSGL_ERR, "\nERROR! FRAMERATE IS INVALID: %d, disabling telecining\n", (int) fps); - vpriv->telecine = 0; - return 0; - } - if(vpriv->telecine == TELECINE_FILM2PAL) - { - *fps_ptr = (*fps_ptr & 0xf0) | FRAMERATE_25; - vpriv->nom_delta_pts = parse_fps(25.0); - } - else if(vpriv->telecine == TELECINE_DGPULLDOWN) - { *fps_ptr = (*fps_ptr & 0xf0) | priv->vframerate; vpriv->nom_delta_pts = parse_fps(conf_vframerate); - } - else - { - *fps_ptr = (*fps_ptr & 0xf0) | (fps + 3); - vpriv->nom_delta_pts = parse_fps((fps + 3) == FRAMERATE_2997 ? 30000.0/1001.0 : 30.0); - } } //in pce_ptr starting from bit 0 bit 24 is tff, bit 30 is rff, @@ -1622,69 +1603,14 @@ while(n < 0) n+=period; vpriv->trf = (vpriv->trf + n) % period; - //sets curent tff/rff bits - if(vpriv->telecine == TELECINE_FILM2PAL) - { - //repeat 1 field every 12 frames - int rest1 = (vpriv->trf % period) == 11; - int rest2 = vpriv->vframes % 999; - - rff = 0; - if(rest1) - rff = 2; - - if(vpriv->real_framerate == FRAMERATE_23976) - { - //we have to inverse the 1/1000 framedrop, repeating two fields in a sequence of 999 frames - //486 and 978 are ideal because they are halfway in the sequence - //additionally x % 12 == 6 (halfway between two frames with rff set) - //and enough in advance to check if rest1 is valid too, - //so we can delay the setting of rff to current_frame+3 with no risk to leave the - //current sequence unpatched - if(rest2 == 486 || rest2 == 978) - { - if(rest1) - { - //delay the setting by 6 frames, so we don't have 2 consecutive rff - //and the transition will be smoother (halfway in the 12-frames sequence) - vpriv->delay_rff = 7; - mp_msg(MSGT_MUXER, MSGL_V, "\r\nDELAYED: %d\r\n", rest2); - } - else - rff = 2; - } - - if(!rest1 && vpriv->delay_rff) - { - vpriv->delay_rff--; - if(vpriv->delay_rff == 1) - { - rff = 2; - vpriv->delay_rff = 0; - mp_msg(MSGT_MUXER, MSGL_V, "\r\nRECOVERED: %d\r\n", rest2); - } - } - } - - pce_ptr[3] = (pce_ptr[3] & 0xfd) | rff; - } - else if(vpriv->telecine == TELECINE_DGPULLDOWN) - { pce_ptr[3] = (pce_ptr[3] & 0xfd) | bff_mask[vpriv->display_frame % MAX_PATTERN_LENGTH]; - } - else - { - tff = (vpriv->trf & 0x2) ? 0x80 : 0; - rff = (vpriv->trf & 0x1) ? 0x2 : 0; - pce_ptr[3] = (pce_ptr[3] & 0x7d) | tff | rff; - } pce_ptr[4] |= 0x80; //sets progressive frame mp_msg(MSGT_MUXER, MSGL_DBG2, "\nTRF: %d, TFF: %d, RFF: %d, n: %d\n", vpriv->trf, tff >> 7, rff >> 1, n); vpriv->display_frame += n; if(! vpriv->vframes) - mp_msg(MSGT_MUXER, MSGL_INFO, "\nENABLED SOFT TELECINING, FPS=%s, INITIAL PATTERN IS TFF:%d, RFF:%d\n", - framerates[(vpriv->telecine == TELECINE_FILM2PAL) ? FRAMERATE_25 : fps+3], tff >> 7, rff >> 1); + mp_msg(MSGT_MUXER, MSGL_INFO, "\nENABLED SOFT TELECINING, FPS=%.3f, INITIAL PATTERN IS TFF:%d, RFF:%d\n", + conf_vframerate, tff >> 7, rff >> 1); return 1; } @@ -2666,6 +2592,19 @@ conf_vframerate = 0; } + if(conf_telecine == TELECINE_FILM2PAL) + { + if(conf_telecine_src==0.0f) conf_telecine_src = 24000.0/1001.0; + conf_telecine_dest = 25; + conf_telecine = TELECINE_DGPULLDOWN; + } + else if(conf_telecine == PULLDOWN32) + { + if(conf_telecine_src==0.0f) conf_telecine_src = 24000.0/1001.0; + conf_telecine_dest = 30000.0/1001.0; + conf_telecine = TELECINE_DGPULLDOWN; + } + if(conf_telecine_src>0 && conf_telecine_dest>0 && conf_telecine_src < conf_telecine_dest) { int snum, sden, tnum, tden, sfps, tfps;