8,9 → 8,8 |
#include "../winlib/winlib.h" |
#include "sound.h" |
#include "fplay.h" |
#include <math.h> |
|
#define CAPTION_HEIGHT 24 |
|
extern int res_pause_btn[]; |
extern int res_pause_btn_pressed[]; |
|
18,6 → 17,8 |
extern int res_play_btn_pressed[]; |
|
extern int64_t stream_duration; |
extern volatile int sound_level_0; |
extern volatile int sound_level_1; |
|
typedef struct |
{ |
27,6 → 28,7 |
}vframe_t; |
|
vframe_t frames[4]; |
volatile int frames_count = 0; |
|
struct SwsContext *cvt_ctx = NULL; |
|
54,6 → 56,7 |
frames[i].pts = 0; |
frames[i].ready = 0; |
}; |
frames_count = 0; |
vfx = 0; |
dfx = 0; |
}; |
65,16 → 68,12 |
width = ctx->width; |
height = ctx->height; |
|
printf("w = %d h = %d\n\r", ctx->width, ctx->height); |
|
printf("w = %d h = %d\n\r", width, height); |
|
// __asm__ __volatile__("int3"); |
|
main_render = create_render(ctx->width, ctx->height, |
ctx->pix_fmt, HW_BIT_BLIT|HW_TEX_BLIT); |
// render = create_render(ctx->width, ctx->height, |
// ctx->pix_fmt, 0); |
// |
if( main_render == NULL) |
{ |
printf("Cannot create render\n\r"); |
121,11 → 120,12 |
double current_clock; |
|
if(frames[dfx].ready != 0 ) |
return 1; |
return -1; |
|
if( get_packet(qv, &pkt) == 0 ) |
return 0; |
|
/* |
current_clock = -90.0 + get_master_clock(); |
|
if( pkt.dts == AV_NOPTS_VALUE && |
138,7 → 138,7 |
|
|
pts *= av_q2d(video_time_base)*1000.0; |
|
*/ |
if( 1 /*pts > current_clock*/) |
{ |
frameFinished = 0; |
181,6 → 181,7 |
|
dfx++; |
dfx&= 3; |
frames_count++; |
}; |
}; |
av_free_packet(&pkt); |
189,10 → 190,35 |
} |
|
extern volatile enum player_state player_state; |
extern volatile enum player_state decoder_state; |
extern volatile enum player_state sound_state; |
|
//rect_t win_rect; |
|
extern int64_t rewind_pos; |
|
static void player_stop() |
{ |
window_t *win; |
|
win = main_render->win; |
|
rewind_pos = 0; |
|
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; |
win->panel.prg->current = rewind_pos; |
|
send_message(&win->panel.ctrl, MSG_PAINT, 0, 0); |
player_state = STOP; |
decoder_state = PLAY_2_STOP; |
sound_state = PLAY_2_STOP; |
render_draw_client(main_render); |
// printf("stop player\n"); |
|
}; |
|
int MainWindowProc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) |
{ |
window_t *win; |
211,13 → 237,15 |
break; |
|
case MSG_LBTNDOWN: |
|
if(player_state == PAUSE) |
{ |
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_2_PLAY; |
send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0); |
player_state = PLAY; |
sound_state = PAUSE_2_PLAY; |
|
} |
else if(player_state == PLAY) |
225,8 → 253,9 |
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); |
send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0); |
player_state = PAUSE; |
sound_state = PLAY_2_PAUSE; |
} |
break; |
|
239,7 → 268,8 |
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_2_PLAY; |
player_state = PLAY; |
sound_state = PAUSE_2_PLAY; |
} |
else if(player_state == PLAY) |
{ |
247,24 → 277,66 |
win->panel.play_btn->img_hilite = res_play_btn; |
win->panel.play_btn->img_pressed = res_play_btn_pressed; |
player_state = PAUSE; |
sound_state = PLAY_2_PAUSE; |
} |
else if(player_state == STOP) |
{ |
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; |
rewind_pos = 0; |
send_message(&win->panel.ctrl, MSG_PAINT, 0, 0); |
player_state = PLAY; |
decoder_state = PREPARE; |
} |
break; |
|
case 101: //ID_PROGRESS: |
case ID_STOP: |
player_stop(); |
break; |
|
case ID_PROGRESS: |
if(player_state != REWIND) |
{ |
progress_t *prg = (progress_t*)arg2; |
|
rewind_pos = (int64_t)prg->pos * |
(prg->max - prg->min)/prg->ctrl.w; |
rewind_pos = (prg->max - prg->min)*prg->pos/prg->ctrl.w; |
|
// printf("progress action %f\n", (double)rewind_pos); |
// printf("progress action pos: %d time: %f\n", prg->pos, (double)rewind_pos); |
player_state = REWIND; |
main_render->win->panel.prg->current = rewind_pos; |
send_message(&main_render->win->panel.ctrl, MSG_PAINT, 0, 0); |
decoder_state = REWIND; |
sound_state = PLAY_2_STOP; |
if(rewind_pos < prg->current) |
{ |
prg->current = rewind_pos; |
rewind_pos = -rewind_pos; |
} |
else |
prg->current = rewind_pos; |
|
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(&prg->ctrl, MSG_PAINT, 0, 0); |
}; |
break; |
|
case ID_VOL_CTRL: |
{ |
slider_t *sld = (slider_t*)arg2; |
int peak; |
int level; |
|
peak = sld->min + sld->pos * (sld->max - sld->min)/(96); |
// level = (log2(peak+16384)*10000.0)/15 - 10000; |
level = peak; |
|
// printf("level %d\n", level); |
set_audio_volume(level, level); |
send_message(&sld->ctrl, MSG_PAINT, 0, 0); |
win->panel.lvl->vol = level; |
} |
|
default: |
break; |
} |
280,6 → 352,9 |
|
void render_time(render_t *render) |
{ |
progress_t *prg = main_render->win->panel.prg; |
level_t *lvl = main_render->win->panel.lvl; |
|
double ctime; /* milliseconds */ |
double fdelay; /* milliseconds */ |
|
290,6 → 365,16 |
render->win->win_command = WIN_CLOSED; |
return; |
} |
else if(player_state == REWIND) |
{ |
yield(); |
return; |
} |
else if (decoder_state == STOP && frames_count == 0 && |
player_state != STOP) |
{ |
player_stop(); |
} |
else if(player_state != PLAY) |
{ |
yield(); |
296,6 → 381,7 |
return; |
}; |
|
|
#ifdef VERSION_A |
if(frames[vfx].ready == 1 ) |
{ |
324,8 → 410,16 |
// sys_time*10, frames[vfx].pts, ctime, fdelay); |
|
main_render->draw(main_render, &frames[vfx].picture); |
main_render->win->panel.prg->current = frames[vfx].pts*1000; |
send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0); |
prg->current = frames[vfx].pts*1000; |
// printf("current %f\n", prg->current); |
lvl->current = vfx & 1 ? sound_level_1 : sound_level_0; |
|
send_message(&prg->ctrl, PRG_PROGRESS, 0, 0); |
|
if(main_render->win->panel.layout) |
send_message(&lvl->ctrl, MSG_PAINT, 0, 0); |
|
frames_count--; |
frames[vfx].ready = 0; |
vfx++; |
vfx&= 3; |
396,8 → 490,6 |
} |
|
|
|
|
extern char *movie_file; |
|
int video_thread(void *param) |
407,7 → 499,7 |
init_winlib(); |
|
MainWindow = create_window(movie_file,0, |
10,10,width,height+29+55,MainWindowProc); |
10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc); |
|
MainWindow->panel.prg->max = stream_duration; |
// printf("MainWindow %x\n", MainWindow); |
417,11 → 509,12 |
show_window(MainWindow, NORMAL); |
|
render_draw_client(main_render); |
player_state = PAUSE_2_PLAY; |
player_state = PLAY; |
|
run_render(MainWindow, main_render); |
|
// printf("exit thread\n"); |
fini_winlib(); |
|
player_state = CLOSED; |
return 0; |
}; |
473,6 → 566,8 |
render->rcvideo.r = width; |
render->rcvideo.b = height; |
|
// printf("render width %d height %d\n",width, height); |
|
if( render->win_height > height ) |
{ |
int yoffs; |
561,9 → 656,12 |
uint32_t s, sw, sh; |
uint8_t state; |
|
right = win->w; |
bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT; |
|
right = win->w; |
bottom = win->h-CAPTION_HEIGHT-55; |
// printf("window width %d height %d\n", |
// right, bottom); |
|
render->win_state = win->win_state; |
|
if(render->win_state == MINIMIZED) |
579,25 → 677,19 |
new_w = bottom*render->ctx_width/render->ctx_height; |
new_h = right*render->ctx_height/render->ctx_width; |
|
// printf("new_w %d new_h %d\n", new_w, new_h); |
|
s = right * bottom; |
sw = right * new_h; |
sh = bottom * new_w; |
|
if( abs(s-sw) > abs(s-sh)) |
new_h = bottom; |
else |
if(new_w > right) |
{ |
new_w = right; |
|
if(new_w < 64) |
new_h = right*render->ctx_height/render->ctx_width; |
}; |
if(new_h > bottom) |
{ |
new_w = 64; |
new_h = 64*render->ctx_height/render->ctx_width; |
new_h = bottom; |
new_w = bottom*render->ctx_width/render->ctx_height; |
}; |
|
render->win_width = win->w; |
render->win_height = win->h-CAPTION_HEIGHT-55; |
render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT; |
render_set_size(render, new_w, new_h); |
}; |
|
620,8 → 712,8 |
} |
else |
{ |
dst_width = render->win_width; |
dst_height = render->win_height; |
dst_width = render->rcvideo.r; |
dst_height = render->rcvideo.b; |
}; |
|
cvt_ctx = sws_getCachedContext(cvt_ctx, |
639,7 → 731,7 |
ret = lock_bitmap(bitmap); |
if( ret != 0) |
{ |
printf("Cannot lock the bitmap!\n"); |
printf("Cannot lock bitmap!\n"); |
return ; |
} |
|
661,12 → 753,13 |
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"); |
|
|
render->target++; |
render->target&= 3; |
// render->target++; |
// render->target&= 3; |
} |
|
void draw_sw_picture(render_t *render, AVPicture *picture) |
715,8 → 808,7 |
render->win_state == ROLLED) |
return; |
|
if((player_state == PAUSE) || |
(player_state == PLAY_INIT) ) |
if(player_state == PAUSE) |
{ |
if(frames[vfx].ready == 1 ) |
main_render->draw(main_render, &frames[vfx].picture); |
723,6 → 815,11 |
else |
draw_bar(0, CAPTION_HEIGHT, render->win_width, |
render->rcvideo.b, 0); |
} |
else if( player_state == STOP ) |
{ |
draw_bar(0, CAPTION_HEIGHT, render->win_width, |
render->rcvideo.b, 0); |
}; |
|
if(render->layout & HAS_TOP) |