mirror of
https://github.com/mpv-player/mpv
synced 2024-09-09 01:16:56 +02:00
Create a context struct for OSD state
This commit creates the struct and passes it to some functions that needs to access OSD state but does not yet move much data from globals to it. vf_expand accesses the OSD state for rendering purposes outside of the normal OSD draw time. The way this currently works is suboptimal, but I did not attempt to clean it up now. To keep things working the same way vf_expand needs to know the address of the state object to be able to access the data even in the functions that should normally not need it. For that purpose this commit adds a VFCTRL to tell vf_expand the address of the object.
This commit is contained in:
parent
de560e8167
commit
a232f564d3
@ -446,7 +446,8 @@ void *decode_video(sh_video_t *sh_video, unsigned char *start, int in_size,
|
||||
return mpi;
|
||||
}
|
||||
|
||||
int filter_video(sh_video_t *sh_video, void *frame, double pts)
|
||||
int filter_video(sh_video_t *sh_video, void *frame, double pts,
|
||||
struct osd_state *osd)
|
||||
{
|
||||
mp_image_t *mpi = frame;
|
||||
unsigned int t2 = GetTimer();
|
||||
@ -454,7 +455,7 @@ int filter_video(sh_video_t *sh_video, void *frame, double pts)
|
||||
// apply video filters and call the leaf vo/ve
|
||||
int ret = vf->put_image(vf, mpi, pts);
|
||||
if (ret > 0) {
|
||||
vf->control(vf, VFCTRL_DRAW_OSD, NULL);
|
||||
vf->control(vf, VFCTRL_DRAW_OSD, osd);
|
||||
#ifdef USE_ASS
|
||||
vf->control(vf, VFCTRL_DRAW_EOSD, NULL);
|
||||
#endif
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
#include "libmpdemux/stheader.h"
|
||||
|
||||
struct osd_state;
|
||||
|
||||
// dec_video.c:
|
||||
extern void vfm_help(void);
|
||||
|
||||
@ -10,7 +12,8 @@ extern int init_best_video_codec(sh_video_t *sh_video,char** video_codec_list,ch
|
||||
extern void uninit_video(sh_video_t *sh_video);
|
||||
|
||||
extern void *decode_video(sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame, double pts);
|
||||
extern int filter_video(sh_video_t *sh_video, void *frame, double pts);
|
||||
extern int filter_video(sh_video_t *sh_video, void *frame, double pts,
|
||||
struct osd_state *osd);
|
||||
|
||||
extern int get_video_quality_max(sh_video_t *sh_video);
|
||||
extern void set_video_quality(sh_video_t *sh_video,int quality);
|
||||
|
@ -88,6 +88,9 @@ typedef struct vf_seteq_s
|
||||
#define VFCTRL_GET_PTS 17 /* Return last pts value that reached vf_vo*/
|
||||
#define VFCTRL_SET_DEINTERLACE 18 /* Set deinterlacing status */
|
||||
#define VFCTRL_GET_DEINTERLACE 19 /* Get deinterlacing status */
|
||||
/* Hack to make the OSD state object available to vf_expand which accesses
|
||||
* the OSD state outside of normal OSD draw time. */
|
||||
#define VFCTRL_SET_OSD_OBJ 20
|
||||
|
||||
#include "vfcap.h"
|
||||
|
||||
|
@ -28,12 +28,13 @@
|
||||
static struct vf_priv_s {
|
||||
int exp_w,exp_h;
|
||||
int exp_x,exp_y;
|
||||
int osd;
|
||||
int osd_enabled;
|
||||
double aspect;
|
||||
int round;
|
||||
unsigned char* fb_ptr;
|
||||
int passthrough;
|
||||
int first_slice;
|
||||
struct osd_state *osd;
|
||||
} const vf_priv_dflt = {
|
||||
-1,-1,
|
||||
-1,-1,
|
||||
@ -172,10 +173,10 @@ static void draw_osd(struct vf_instance* vf_,int w,int h){
|
||||
remove_func_2(vf->priv->exp_x+w,vf->priv->exp_y,vf->priv->exp_w-w-vf->priv->exp_x,h);
|
||||
} else {
|
||||
// partial clear:
|
||||
vo_remove_text(vf->priv->exp_w,vf->priv->exp_h,remove_func);
|
||||
osd_remove_text(vf->priv->osd, vf->priv->exp_w,vf->priv->exp_h,remove_func);
|
||||
}
|
||||
}
|
||||
osd_draw_text(vf->priv->exp_w,vf->priv->exp_h,draw_func, NULL);
|
||||
osd_draw_text(vf->priv->osd, vf->priv->exp_w,vf->priv->exp_h,draw_func, NULL);
|
||||
// save buffer pointer for double buffering detection - yes, i know it's
|
||||
// ugly method, but note that codecs with DR support does the same...
|
||||
if(vf->dmpi)
|
||||
@ -241,9 +242,9 @@ static int config(struct vf_instance* vf,
|
||||
static void get_image(struct vf_instance* vf, mp_image_t *mpi){
|
||||
// if(mpi->type==MP_IMGTYPE_IPB) return; // not yet working
|
||||
#ifdef OSD_SUPPORT
|
||||
if(vf->priv->osd && (mpi->flags&MP_IMGFLAG_PRESERVE)){
|
||||
if(vf->priv->osd_enabled && (mpi->flags&MP_IMGFLAG_PRESERVE)){
|
||||
// check if we have to render osd!
|
||||
vo_update_osd(vf->priv->exp_w, vf->priv->exp_h);
|
||||
osd_update(vf->priv->osd, vf->priv->exp_w, vf->priv->exp_h);
|
||||
if(vo_osd_check_range_update(vf->priv->exp_x,vf->priv->exp_y,
|
||||
vf->priv->exp_x+mpi->w,vf->priv->exp_y+mpi->h)) return;
|
||||
}
|
||||
@ -368,7 +369,7 @@ static int put_image(struct vf_instance* vf, mp_image_t *mpi, double pts){
|
||||
if(!vf->dmpi) { mp_msg(MSGT_VFILTER, MSGL_WARN, MSGTR_MPCODECS_FunWhydowegetNULL); return 0; }
|
||||
mpi->priv=NULL;
|
||||
#ifdef OSD_SUPPORT
|
||||
if(vf->priv->osd) draw_osd(vf,mpi->w,mpi->h);
|
||||
if(vf->priv->osd_enabled) draw_osd(vf,mpi->w,mpi->h);
|
||||
#endif
|
||||
// we've used DR, so we're ready...
|
||||
if(!(mpi->flags&MP_IMGFLAG_PLANAR))
|
||||
@ -403,7 +404,7 @@ static int put_image(struct vf_instance* vf, mp_image_t *mpi, double pts){
|
||||
vf->dmpi->planes[1] = mpi->planes[1]; // passthrough rgb8 palette
|
||||
}
|
||||
#ifdef OSD_SUPPORT
|
||||
if(vf->priv->osd) draw_osd(vf,mpi->w,mpi->h);
|
||||
if(vf->priv->osd_enabled) draw_osd(vf,mpi->w,mpi->h);
|
||||
#endif
|
||||
return vf_next_put_image(vf,vf->dmpi, pts);
|
||||
}
|
||||
@ -413,8 +414,11 @@ static int put_image(struct vf_instance* vf, mp_image_t *mpi, double pts){
|
||||
static int control(struct vf_instance* vf, int request, void* data){
|
||||
#ifdef OSD_SUPPORT
|
||||
switch(request){
|
||||
case VFCTRL_SET_OSD_OBJ:
|
||||
vf->priv->osd = data;
|
||||
break;
|
||||
case VFCTRL_DRAW_OSD:
|
||||
if(vf->priv->osd) return CONTROL_TRUE;
|
||||
if(vf->priv->osd_enabled) return CONTROL_TRUE;
|
||||
}
|
||||
#endif
|
||||
return vf_next_control(vf,request,data);
|
||||
@ -437,7 +441,7 @@ static int open(vf_instance_t *vf, char* args){
|
||||
vf->priv->exp_h,
|
||||
vf->priv->exp_x,
|
||||
vf->priv->exp_y,
|
||||
vf->priv->osd,
|
||||
vf->priv->osd_enabled,
|
||||
vf->priv->aspect,
|
||||
vf->priv->round);
|
||||
return 1;
|
||||
@ -449,7 +453,7 @@ static const m_option_t vf_opts_fields[] = {
|
||||
{"h", ST_OFF(exp_h), CONF_TYPE_INT, 0, 0 ,0, NULL},
|
||||
{"x", ST_OFF(exp_x), CONF_TYPE_INT, M_OPT_MIN, -1, 0, NULL},
|
||||
{"y", ST_OFF(exp_y), CONF_TYPE_INT, M_OPT_MIN, -1, 0, NULL},
|
||||
{"osd", ST_OFF(osd), CONF_TYPE_FLAG, 0 , 0, 1, NULL},
|
||||
{"osd", ST_OFF(osd_enabled), CONF_TYPE_FLAG, 0 , 0, 1, NULL},
|
||||
{"aspect", ST_OFF(aspect), CONF_TYPE_DOUBLE, M_OPT_MIN, 0, 0, NULL},
|
||||
{"round", ST_OFF(round), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL},
|
||||
{ NULL, NULL, 0, 0, 0, 0, NULL }
|
||||
|
@ -86,7 +86,7 @@ static int control(struct vf_instance* vf, int request, void* data)
|
||||
}
|
||||
case VFCTRL_DRAW_OSD:
|
||||
if(!video_out->config_ok) return CONTROL_FALSE; // vo not configured?
|
||||
vo_draw_osd(video_out);
|
||||
vo_draw_osd(video_out, data);
|
||||
return CONTROL_TRUE;
|
||||
case VFCTRL_FLIP_PAGE:
|
||||
{
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "sub.h"
|
||||
|
||||
struct vo *global_vo;
|
||||
struct osd_state *global_osd;
|
||||
|
||||
int old_vo_preinit(struct vo *vo, const char *arg)
|
||||
{
|
||||
@ -59,8 +60,9 @@ int old_vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[],
|
||||
}
|
||||
|
||||
|
||||
void old_vo_draw_osd(struct vo *vo)
|
||||
void old_vo_draw_osd(struct vo *vo, struct osd_state *osd)
|
||||
{
|
||||
global_osd = osd;
|
||||
vo->driver->old_functions->draw_osd();
|
||||
}
|
||||
|
||||
@ -94,6 +96,10 @@ static void draw_alpha_wrapper(void *ctx, int x0, int y0, int w, int h,
|
||||
|
||||
void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride))
|
||||
{
|
||||
osd_draw_text(dxs, dys, draw_alpha_wrapper, draw_alpha);
|
||||
osd_draw_text(global_osd, dxs, dys, draw_alpha_wrapper, draw_alpha);
|
||||
}
|
||||
|
||||
int vo_update_osd(int dxs, int dys)
|
||||
{
|
||||
return osd_update(global_osd, dxs, dys);
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "video_out.h"
|
||||
|
||||
extern struct vo *global_vo;
|
||||
extern struct osd_state *global_osd;
|
||||
|
||||
int old_vo_preinit(struct vo *vo, const char *);
|
||||
int old_vo_config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
@ -14,11 +15,12 @@ int old_vo_control(struct vo *vo, uint32_t request, void *data);
|
||||
int old_vo_draw_frame(struct vo *vo, uint8_t *src[]);
|
||||
int old_vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[],
|
||||
int w, int h, int x, int y);
|
||||
void old_vo_draw_osd(struct vo *vo);
|
||||
void old_vo_draw_osd(struct vo *vo, struct osd_state *osd);
|
||||
void old_vo_flip_page(struct vo *vo);
|
||||
void old_vo_check_events(struct vo *vo);
|
||||
void old_vo_uninit(struct vo *vo);
|
||||
|
||||
void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
|
||||
int vo_update_osd(int dxs, int dys);
|
||||
|
||||
#endif
|
||||
|
43
libvo/sub.c
43
libvo/sub.c
@ -19,6 +19,7 @@
|
||||
#include "osdep/timer.h"
|
||||
#endif
|
||||
|
||||
#include "talloc.h"
|
||||
#include "mplayer.h"
|
||||
#include "mp_msg.h"
|
||||
#include "help_mp.h"
|
||||
@ -72,7 +73,6 @@ char * const sub_osd_names_short[] ={ "", "|>", "||", "[]", "<<" , ">>", "", "",
|
||||
font_desc_t* vo_font=NULL;
|
||||
font_desc_t* sub_font=NULL;
|
||||
|
||||
unsigned char* vo_osd_text=NULL;
|
||||
#ifdef HAVE_TV_TELETEXT
|
||||
void* vo_osd_teletext_page=NULL;
|
||||
int vo_osd_teletext_half = 0;
|
||||
@ -181,8 +181,10 @@ no_utf8:
|
||||
return c;
|
||||
}
|
||||
|
||||
inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){
|
||||
const char *cp=vo_osd_text;
|
||||
inline static void vo_update_text_osd(struct osd_state *osd, mp_osd_obj_t* obj,
|
||||
int dxs, int dys)
|
||||
{
|
||||
const char *cp = osd->osd_text;
|
||||
int x=20;
|
||||
int h=0;
|
||||
int font;
|
||||
@ -203,7 +205,7 @@ inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){
|
||||
|
||||
alloc_buf(obj);
|
||||
|
||||
cp=vo_osd_text;
|
||||
cp = osd->osd_text;
|
||||
x = obj->x;
|
||||
while (*cp){
|
||||
uint16_t c=utf8_get_char(&cp);
|
||||
@ -1050,7 +1052,8 @@ static mp_osd_obj_t* new_osd_obj(int type){
|
||||
return osd;
|
||||
}
|
||||
|
||||
void free_osd_list(void){
|
||||
void osd_free(struct osd_state *osd)
|
||||
{
|
||||
mp_osd_obj_t* obj=vo_osd_list;
|
||||
while(obj){
|
||||
mp_osd_obj_t* next=obj->next;
|
||||
@ -1060,11 +1063,13 @@ void free_osd_list(void){
|
||||
obj=next;
|
||||
}
|
||||
vo_osd_list=NULL;
|
||||
talloc_free(osd);
|
||||
}
|
||||
|
||||
#define FONT_LOAD_DEFER 6
|
||||
|
||||
int vo_update_osd(int dxs,int dys){
|
||||
int osd_update(struct osd_state *osd, int dxs, int dys)
|
||||
{
|
||||
mp_osd_obj_t* obj=vo_osd_list;
|
||||
int chg=0;
|
||||
#ifdef HAVE_FREETYPE
|
||||
@ -1142,8 +1147,8 @@ int vo_update_osd(int dxs,int dys){
|
||||
obj->flags&=~OSDFLAG_VISIBLE;
|
||||
break;
|
||||
case OSDTYPE_OSD:
|
||||
if(vo_font && vo_osd_text && vo_osd_text[0]){
|
||||
vo_update_text_osd(obj,dxs,dys); // update bbox
|
||||
if(vo_font && osd->osd_text[0]){
|
||||
vo_update_text_osd(osd, obj, dxs, dys); // update bbox
|
||||
obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
|
||||
} else
|
||||
obj->flags&=~OSDFLAG_VISIBLE;
|
||||
@ -1183,12 +1188,15 @@ int vo_update_osd(int dxs,int dys){
|
||||
return chg;
|
||||
}
|
||||
|
||||
void vo_init_osd(void){
|
||||
struct osd_state *osd_create(void)
|
||||
{
|
||||
struct osd_state *osd = talloc_ptrtype(NULL, osd);
|
||||
*osd = (struct osd_state){
|
||||
};
|
||||
if(!draw_alpha_init_flag){
|
||||
draw_alpha_init_flag=1;
|
||||
vo_draw_alpha_init();
|
||||
}
|
||||
if(vo_osd_list) free_osd_list();
|
||||
// temp hack, should be moved to mplayer/mencoder later
|
||||
new_osd_obj(OSDTYPE_OSD);
|
||||
new_osd_obj(OSDTYPE_SUBTITLE);
|
||||
@ -1203,13 +1211,16 @@ void vo_init_osd(void){
|
||||
#ifdef HAVE_FREETYPE
|
||||
force_load_font = 1;
|
||||
#endif
|
||||
return osd;
|
||||
}
|
||||
|
||||
int vo_osd_changed_flag=0;
|
||||
|
||||
void vo_remove_text(int dxs,int dys,void (*remove)(int x0,int y0, int w,int h)){
|
||||
void osd_remove_text(struct osd_state *osd, int dxs, int dys,
|
||||
void (*remove)(int x0, int y0, int w, int h))
|
||||
{
|
||||
mp_osd_obj_t* obj=vo_osd_list;
|
||||
vo_update_osd(dxs,dys);
|
||||
osd_update(osd, dxs, dys);
|
||||
while(obj){
|
||||
if(((obj->flags&OSDFLAG_CHANGED) || (obj->flags&OSDFLAG_VISIBLE)) &&
|
||||
(obj->flags&OSDFLAG_OLD_BBOX)){
|
||||
@ -1225,10 +1236,14 @@ void vo_remove_text(int dxs,int dys,void (*remove)(int x0,int y0, int w,int h)){
|
||||
}
|
||||
}
|
||||
|
||||
void osd_draw_text(int dxs,int dys,void (*draw_alpha)(void *ctx, int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride), void *ctx)
|
||||
void osd_draw_text(struct osd_state *osd, int dxs, int dys,
|
||||
void (*draw_alpha)(void *ctx, int x0, int y0, int w, int h,
|
||||
unsigned char* src, unsigned char *srca,
|
||||
int stride),
|
||||
void *ctx)
|
||||
{
|
||||
mp_osd_obj_t* obj=vo_osd_list;
|
||||
vo_update_osd(dxs,dys);
|
||||
osd_update(osd, dxs, dys);
|
||||
while(obj){
|
||||
if(obj->flags&OSDFLAG_VISIBLE){
|
||||
vo_osd_changed_flag=obj->flags&OSDFLAG_CHANGED; // temp hack
|
||||
|
25
libvo/sub.h
25
libvo/sub.h
@ -49,14 +49,15 @@ typedef struct mp_osd_obj_s {
|
||||
unsigned char *bitmap_buffer;
|
||||
} mp_osd_obj_t;
|
||||
|
||||
struct osd_state {
|
||||
unsigned char osd_text[64];
|
||||
};
|
||||
|
||||
#include "subreader.h"
|
||||
|
||||
extern sub_data* subdata; //currently used subtitles
|
||||
extern subtitle* vo_sub;
|
||||
|
||||
extern unsigned char* vo_osd_text;
|
||||
|
||||
extern void* vo_osd_teletext_page;
|
||||
extern int vo_osd_teletext_half;
|
||||
extern int vo_osd_teletext_mode;
|
||||
@ -108,14 +109,19 @@ extern float spu_gaussvar;
|
||||
//extern void vo_draw_text_osd(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
|
||||
//extern void vo_draw_text_progbar(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
|
||||
//extern void vo_draw_text_sub(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride));
|
||||
extern void osd_draw_text(int dxs,int dys,void (*draw_alpha)(void *ctx, int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride), void *ctx);
|
||||
extern void vo_remove_text(int dxs,int dys,void (*remove)(int x0,int y0, int w,int h));
|
||||
void osd_draw_text(struct osd_state *osd, int dxs, int dys,
|
||||
void (*draw_alpha)(void *ctx, int x0, int y0, int w, int h,
|
||||
unsigned char* src, unsigned char *srca,
|
||||
int stride),
|
||||
void *ctx);
|
||||
void osd_remove_text(struct osd_state *osd, int dxs, int dys,
|
||||
void (*remove)(int x0, int y0, int w, int h));
|
||||
|
||||
void vo_init_osd(void);
|
||||
int vo_update_osd(int dxs,int dys);
|
||||
struct osd_state *osd_create(void);
|
||||
int osd_update(struct osd_state *osd, int dxs, int dys);
|
||||
int vo_osd_changed(int new_value);
|
||||
int vo_osd_check_range_update(int,int,int,int);
|
||||
void free_osd_list(void);
|
||||
void osd_free(struct osd_state *osd);
|
||||
|
||||
extern int vo_osd_changed_flag;
|
||||
|
||||
@ -126,4 +132,9 @@ unsigned utf8_get_char(const char **str);
|
||||
void osd_set_nav_box (uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef IS_OLD_VO
|
||||
#define vo_remove_text(...) osd_remove_text(global_osd, __VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#endif /* MPLAYER_SUB_H */
|
||||
|
@ -256,11 +256,11 @@ int vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[], int w, int h, int
|
||||
return vo->driver->draw_slice(vo, src, stride, w, h, x, y);
|
||||
}
|
||||
|
||||
void vo_draw_osd(struct vo *vo)
|
||||
void vo_draw_osd(struct vo *vo, struct osd_state *osd)
|
||||
{
|
||||
if (!vo->config_ok)
|
||||
return;
|
||||
vo->driver->draw_osd(vo);
|
||||
vo->driver->draw_osd(vo, osd);
|
||||
}
|
||||
|
||||
void vo_flip_page(struct vo *vo)
|
||||
|
@ -117,6 +117,7 @@ typedef struct vo_info_s
|
||||
} vo_info_t;
|
||||
|
||||
struct vo;
|
||||
struct osd_state;
|
||||
|
||||
struct vo_driver {
|
||||
// Driver uses new API
|
||||
@ -173,7 +174,7 @@ struct vo_driver {
|
||||
/*
|
||||
* Draws OSD to the screen buffer
|
||||
*/
|
||||
void (*draw_osd)(struct vo *vo);
|
||||
void (*draw_osd)(struct vo *vo, struct osd_state *osd);
|
||||
|
||||
/*
|
||||
* Blit/Flip buffer to the screen. Must be called after each frame!
|
||||
@ -248,7 +249,7 @@ void list_video_out(void);
|
||||
int vo_control(struct vo *vo, uint32_t request, void *data);
|
||||
int vo_draw_frame(struct vo *vo, uint8_t *src[]);
|
||||
int vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[], int w, int h, int x, int y);
|
||||
void vo_draw_osd(struct vo *vo);
|
||||
void vo_draw_osd(struct vo *vo, struct osd_state *osd);
|
||||
void vo_flip_page(struct vo *vo);
|
||||
void vo_check_events(struct vo *vo);
|
||||
void vo_destroy(struct vo *vo);
|
||||
|
@ -86,6 +86,8 @@ static struct SwsContext *sws=NULL;
|
||||
int aaopt_osdcolor = AA_SPECIAL;
|
||||
int aaopt_subcolor = AA_SPECIAL;
|
||||
|
||||
static unsigned char vo_osd_text[64];
|
||||
|
||||
void
|
||||
resize(void){
|
||||
/*
|
||||
@ -182,15 +184,10 @@ osdpercent(int duration, int deko, int min, int max, int val, const char * desc,
|
||||
static void
|
||||
printosdtext(void)
|
||||
{
|
||||
if(osd_text_length > 0 && !vo_osd_text) {
|
||||
memset(c->textbuffer,' ',osd_text_length);
|
||||
memset(c->attrbuffer,0,osd_text_length);
|
||||
osd_text_length = 0;
|
||||
}
|
||||
/*
|
||||
* places the mplayer status osd
|
||||
*/
|
||||
if (vo_osd_text && vo_osd_text[0] != 0) {
|
||||
if (vo_osd_text[0] != 0) {
|
||||
int len;
|
||||
if(vo_osd_text[0] < 32) {
|
||||
len = strlen(sub_osd_names_short[vo_osd_text[0]]) + strlen(vo_osd_text+1) + 2;
|
||||
@ -534,18 +531,18 @@ static void clear_alpha(int x0,int y0, int w,int h) {
|
||||
|
||||
static void
|
||||
draw_osd(void){
|
||||
char * vo_osd_text_save;
|
||||
char vo_osd_text_save;
|
||||
int vo_osd_progbar_type_save;
|
||||
|
||||
printosdprogbar();
|
||||
/* let vo_draw_text only write subtitle */
|
||||
vo_osd_text_save=vo_osd_text; /* we have to save the osd_text */
|
||||
vo_osd_text=NULL;
|
||||
vo_osd_text_save = global_osd->osd_text[0];
|
||||
global_osd->osd_text[0] = 0;
|
||||
vo_osd_progbar_type_save=vo_osd_progbar_type;
|
||||
vo_osd_progbar_type=-1;
|
||||
vo_remove_text(aa_scrwidth(c), aa_scrheight(c),clear_alpha);
|
||||
vo_draw_text(aa_scrwidth(c), aa_scrheight(c), draw_alpha);
|
||||
vo_osd_text=vo_osd_text_save;
|
||||
global_osd->osd_text[0] = vo_osd_text_save;
|
||||
vo_osd_progbar_type=vo_osd_progbar_type_save;
|
||||
}
|
||||
|
||||
|
@ -510,11 +510,11 @@ static void check_events(struct vo *vo)
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_osd(struct vo *vo)
|
||||
static void draw_osd(struct vo *vo, struct osd_state *osd)
|
||||
{
|
||||
struct xvctx *ctx = vo->priv;
|
||||
|
||||
osd_draw_text(ctx->image_width -
|
||||
osd_draw_text(osd, ctx->image_width -
|
||||
ctx->image_width * vo->panscan_x / (vo->dwidth + vo->panscan_x),
|
||||
ctx->image_height, ctx->draw_alpha_fnc, vo);
|
||||
}
|
||||
|
12
mencoder.c
12
mencoder.c
@ -94,6 +94,7 @@
|
||||
#include "defaultopts.h"
|
||||
|
||||
MPOpts opts;
|
||||
struct osd_state *osd;
|
||||
|
||||
int vo_doublebuffering=0;
|
||||
int vo_directrendering=0;
|
||||
@ -215,7 +216,7 @@ int vo_config(struct vo *vo, uint32_t width, uint32_t height,
|
||||
int vo_control(struct vo *vo, uint32_t request, void *data) { abort(); }
|
||||
int vo_draw_frame(struct vo *vo, uint8_t *src[]) { abort(); }
|
||||
int vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[], int w, int h, int x, int y) { abort(); }
|
||||
void vo_draw_osd(struct vo *vo) { abort(); }
|
||||
void vo_draw_osd(struct vo *vo, struct osd_state *osd) { abort(); }
|
||||
void vo_flip_page(struct vo *vo) { abort(); }
|
||||
void vo_check_events(struct vo *vo) { abort(); }
|
||||
|
||||
@ -552,7 +553,7 @@ if (frameno_filename) {
|
||||
}
|
||||
#endif
|
||||
|
||||
vo_init_osd();
|
||||
osd = osd_create();
|
||||
|
||||
/* HACK, for some weird reason, push() has to be called twice,
|
||||
otherwise options are not saved correctly */
|
||||
@ -1344,9 +1345,10 @@ case VCODEC_FRAMENO:
|
||||
break;
|
||||
default:
|
||||
// decode_video will callback down to ve_*.c encoders, through the video filters
|
||||
sh_video->vfilter->control(sh_video->vfilter, VFCTRL_SET_OSD_OBJ, osd);
|
||||
{void *decoded_frame = decode_video(sh_video,frame_data.start,frame_data.in_size,
|
||||
skip_flag>0 && (!sh_video->vfilter || ((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) != CONTROL_TRUE), MP_NOPTS_VALUE);
|
||||
blit_frame = decoded_frame && filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE);}
|
||||
blit_frame = decoded_frame && filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE, osd);}
|
||||
|
||||
if (sh_video->vf_initialized < 0) mencoder_exit(1, NULL);
|
||||
|
||||
@ -1706,10 +1708,12 @@ static int slowseek(float end_pts, demux_stream_t *d_video, demux_stream_t *d_au
|
||||
if (sh_video->pts >= end_pts) done = 1;
|
||||
|
||||
if (vfilter) {
|
||||
sh_video->vfilter->control(sh_video->vfilter, VFCTRL_SET_OSD_OBJ,
|
||||
osd);
|
||||
int softskip = (vfilter->control(vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) == CONTROL_TRUE);
|
||||
void *decoded_frame = decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE);
|
||||
if (decoded_frame)
|
||||
filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE);
|
||||
filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE, osd);
|
||||
}
|
||||
|
||||
if (print_info) mp_msg(MSGT_MENCODER, MSGL_STATUS,
|
||||
|
@ -41,6 +41,7 @@ typedef struct MPContext {
|
||||
struct vo_x11_state *x11_state;
|
||||
struct mp_fifo *key_fifo;
|
||||
struct input_ctx *input;
|
||||
struct osd_state *osd;
|
||||
int osd_show_percentage;
|
||||
int osd_function;
|
||||
const ao_functions_t *audio_out;
|
||||
|
31
mplayer.c
31
mplayer.c
@ -676,7 +676,7 @@ void exit_player_with_rc(struct MPContext *mpctx, const char* how, int rc){
|
||||
vo_font = NULL;
|
||||
done_freetype();
|
||||
#endif
|
||||
free_osd_list();
|
||||
osd_free(mpctx->osd);
|
||||
|
||||
#ifdef USE_ASS
|
||||
ass_library_done(ass_library);
|
||||
@ -1494,16 +1494,13 @@ void set_osd_bar(struct MPContext *mpctx, int type,const char* name,double min,d
|
||||
static void update_osd_msg(struct MPContext *mpctx)
|
||||
{
|
||||
mp_osd_msg_t *msg;
|
||||
static char osd_text[64] = "";
|
||||
static char osd_text_timer[64];
|
||||
|
||||
// we need some mem for vo_osd_text
|
||||
vo_osd_text = (unsigned char*)osd_text;
|
||||
struct osd_state *osd = mpctx->osd;
|
||||
char osd_text_timer[64];
|
||||
|
||||
// Look if we have a msg
|
||||
if((msg = get_osd_msg(mpctx))) {
|
||||
if(strcmp(osd_text,msg->msg)) {
|
||||
strncpy((char*)osd_text, msg->msg, 63);
|
||||
if (strcmp(osd->osd_text, msg->msg)) {
|
||||
strncpy(osd->osd_text, msg->msg, 63);
|
||||
if(mpctx->sh_video) vo_osd_changed(OSDTYPE_OSD); else
|
||||
if(term_osd) mp_msg(MSGT_CPLAYER,MSGL_STATUS,"%s%s\n",term_osd_esc,msg->msg);
|
||||
}
|
||||
@ -1542,16 +1539,16 @@ static void update_osd_msg(struct MPContext *mpctx)
|
||||
if(mpctx->osd_show_percentage)
|
||||
mpctx->osd_show_percentage--;
|
||||
|
||||
if(strcmp(osd_text,osd_text_timer)) {
|
||||
strncpy(osd_text, osd_text_timer, 63);
|
||||
if (strcmp(osd->osd_text, osd_text_timer)) {
|
||||
strncpy(osd->osd_text, osd_text_timer, 63);
|
||||
vo_osd_changed(OSDTYPE_OSD);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the term osd line
|
||||
if(term_osd && osd_text[0]) {
|
||||
osd_text[0] = 0;
|
||||
if (term_osd && osd->osd_text[0]) {
|
||||
osd->osd_text[0] = 0;
|
||||
printf("%s\n",term_osd_esc);
|
||||
}
|
||||
}
|
||||
@ -1753,7 +1750,8 @@ static int generate_video_frame(struct MPContext *mpctx)
|
||||
update_teletext(sh_video, mpctx->demuxer, 0);
|
||||
update_osd_msg(mpctx);
|
||||
current_module = "filter video";
|
||||
if (filter_video(sh_video, decoded_frame, sh_video->pts))
|
||||
if (filter_video(sh_video, decoded_frame, sh_video->pts,
|
||||
mpctx->osd))
|
||||
break;
|
||||
} else if (drop_frame)
|
||||
return -1;
|
||||
@ -2248,6 +2246,8 @@ static double update_video(struct MPContext *mpctx, int *blit_frame)
|
||||
//-------------------- Decode a frame: -----------------------
|
||||
double frame_time;
|
||||
*blit_frame = 0; // Don't blit if we hit EOF
|
||||
sh_video->vfilter->control(sh_video->vfilter, VFCTRL_SET_OSD_OBJ,
|
||||
mpctx->osd); // hack for vf_expand
|
||||
if (!opts->correct_pts) {
|
||||
unsigned char* start=NULL;
|
||||
void *decoded_frame = NULL;
|
||||
@ -2294,7 +2294,8 @@ static double update_video(struct MPContext *mpctx, int *blit_frame)
|
||||
#endif
|
||||
current_module = "filter_video";
|
||||
*blit_frame = (decoded_frame && filter_video(sh_video, decoded_frame,
|
||||
sh_video->pts));
|
||||
sh_video->pts,
|
||||
mpctx->osd));
|
||||
}
|
||||
else {
|
||||
int res = generate_video_frame(mpctx);
|
||||
@ -2832,7 +2833,7 @@ if(!codecs_file || !parse_codec_cfg(codecs_file)){
|
||||
}
|
||||
#endif
|
||||
|
||||
vo_init_osd();
|
||||
mpctx->osd = osd_create();
|
||||
|
||||
#ifdef USE_ASS
|
||||
ass_library = ass_init();
|
||||
|
Loading…
Reference in New Issue
Block a user