summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-10 02:07:26 +0200
committerwm4 <wm4@nowhere>2013-07-10 02:07:26 +0200
commit186f6021b1aebd84dbb625d8747d5edaaf87dd38 (patch)
tree059932614b46a19dbc360d3d11b41b348dfe9fdc /core
parent052d4ddbbbc91e95e9e4b380423ddb2f67437888 (diff)
downloadmpv-186f6021b1aebd84dbb625d8747d5edaaf87dd38.tar.bz2
mpv-186f6021b1aebd84dbb625d8747d5edaaf87dd38.tar.xz
core: move code from demux/video.c to mplayer.c
Although I don't like putting even more crap into mplayer.c, this is a bit better, especially with coming cleanups in mind.
Diffstat (limited to 'core')
-rw-r--r--core/mplayer.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/core/mplayer.c b/core/mplayer.c
index b1a7209a97..2f5e103dd1 100644
--- a/core/mplayer.c
+++ b/core/mplayer.c
@@ -2483,6 +2483,69 @@ static void filter_video(struct MPContext *mpctx, struct mp_image *frame)
filter_output_queued_frame(mpctx);
}
+
+static int video_read_frame(sh_video_t *sh_video, float *frame_time_ptr,
+ unsigned char **start, int force_fps)
+{
+ demux_stream_t *d_video = sh_video->ds;
+ demuxer_t *demuxer = d_video->demuxer;
+ float frame_time = 1;
+ float pts1 = d_video->pts;
+ int in_size = 0;
+
+ *start = NULL;
+
+ // frame-based file formats: (AVI,ASF,MOV)
+ in_size = ds_get_packet(d_video, start);
+ if (in_size < 0)
+ return -1; // EOF
+
+ frame_time *= sh_video->frametime;
+
+ // override frame_time for variable/unknown FPS formats:
+ if (!force_fps) {
+ switch (demuxer->file_format) {
+ case DEMUXER_TYPE_MATROSKA:
+ case DEMUXER_TYPE_MNG:
+ if (d_video->pts > 0 && pts1 > 0 && d_video->pts>pts1)
+ frame_time = d_video->pts-pts1;
+ break;
+ case DEMUXER_TYPE_TV: {
+ double next_pts = ds_get_next_pts(d_video);
+ double d= (next_pts != MP_NOPTS_VALUE) ? next_pts - d_video->pts : d_video->pts-pts1;
+ if (d >= 0) {
+ if(d > 0){
+ if ((int)sh_video->fps == 1000)
+ mp_msg(MSGT_CPLAYER,MSGL_V,"\navg. framerate: %d fps \n",(int)(1.0f/d));
+ sh_video->frametime = d; // 1ms
+ sh_video->fps = 1.0f/d;
+ }
+ frame_time = d;
+ } else {
+ mp_msg(MSGT_CPLAYER,MSGL_WARN,"\nInvalid frame duration value (%5.3f/%5.3f => %5.3f). Defaulting to %5.3f sec.\n",d_video->pts,next_pts,d,frame_time);
+ // frame_time = 1/25.0;
+ }
+ break;
+ }
+ case DEMUXER_TYPE_LAVF:
+ if ((int)sh_video->fps == 1000 || (int)sh_video->fps <= 1) {
+ double next_pts = ds_get_next_pts(d_video);
+ double d = (next_pts != MP_NOPTS_VALUE) ? next_pts - d_video->pts : d_video->pts - pts1;
+ if(d>=0){
+ frame_time = d;
+ }
+ }
+ break;
+ }
+ }
+
+ sh_video->pts = d_video->pts;
+
+ if (frame_time_ptr)
+ *frame_time_ptr=frame_time;
+ return in_size;
+}
+
static double update_video_nocorrect_pts(struct MPContext *mpctx)
{
struct sh_video *sh_video = mpctx->sh_video;