Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 2426 → Rev 2427

/programs/media/Fplay/video.c
5,12 → 5,19
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include "system.h"
#include <winlib.h>
#include "../winlib/winlib.h"
#include "sound.h"
#include "fplay.h"
 
#define CAPTION_HEIGHT 24
 
extern int res_pause_btn[];
extern int res_pause_btn_pressed[];
 
extern int res_play_btn[];
extern int res_play_btn_pressed[];
 
 
typedef struct
{
AVPicture picture;
98,6 → 105,7
AVPacket pkt;
double pts;
int frameFinished;
double current_clock;
 
if(frames[dfx].ready != 0 )
return 1;
105,6 → 113,20
if( get_packet(qv, &pkt) == 0 )
return 0;
 
current_clock = -80.0 + get_master_clock();
 
if( pkt.dts == AV_NOPTS_VALUE &&
Frame->reordered_opaque != AV_NOPTS_VALUE)
pts = Frame->reordered_opaque;
else if(pkt.dts != AV_NOPTS_VALUE)
pts= pkt.dts;
else
pts= 0;
 
pts *= av_q2d(video_time_base)*1000.0;
 
if( pts > current_clock)
{
frameFinished = 0;
 
ctx->reordered_opaque = pkt.pts;
116,7 → 138,6
{
AVPicture *dst_pic;
 
 
if( pkt.dts == AV_NOPTS_VALUE &&
Frame->reordered_opaque != AV_NOPTS_VALUE)
pts = Frame->reordered_opaque;
145,13 → 166,14
dfx++;
dfx&= 3;
};
};
av_free_packet(&pkt);
 
return 1;
}
 
extern volatile uint32_t status;
rect_t win_rect;
extern volatile enum player_state player_state;
//rect_t win_rect;
 
 
int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2)
171,13 → 193,49
render_draw_client(main_render);
break;
 
case MSG_LBTNDOWN:
if(player_state == PAUSE)
{
win->panel.play_btn->img_default = res_play_btn;
win->panel.play_btn->img_hilite = res_play_btn;
win->panel.play_btn->img_pressed = res_play_btn_pressed;
send_message(win->panel.play_btn, MSG_PAINT, 0, 0);
player_state = PLAY_RESTART;
 
}
else if(player_state == PLAY)
{
win->panel.play_btn->img_default = res_pause_btn;
win->panel.play_btn->img_hilite = res_pause_btn;
win->panel.play_btn->img_pressed = res_pause_btn_pressed;
send_message(win->panel.play_btn, MSG_PAINT, 0, 0);
player_state = PAUSE;
}
break;
 
case MSG_COMMAND:
switch((short)arg1)
{
case ID_CLOSE:
exit(0);
};
case ID_PLAY:
if(player_state == PAUSE)
{
win->panel.play_btn->img_default = res_play_btn;
win->panel.play_btn->img_hilite = res_play_btn;
win->panel.play_btn->img_pressed = res_play_btn_pressed;
player_state = PLAY_RESTART;
}
else if(player_state == PLAY)
{
win->panel.play_btn->img_default = res_pause_btn;
win->panel.play_btn->img_hilite = res_pause_btn;
win->panel.play_btn->img_pressed = res_pause_btn_pressed;
player_state = PAUSE;
}
break;
default:
break;
}
break;
 
default:
def_window_proc(ctrl,msg,arg1,arg2);
187,13 → 245,20
 
void render_time(render_t *render)
{
double ctime;
double fdelay;
double ctime; /* milliseconds */
double fdelay; /* milliseconds */
 
if(status == 0)
//again:
 
if(player_state == CLOSED)
{
render->win->win_command = WIN_CLOSED;
return;
}
else if(player_state != PLAY)
{
yield();
return;
};
 
if(frames[vfx].ready == 1 )
204,37 → 269,10
// printf("pts %f time %f delay %f\n",
// frames[vfx].pts, ctime, fdelay);
 
if(fdelay < 0.0 )
if(fdelay > 20.0)
{
int next_vfx;
fdelay = 0;
next_vfx = (vfx+1) & 3;
if( frames[next_vfx].ready == 1 )
{
if(frames[next_vfx].pts <= ctime)
{
frames[vfx].ready = 0; // skip this frame
vfx++;
vfx&= 3;
}
else
{
if( (frames[next_vfx].pts - ctime) <
( ctime - frames[vfx].pts) )
{
frames[vfx].ready = 0; // skip this frame
vfx++;
vfx&= 3;
fdelay = (frames[next_vfx].pts - ctime);
}
}
};
};
 
if(fdelay > 10.0)
{
// delay( (uint32_t)(fdelay/10.0));
yield();
delay(2);
// yield();
return;
};
 
242,9 → 280,14
frames[vfx].ready = 0;
vfx++;
vfx&= 3;
};
}
else yield();
 
}
 
 
 
 
extern char *movie_file;
 
int video_thread(void *param)
254,7 → 297,7
init_winlib();
 
MainWindow = create_window(movie_file,0,
10,10,width+14,height+29,MainWindowProc);
10,10,width,height+29+75,MainWindowProc);
 
// printf("MainWindow %x\n", MainWindow);
 
264,7 → 307,7
run_render(MainWindow, main_render);
 
// printf("exit thread\n");
status = 0;
player_state = CLOSED;
return 0;
};
 
366,7 → 409,7
 
if( create_bitmap(&render->bitmap[i]) != 0 )
{
status = 0;
player_state = CLOSED;
/*
* Epic fail. Need exit_thread() here
*
405,7 → 448,7
 
 
right = win->w;
bottom = win->h-CAPTION_HEIGHT;
bottom = win->h-CAPTION_HEIGHT-75;
render->win_state = win->win_state;
 
if(render->win_state == MINIMIZED)
439,7 → 482,7
};
 
render->win_width = win->w;
render->win_height = win->h-CAPTION_HEIGHT;
render->win_height = win->h-CAPTION_HEIGHT-75;
render_set_size(render, new_w, new_h);
};
 
451,7 → 494,8
int linesize[4];
int ret;
 
if(render->win_state == ROLLED)
if(render->win_state == MINIMIZED ||
render->win_state == ROLLED)
return;
 
if(render->caps & HW_TEX_BLIT)
502,6 → 546,7
blit_bitmap(bitmap, render->rcvideo.l,
CAPTION_HEIGHT+render->rcvideo.t,
render->rcvideo.r, render->rcvideo.b);
render->last_bitmap = bitmap;
// printf("blit_bitmap\n");
 
 
546,6 → 591,7
blit_bitmap(&render->bitmap[0], render->rcvideo.l,
render->rcvideo.t+CAPTION_HEIGHT,
render->rcvideo.r, render->rcvideo.b);
render->last_bitmap = &render->bitmap[0];
}
 
void render_draw_client(render_t *render)
554,6 → 600,11
render->win_state == ROLLED)
return;
 
if(player_state == PAUSE)
{
main_render->draw(main_render, &frames[vfx].picture);
};
 
if(render->layout & HAS_TOP)
draw_bar(0, CAPTION_HEIGHT, render->win_width,
render->rctop.b, 0);
569,3 → 620,6
}