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 |
} |
|
|
|
|
|