mirror of
https://github.com/mpv-player/mpv
synced 2025-04-17 04:40:09 +00:00
simplified parse_mpeg12_video()
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22348 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
ea63308d9a
commit
1bffdebffa
@ -1607,6 +1607,9 @@ static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_he
|
|||||||
uint8_t *pce_ptr = NULL; //pointer to picture coding extension
|
uint8_t *pce_ptr = NULL; //pointer to picture coding extension
|
||||||
int frames_diff, d1, gop_reset = 0; //how any frames we advanced respect to the last one
|
int frames_diff, d1, gop_reset = 0; //how any frames we advanced respect to the last one
|
||||||
int ret;
|
int ret;
|
||||||
|
int i, err;
|
||||||
|
uint32_t temp_ref;
|
||||||
|
int pt;
|
||||||
|
|
||||||
mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, len=%u\n", (uint32_t) len);
|
mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, len=%u\n", (uint32_t) len);
|
||||||
if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || len<6)
|
if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || len<6)
|
||||||
@ -1615,15 +1618,25 @@ static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_he
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s->buffer[3] == 0 || s->buffer[3] == 0xb3 || s->buffer[3] == 0xb8)
|
temp_ref = 0;
|
||||||
|
pt = 0;
|
||||||
|
err = 0;
|
||||||
|
i = 0;
|
||||||
|
while(i + 4 < len)
|
||||||
{ // Video (0) Sequence header (b3) or GOP (b8)
|
{ // Video (0) Sequence header (b3) or GOP (b8)
|
||||||
uint32_t temp_ref;
|
if((s->buffer[i] == 0) && (s->buffer[i+1] == 0) && (s->buffer[i+2] == 1))
|
||||||
int pt;
|
|
||||||
|
|
||||||
if(s->buffer[3] == 0xb3) //sequence
|
|
||||||
{
|
{
|
||||||
fps_ptr = &(s->buffer[7]);
|
switch(s->buffer[i+3])
|
||||||
mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[4]));
|
{
|
||||||
|
case 0xb3: //sequence
|
||||||
|
{
|
||||||
|
if(i + 11 > len)
|
||||||
|
{
|
||||||
|
err=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fps_ptr = &(s->buffer[i+7]);
|
||||||
|
mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[i+4]));
|
||||||
spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps);
|
spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps);
|
||||||
|
|
||||||
spriv->delta_clock = (double) 1/fps;
|
spriv->delta_clock = (double) 1/fps;
|
||||||
@ -1632,64 +1645,54 @@ static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_he
|
|||||||
spriv->delta_pts = spriv->nom_delta_pts = (uint64_t) ((double)27000000.0 * spriv->delta_clock );
|
spriv->delta_pts = spriv->nom_delta_pts = (uint64_t) ((double)27000000.0 * spriv->delta_clock );
|
||||||
mp_msg(MSGT_MUXER, MSGL_DBG2, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps);
|
mp_msg(MSGT_MUXER, MSGL_DBG2, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps);
|
||||||
if(priv->patch_seq)
|
if(priv->patch_seq)
|
||||||
patch_seq(priv, s->buffer);
|
patch_seq(priv, &(s->buffer[i]));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
tmp = 12;
|
case 0xb5:
|
||||||
if(s->buffer[tmp-1] & 2)
|
if(i + 9 > len)
|
||||||
tmp += 64;
|
|
||||||
|
|
||||||
if(s->buffer[tmp-1] & 1)
|
|
||||||
tmp += 64;
|
|
||||||
|
|
||||||
if(s->buffer[tmp] == 0 && s->buffer[tmp+1] == 0 && s->buffer[tmp+2] == 1 && s->buffer[tmp+3] == 0xb5)
|
|
||||||
{
|
{
|
||||||
se_ptr = &(s->buffer[tmp+4]);
|
err = 1;
|
||||||
mp_header_process_extension(&(spriv->picture), &(s->buffer[tmp+4]));
|
break;
|
||||||
}
|
}
|
||||||
}
|
mp_header_process_extension(&(spriv->picture), &(s->buffer[i+4]));
|
||||||
|
if(((s->buffer[i+4] & 0xf0) == 0x20))
|
||||||
|
|
||||||
if(spriv->picture.mpeg1 == 0 && priv->patch_sde)
|
|
||||||
{
|
{
|
||||||
while((s->buffer[tmp] != 0 || s->buffer[tmp+1] != 0 || s->buffer[tmp+2] != 1 || s->buffer[tmp+3] != 0xb5 ||
|
se_ptr = &(s->buffer[i+4]);
|
||||||
((s->buffer[tmp+4] & 0xf0) != 0x20)) &&
|
if(priv->patch_sde)
|
||||||
(tmp < len-5))
|
patch_panscan(priv, se_ptr);
|
||||||
tmp++;
|
|
||||||
|
|
||||||
if(tmp < len-5) //found
|
|
||||||
patch_panscan(priv, &(s->buffer[tmp+4]));
|
|
||||||
}
|
}
|
||||||
|
if((s->buffer[i+4] & 0xf0) == 0x80)
|
||||||
|
{
|
||||||
|
pce_ptr = &(s->buffer[i+4]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xb8:
|
||||||
if(s->buffer[3])
|
|
||||||
{ // Sequence or GOP -- scan for Picture
|
|
||||||
do_loop: while (ptr < len-5 &&
|
|
||||||
(s->buffer[ptr] != 0 || s->buffer[ptr+1] != 0 || s->buffer[ptr+2] != 1))
|
|
||||||
ptr++;
|
|
||||||
|
|
||||||
if(s->buffer[ptr+3] == 0xb8)
|
|
||||||
gop_reset = 1;
|
gop_reset = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
if(s->buffer[ptr+3]) //not frame
|
case 0x00:
|
||||||
|
if(i + 5 > len)
|
||||||
{
|
{
|
||||||
ptr++;
|
err = 1;
|
||||||
goto do_loop;
|
break;
|
||||||
}
|
}
|
||||||
|
pt = (s->buffer[i+5] & 0x1c) >> 3;
|
||||||
|
temp_ref = (s->buffer[i+4]<<2)+(s->buffer[i+5]>>6);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if(err) break; //something went wrong
|
||||||
|
if(s->buffer[i+3] >= 0x01 && s->buffer[i+3] <= 0xAF) break; //slice, we have already analized what we need
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(err)
|
||||||
|
mp_msg(MSGT_MUXER, MSGL_ERR,"Warning: picture too short or broken!\n");
|
||||||
|
|
||||||
if (ptr >= len-5)
|
|
||||||
{
|
|
||||||
pt = 0; // Picture not found?!
|
|
||||||
temp_ref = 0;
|
|
||||||
mp_msg(MSGT_MUXER, MSGL_ERR,"Warning: picture not found in GOP!\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//following 2 lines are workaround: lavf doesn't sync to sequence headers before passing demux_packets
|
//following 2 lines are workaround: lavf doesn't sync to sequence headers before passing demux_packets
|
||||||
if(!spriv->nom_delta_pts)
|
if(!spriv->nom_delta_pts)
|
||||||
spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps);
|
spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps);
|
||||||
pt = (s->buffer[ptr+5] & 0x1c) >> 3;
|
|
||||||
temp_ref = (s->buffer[ptr+4]<<2)+(s->buffer[ptr+5]>>6);
|
|
||||||
if(!spriv->vframes)
|
if(!spriv->vframes)
|
||||||
spriv->last_tr = spriv->max_tr = temp_ref;
|
spriv->last_tr = spriv->max_tr = temp_ref;
|
||||||
d1 = temp_ref - spriv->last_tr;
|
d1 = temp_ref - spriv->last_tr;
|
||||||
@ -1715,26 +1718,14 @@ static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_he
|
|||||||
spriv->last_tr = temp_ref;
|
spriv->last_tr = temp_ref;
|
||||||
if(spriv->picture.mpeg1 == 0)
|
if(spriv->picture.mpeg1 == 0)
|
||||||
{
|
{
|
||||||
size_t tmp = ptr;
|
if(spriv->telecine && pce_ptr)
|
||||||
|
|
||||||
while (ptr < len-5 &&
|
|
||||||
(s->buffer[ptr] != 0 || s->buffer[ptr+1] != 0 || s->buffer[ptr+2] != 1 || s->buffer[ptr+3] != 0xb5))
|
|
||||||
ptr++;
|
|
||||||
if(ptr < len-5)
|
|
||||||
{
|
{
|
||||||
pce_ptr = &(s->buffer[ptr+4]);
|
|
||||||
if(spriv->telecine)
|
|
||||||
soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff);
|
soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff);
|
||||||
spriv->picture.display_time = 100;
|
spriv->picture.display_time = 100;
|
||||||
mp_header_process_extension(&(spriv->picture), &(s->buffer[ptr+4]));
|
mp_header_process_extension(&(spriv->picture), pce_ptr);
|
||||||
if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300)
|
if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300)
|
||||||
spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100;
|
spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
spriv->delta_pts = spriv->nom_delta_pts;
|
|
||||||
|
|
||||||
ptr = tmp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(! spriv->vframes)
|
if(! spriv->vframes)
|
||||||
@ -1776,7 +1767,6 @@ static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_he
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
spriv->vframes++;
|
spriv->vframes++;
|
||||||
}
|
|
||||||
|
|
||||||
mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, return %u\n", (uint32_t) len);
|
mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, return %u\n", (uint32_t) len);
|
||||||
return len;
|
return len;
|
||||||
|
Loading…
Reference in New Issue
Block a user