Index: apps/plugins/mpegplayer/mpegplayer.c =================================================================== --- apps/plugins/mpegplayer/mpegplayer.c (revision 15864) +++ apps/plugins/mpegplayer/mpegplayer.c (working copy) @@ -1625,7 +1625,7 @@ { int skip = 0; /* Assume no skip */ - if (frame_drop_level >= 1 || skip_level > 0) + if (frame_drop_level == 1 || skip_level > 0) { /* A frame will be dropped in the decoder */ @@ -1636,34 +1636,45 @@ { case PIC_FLAG_CODING_TYPE_I: case PIC_FLAG_CODING_TYPE_D: - /* Level 5: Things are extremely late and all frames will be - dropped until the next key frame */ - if (frame_drop_level >= 1) - frame_drop_level = 0; /* Key frame - reset drop level */ - if (skip_level >= 5) + /* Things are extremely late and all frames will be + dropped until the next key frame (M=12 assumed) */ + if (skip_level >= 12) { - frame_drop_level = 1; - skip_level = 0; /* reset */ + skip = 1; + skip_level--; /* skip this frame */ + frame_drop_level = 1; /* wait for next key frame */ } + else + { + frame_drop_level = 0; /* no further wait for key frame */ + } break; case PIC_FLAG_CODING_TYPE_P: - /* Level 4: Things are very late and all frames will be - dropped until the next key frame */ - if (skip_level >= 4) + /* Things are very late and all frames will be dropped until + the next key frame. As we have to wait until the next key + frame, we only skip on delays >= 1/2 GOP */ + if (frame_drop_level == 1 || skip_level >= 12/2) { - frame_drop_level = 1; - skip_level = 0; /* reset */ + skip = 1; + skip_level--; /* skip this frame */ + frame_drop_level = 1; /* wait for next key frame */ } break; case PIC_FLAG_CODING_TYPE_B: /* We want to drop something, so this B frame won't even be decoded. Drawing can happen on the next frame if so desired. Bring the level down as skips are done. */ - skip = 1; if (skip_level > 0) - skip_level--; + { + skip = 1; + skip_level--; /* skip this frame */ + } + break; + default: + break; } - + + /* skip and ensure to wait for next key frame, if neccessary */ skip |= frame_drop_level; } @@ -1800,38 +1811,24 @@ goto picture_skip; } - if (skip_level == 3 && TIME_BEFORE(*rb->current_tick, last_render + HZ/2)) + if (skip_level > 0) { - /* Render drop was set previously but nothing was dropped in the - decoder or it's been to long since drawing the last frame. */ - skip_level = 0; + /* Frame skip was set previously but either there wasn't anything + dropped yet or not dropped enough. So we quit at least rendering + the actual frame to avoid further increase of a/v-drift. */ + skip_level--; num_skipped++; eta_early = INT32_MIN; goto picture_skip; } - + /* At this point a frame _will_ be drawn - a skip may happen on the next however */ - skip_level = 0; - if (offset > CLOCK_RATE*110/1000) - { - /* Decide which skip level is needed in order to catch up */ + /* Calculate number of frames to drop/skip whereas fps = */ + /* 27000000 / frame_period. */ + skip_level = (offset*27000000ll) / info->sequence->frame_period / CLOCK_RATE; - /* TODO: Calculate this rather than if...else - this is rather - exponential though */ - if (offset > CLOCK_RATE*367/1000) - skip_level = 5; /* Decoder skip: I/D */ - if (offset > CLOCK_RATE*233/1000) - skip_level = 4; /* Decoder skip: P */ - else if (offset > CLOCK_RATE*167/1000) - skip_level = 3; /* Render skip */ - else if (offset > CLOCK_RATE*133/1000) - skip_level = 2; /* Decoder skip: B */ - else - skip_level = 1; /* Decoder skip: B */ - } - picture_wait: /* Wait until audio catches up */ if (video_thumb_print)