* @file video_test_controller.c
*
*/
* INCLUDES
*********************/
#include "video_test_controller.h"
#include "vg_video.h"
#include <stdio.h>
* DEFINES
*********************/
#define MY_CLASS &video_test_controller_class
* TYPEDEFS
**********************/
* STATIC PROTOTYPES
**********************/
static void video_test_controller_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj);
static void video_test_controller_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj);
static void video_event_cb(lv_event_t* e);
static void play_pause_event_cb(lv_event_t* e);
static void progress_slider_event_cb(lv_event_t* e);
* STATIC VARIABLES
**********************/
const lv_obj_class_t video_test_controller_class = {
.constructor_cb = video_test_controller_constructor,
.destructor_cb = video_test_controller_destructor,
.instance_size = sizeof(video_test_controller_t),
.base_class = &lv_obj_class
};
* MACROS
**********************/
* GLOBAL FUNCTIONS
**********************/
lv_obj_t* video_test_controller_create(lv_obj_t* parent)
{
lv_obj_t* obj = lv_obj_class_create_obj(MY_CLASS, parent);
LV_ASSERT_MALLOC(obj);
if (obj == NULL)
return NULL;
lv_obj_class_init_obj(obj);
video_test_controller_t* video_controller = (video_test_controller_t*)obj;
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN);
lv_obj_t* video_obj = lv_obj_create(obj);
lv_obj_remove_style_all(video_obj);
lv_obj_set_size(video_obj, LV_PCT(100), LV_PCT(90));
lv_obj_clear_flag(video_obj, LV_OBJ_FLAG_SCROLLABLE);
video_controller->video = vg_video_create(video_obj);
lv_obj_center(video_controller->video);
lv_obj_add_event_cb(video_controller->video, video_event_cb, LV_EVENT_VALUE_CHANGED, video_controller);
lv_obj_t* controller_obj = lv_obj_create(obj);
lv_obj_remove_style_all(controller_obj);
lv_obj_set_size(controller_obj, LV_PCT(100), LV_PCT(10));
lv_obj_clear_flag(controller_obj, LV_OBJ_FLAG_SCROLLABLE);
video_controller->play_imgbtn = lv_imgbtn_create(controller_obj);
lv_obj_set_size(video_controller->play_imgbtn, LV_PCT(12), LV_PCT(100));
lv_obj_add_flag(video_controller->play_imgbtn, LV_OBJ_FLAG_CHECKABLE);
lv_obj_add_event_cb(video_controller->play_imgbtn, play_pause_event_cb, LV_EVENT_CLICKED, video_controller->video);
lv_obj_add_flag(video_controller->play_imgbtn, LV_OBJ_FLAG_CLICKABLE);
video_controller->progress_slider = lv_slider_create(controller_obj);
lv_obj_set_size(video_controller->progress_slider, LV_PCT(76), 3);
lv_obj_align_to(video_controller->progress_slider,video_controller->play_imgbtn, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
lv_obj_add_event_cb(video_controller->progress_slider, progress_slider_event_cb, LV_EVENT_RELEASED,
video_controller->video);
video_controller->dur_label = lv_label_create(controller_obj);
lv_label_set_text(video_controller->dur_label, "00:00/00:00");
lv_obj_set_size(video_controller->play_imgbtn, LV_PCT(12), LV_PCT(100));
lv_label_set_long_mode(video_controller->dur_label, LV_LABEL_LONG_CLIP);
lv_obj_align_to(video_controller->dur_label, video_controller->progress_slider, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
return obj;
}
void video_test_controller_set_imgbtn(lv_obj_t* obj, const void* play_img, const void* pause_img)
{
video_test_controller_t* video_controller = (video_test_controller_t*)obj;
lv_obj_t* play_imgbtn = video_controller->play_imgbtn;
lv_imgbtn_set_src(play_imgbtn, LV_IMGBTN_STATE_RELEASED, NULL, play_img, NULL);
lv_imgbtn_set_src(play_imgbtn, LV_IMGBTN_STATE_CHECKED_RELEASED, NULL, pause_img, NULL);
lv_img_header_t header;
lv_img_decoder_get_info(play_img, &header);
lv_obj_set_width(play_imgbtn, header.w);
lv_obj_align_to(video_controller->progress_slider, video_controller->play_imgbtn, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
lv_obj_align_to(video_controller->dur_label, video_controller->progress_slider, LV_ALIGN_OUT_RIGHT_MID, 3, 0);
}
void video_test_controller_set_src(lv_obj_t* obj, const char* src)
{
video_test_controller_t* video_controller = (video_test_controller_t*)obj;
vg_video_t* video = (vg_video_t*)video_controller->video;
vg_video_set_src(video_controller->video, src);
lv_slider_set_range(video_controller->progress_slider, 0, video->duration);
}
* STATIC FUNCTIONS
**********************/
static void video_test_controller_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
{
LV_UNUSED(class_p);
}
static void video_test_controller_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
{
LV_UNUSED(class_p);
}
static void video_event_cb(lv_event_t* e)
{
char dur_str[32];
vg_video_t* video = (vg_video_t*)lv_event_get_target(e);
video_test_controller_t* video_controller = (video_test_controller_t*)lv_event_get_user_data(e);
snprintf(dur_str, sizeof(dur_str), "%02d:%02d/%02d:%02d", video->cur_time / 60, video->cur_time % 60,
video->duration / 60, video->duration % 60);
lv_label_set_text(video_controller->dur_label, dur_str);
lv_slider_set_value(video_controller->progress_slider, video->cur_time, LV_ANIM_OFF);
}
static void play_pause_event_cb(lv_event_t* e)
{
lv_obj_t* imgbtn = lv_event_get_target(e);
lv_obj_t* video = lv_event_get_user_data(e);
if (lv_obj_has_state(imgbtn, LV_STATE_CHECKED)) {
vg_video_start(video);
} else {
vg_video_pause(video);
}
}
static void progress_slider_event_cb(lv_event_t* e)
{
lv_obj_t* slider = lv_event_get_target(e);
lv_obj_t* video = lv_event_get_user_data(e);
int32_t pos = lv_slider_get_value(slider);
vg_video_seek(video, pos);
}