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.
This commit is contained in:
wm4 2013-07-10 02:07:26 +02:00
parent 052d4ddbbb
commit 186f6021b1
4 changed files with 63 additions and 98 deletions

View File

@ -198,7 +198,6 @@ SOURCES = talloc.c \
demux/ebml.c \
demux/extension.c \
demux/mf.c \
demux/video.c \
osdep/io.c \
osdep/numcores.c \
osdep/timer.c \

View File

@ -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;

View File

@ -152,8 +152,4 @@ typedef struct sh_sub {
// demuxer.c:
struct sh_stream *new_sh_stream(struct demuxer *demuxer, enum stream_type type);
// video.c:
int video_read_frame(struct sh_video *sh_video, float *frame_time_ptr,
unsigned char **start, int force_fps);
#endif /* MPLAYER_STHEADER_H */

View File

@ -1,93 +0,0 @@
/*
* video frame reading
*
* This file is part of MPlayer.
*
* MPlayer is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* MPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libavutil/mem.h>
#include "core/mp_msg.h"
#include "stream/stream.h"
#include "demux.h"
#include "stheader.h"
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 decoded. --------------------
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;
}