#include <tbm_surface.h>
#include <dlog.h>
#include <player.h>
+#include <player_internal.h>
#include <glib.h>
#include <appcore-efl.h>
+#include <Ecore.h>
+#include <Ecore_Wayland.h>
#define KEY_END "XF86Stop"
-#define ES_FEEDING_PATH "es_buff://push_mode"
-//#define ES_FEEDING_PATH "es_buff://pull_mode"
-#define ES_DEFAULT_DIR_PATH "/opt/usr/media/"
-#define ES_DEFAULT_H264_VIDEO_PATH ES_DEFAULT_DIR_PATH"Simpsons.h264"
+#define ES_DEFAULT_DIR_PATH "/home/owner/"
+#define ES_DEFAULT_H264_VIDEO_PATH ES_DEFAULT_DIR_PATH"test.h264"
#define ES_DEFAULT_VIDEO_FORMAT_TYPE MEDIA_FORMAT_H264_SP
#define ES_DEFAULT_VIDEO_FORMAT_WIDTH 1280
#define ES_DEFAULT_VIDEO_FORMAT_HEIGHT 544
#define LOG_TAG "PLAYER_TEST"
static int app_create(void *data);
-static int app_reset(bundle *b, void *data);
+static int app_reset(bundle * b, void *data);
static int app_resume(void *data);
static int app_pause(void *data);
static int app_terminate(void *data);
pthread_t feeding_thread_id;
} appdata_s;
-static void
-win_delete_request_cb(void *data , Evas_Object *obj , void *event_info)
+static void win_delete_request_cb(void *data, Evas_Object * obj, void *event_info)
{
elm_exit();
}
-static Eina_Bool
-keydown_cb(void *data , int type , void *event)
+static Eina_Bool keydown_cb(void *data, int type, void *event)
{
- //appdata_s *ad = data;
+ /* appdata_s *ad = data; */
Ecore_Event_Key *ev = event;
LOGD("start");
if (!strcmp(ev->keyname, KEY_END)) {
/* Let window go to hide state. */
- //elm_win_lower(ad->win);
+ /* elm_win_lower(ad->win); */
LOGD("elm exit");
elm_exit();
return ECORE_CALLBACK_PASS_ON;
}
-static void win_del(void *data, Evas_Object *obj, void *event)
+static void win_del(void *data, Evas_Object * obj, void *event)
{
- elm_exit();
+ elm_exit();
}
-static Evas_Object* create_win(const char *name)
+static Evas_Object *create_win(const char *name)
{
Evas_Object *eo = NULL;
+ int w = 0;
+ int h = 0;
eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
if (eo) {
- elm_win_title_set(eo, name);
- elm_win_borderless_set(eo, EINA_TRUE);
- evas_object_smart_callback_add(eo, "delete,request",win_del, NULL);
- elm_win_autodel_set(eo, EINA_TRUE);
+ elm_win_title_set(eo, name);
+ elm_win_borderless_set(eo, EINA_TRUE);
+ evas_object_smart_callback_add(eo, "delete,request", win_del, NULL);
+ elm_win_screen_size_get(eo, NULL, NULL, &w, &h);
+ g_print("window size :%d,%d", w, h);
+ evas_object_resize(eo, w, h);
+ elm_win_autodel_set(eo, EINA_TRUE);
+ elm_win_alpha_set(eo, EINA_TRUE);
}
return eo;
}
-static Evas_Object *create_render_rect(Evas_Object *pParent)
+static Evas_Object *create_render_rect(Evas_Object * pParent)
{
- if(!pParent) {
+ if (!pParent)
return NULL;
- }
Evas *pEvas = evas_object_evas_get(pParent);
Evas_Object *pObj = evas_object_rectangle_add(pEvas);
- if(pObj == NULL) {
+ if (pObj == NULL)
return NULL;
- }
evas_object_size_hint_weight_set(pObj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_color_set(pObj, 0, 0, 0, 0);
return pObj;
}
-static void
-create_base_gui(appdata_s *ad)
+static void create_base_gui(appdata_s * ad)
{
/* Enable GLES Backened */
- elm_config_preferred_engine_set("3d");
+ elm_config_accel_preference_set("opengl");
/* Window */
- ad->win = create_win(PACKAGE);//elm_win_util_standard_add(PACKAGE, PACKAGE);
+ /* elm_win_util_standard_add(PACKAGE, PACKAGE); */
+ ad->win = create_win(PACKAGE);
ad->rect = create_render_rect(ad->win);
- /* This is not supported in 3.0
- elm_win_wm_desktop_layout_support_set(ad->win, EINA_TRUE);*/
+ /* This is not supported in 3.0
+ elm_win_wm_desktop_layout_support_set(ad->win, EINA_TRUE); */
elm_win_autodel_set(ad->win, EINA_TRUE);
evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, ad);
create_base_gui(ad);
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, NULL);
- /* open test file*/
+ /* open test file */
ad->file_src = fopen(ES_DEFAULT_H264_VIDEO_PATH, "r");
LOGD("done");
static int app_pause(void *data)
{
/* Take necessary actions when application becomes invisible. */
- appdata_s *ad = (appdata_s *)data;
+ appdata_s *ad = (appdata_s *) data;
int ret = PLAYER_ERROR_NONE;
LOGD("start");
}
if (ad->player_handle == NULL) {
- printf("player_handle is NULL");
+ g_print("player_handle is NULL");
return -1;
}
- if (ad->feeding_thread_id)
- {
+ if (ad->feeding_thread_id) {
pthread_join(ad->feeding_thread_id, NULL);
ad->feeding_thread_id = 0;
}
- player_unset_media_stream_buffer_status_cb(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO);
- player_unset_media_stream_buffer_status_cb(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO);
+ player_unset_media_stream_buffer_status_cb_ex(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO);
+ player_unset_media_stream_buffer_status_cb_ex(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO);
player_unset_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO);
player_unset_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO);
ret = player_unprepare(ad->player_handle);
if (ret != PLAYER_ERROR_NONE) {
- printf("player_unprepare failed : 0x%x", ret);
+ g_print("player_unprepare failed : 0x%x", ret);
return false;
}
/* destroy player handle */
ret = player_destroy(ad->player_handle);
if (ret != PLAYER_ERROR_NONE) {
- printf("player_destroy failed : 0x%x", ret);
+ g_print("player_destroy failed : 0x%x", ret);
return false;
}
static void _player_prepared_cb(void *user_data)
{
int ret = PLAYER_ERROR_NONE;
- appdata_s *ad = (appdata_s *)user_data;
+ appdata_s *ad = (appdata_s *) user_data;
LOGD("prepared");
ret = player_start(ad->player_handle);
- if (ret != PLAYER_ERROR_NONE) {
+ if (ret != PLAYER_ERROR_NONE)
LOGE("player start failed : 0x%x", ret);
- }
+
LOGD("done");
}
-unsigned int bytestream2nalunit(FILE *fd, unsigned char* nal)
+int bytestream2nalunit(FILE * fd, unsigned char *nal)
{
- int nal_length = 0;
- size_t result;
- int read_size = 1;
- unsigned char buffer[1000000];
- unsigned char val, zero_count, i;
- int nal_unit_type = 0;
- int init;
-
- zero_count = 0;
- if (feof(fd))
- return -1;
-
- result = fread(buffer, 1, read_size, fd);
-
- if(result != read_size)
- {
- //exit(1);
- return -1;
- }
- val = buffer[0];
- while (!val)
- {
- if ((zero_count == 2 || zero_count == 3) && val == 1)
- {
- break;
- }
- zero_count++;
- result = fread(buffer, 1, read_size, fd);
-
- if(result != read_size)
- {
- break;
- }
- val = buffer[0];
- }
- nal[nal_length++] = 0;
- nal[nal_length++] = 0;
- nal[nal_length++] = 0;
- nal[nal_length++] = 1;
- zero_count = 0;
- init = 1;
- while(1)
- {
- if (feof(fd))
- return nal_length;
-
- result = fread(buffer, 1, read_size, fd);
- if(result != read_size)
- {
- break;
- }
- val = buffer[0];
-
- if(init) {
- nal_unit_type = val & 0xf;
- init = 0;
- }
- if (!val)
- {
- zero_count++;
- }
- else
- {
- if ((zero_count == 2 || zero_count == 3 || zero_count == 4) && (val == 1))
- {
- break;
- }
- else
- {
- for (i = 0; i<zero_count; i++)
- {
- nal[nal_length++] = 0;
- }
- nal[nal_length++] = val;
- zero_count = 0;
- }
- }
- }
-
- fseek(fd, -(zero_count + 1), SEEK_CUR);
-
- if (nal_unit_type == 0x7)
- {
- sps_len = nal_length;
- memcpy(sps, nal, nal_length);
- return 0;
- }
- else if (nal_unit_type == 0x8)
- {
- pps_len = nal_length;
- memcpy(pps, nal, nal_length);
- return 0;
- }
- else if (nal_unit_type == 0x5)
- {
- memcpy(tmp_buf, nal, nal_length);
- memcpy(nal, sps, sps_len);
- memcpy(nal + sps_len, pps, pps_len);
- memcpy(nal + sps_len + pps_len, tmp_buf, nal_length);
- nal_length += sps_len + pps_len;
- }
-
- return nal_length;
+ int nal_length = 0;
+ size_t result;
+ int read_size = 1;
+ unsigned char buffer[1000000];
+ unsigned char val, zero_count, i;
+ int nal_unit_type = 0;
+ int init;
+
+ zero_count = 0;
+ if (feof(fd))
+ return -1;
+
+ result = fread(buffer, 1, read_size, fd);
+
+ if (result != read_size)
+ return -1;
+
+ val = buffer[0];
+ while (!val) {
+ if ((zero_count == 2 || zero_count == 3) && val == 1)
+ break;
+ zero_count++;
+ result = fread(buffer, 1, read_size, fd);
+
+ if (result != read_size)
+ break;
+ val = buffer[0];
+ }
+ nal[nal_length++] = 0;
+ nal[nal_length++] = 0;
+ nal[nal_length++] = 0;
+ nal[nal_length++] = 1;
+ zero_count = 0;
+ init = 1;
+ while (1) {
+ if (feof(fd))
+ return -1;
+
+ result = fread(buffer, 1, read_size, fd);
+ if (result != read_size) {
+ if (init == 1)
+ return -1;
+ break;
+ }
+ val = buffer[0];
+
+ if (init) {
+ nal_unit_type = val & 0xf;
+ init = 0;
+ }
+ if (!val) {
+ zero_count++;
+ } else {
+ if ((zero_count == 2 || zero_count == 3 || zero_count == 4) && (val == 1)) {
+ break;
+ } else {
+ for (i = 0; i < zero_count; i++)
+ nal[nal_length++] = 0;
+ nal[nal_length++] = val;
+ zero_count = 0;
+ }
+ }
+ }
+
+ fseek(fd, -(zero_count + 1), SEEK_CUR);
+
+ if (nal_unit_type == 0x7) {
+ sps_len = nal_length;
+ memcpy(sps, nal, nal_length);
+ return 0;
+ } else if (nal_unit_type == 0x8) {
+ pps_len = nal_length;
+ memcpy(pps, nal, nal_length);
+ return 0;
+ } else if (nal_unit_type == 0x5) {
+ memcpy(tmp_buf, nal, nal_length);
+ memcpy(nal, sps, sps_len);
+ memcpy(nal + sps_len, pps, pps_len);
+ memcpy(nal + sps_len + pps_len, tmp_buf, nal_length);
+ nal_length += sps_len + pps_len;
+ }
+
+ return nal_length;
+}
+
+static void feed_eos_data(appdata_s * appdata)
+{
+ appdata_s *ad = appdata;
+
+ LOGD("push EOS");
+
+ if (media_packet_create(ad->video_fmt, NULL, NULL, &ad->video_pkt) != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_create_alloc failed\n");
+ return;
+ }
+
+ media_packet_set_flags(ad->video_pkt, MEDIA_PACKET_END_OF_STREAM);
+ if (player_push_media_stream(ad->player_handle, ad->video_pkt) != PLAYER_ERROR_NONE)
+ LOGE("fail to push media packet\n");
+
+ media_packet_destroy(ad->video_pkt);
+ ad->video_pkt = NULL;
+
+ return;
}
-static void feed_video_data(appdata_s *appdata)
+static bool feed_video_data(appdata_s * appdata)
{
+ bool ret = FALSE;
int read = 0;
static guint64 pts = 0L;
void *buf_data_ptr = NULL;
if (media_packet_create_alloc(ad->video_fmt, NULL, NULL, &ad->video_pkt) != MEDIA_PACKET_ERROR_NONE) {
LOGE("media_packet_create_alloc failed\n");
- return;
+ return FALSE;
}
if (media_packet_get_buffer_data_ptr(ad->video_pkt, &buf_data_ptr) != MEDIA_PACKET_ERROR_NONE) {
LOGE("media_packet_get_buffer_data_ptr failed\n");
- return;
+ goto ERROR;
}
- if (media_packet_set_pts(ad->video_pkt, (uint64_t)(pts/1000000)) != MEDIA_PACKET_ERROR_NONE) {
+ if (media_packet_set_pts(ad->video_pkt, (uint64_t) pts) != MEDIA_PACKET_ERROR_NONE) {
LOGE("media_packet_set_pts failed\n");
- return;
+ goto ERROR;
}
/* NOTE: In case of H.264 video, stream format for feeding is NAL unit.
read = bytestream2nalunit(ad->file_src, buf_data_ptr);
LOGD("real length = %d\n", read);
if (read == 0) {
- LOGD("input file read failed\n");
- return;
+ LOGE("input file read failed\n");
+ ret = TRUE;
+ goto ERROR;
+ } else if (read < 0) {
+ LOGD("push EOS");
+ media_packet_destroy(ad->video_pkt);
+ ad->video_pkt = NULL;
+
+ if (media_packet_create(ad->video_fmt, NULL, NULL, &ad->video_pkt) != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("media_packet_create failed\n");
+ goto ERROR;
+ }
+ media_packet_set_flags(ad->video_pkt, MEDIA_PACKET_END_OF_STREAM);
+ if (player_push_media_stream(ad->player_handle, ad->video_pkt) != PLAYER_ERROR_NONE)
+ LOGE("fail to push media packet\n");
+ goto ERROR;
}
- if (media_packet_set_buffer_size(ad->video_pkt, (uint64_t)read) != MEDIA_PACKET_ERROR_NONE) {
+ if (media_packet_set_buffer_size(ad->video_pkt, (uint64_t) read) != MEDIA_PACKET_ERROR_NONE) {
LOGE("media_packet_set_buffer_size failed\n");
- return;
+ goto ERROR;
}
/* push media packet */
player_push_media_stream(ad->player_handle, ad->video_pkt);
pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+ ret = TRUE;
- /* destroy media packet after use*/
+ ERROR:
+ /* destroy media packet after use */
media_packet_destroy(ad->video_pkt);
ad->video_pkt = NULL;
- return;
+ return ret;
}
static void feed_video_data_thread_func(void *data)
{
- gboolean exit = FALSE;
- appdata_s *ad = (appdata_s *)data;
+ appdata_s *ad = (appdata_s *) data;
- while (!exit)
- {
+ while (TRUE) {
static int frame_count = 0;
-
if (frame_count < ES_DEFAULT_NUMBER_OF_FEED) {
- feed_video_data(ad);
+ if (!feed_video_data(ad))
+ break;
frame_count++;
} else {
- exit = TRUE;
+ feed_eos_data(ad);
+ break;
}
}
}
-void _video_buffer_status_cb (player_media_stream_buffer_status_e status, void *user_data)
+void _video_buffer_status_cb_ex(player_media_stream_buffer_status_e status, unsigned long long bytes, void *user_data)
{
if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN)
- {
- LOGE("video buffer is underrun state");
- }
+ LOGE("video buffer is underrun state, current level byte = %llu", bytes);
else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW)
- {
- LOGE("video buffer is overrun state");
- }
+ LOGE("video buffer is overrun state, current level byte = %llu", bytes);
}
-void _audio_buffer_status_cb (player_media_stream_buffer_status_e status, void *user_data)
+void _audio_buffer_status_cb_ex(player_media_stream_buffer_status_e status, unsigned long long bytes, void *user_data)
{
if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN)
- LOGE("audio buffer is underrun state");
+ LOGE("audio buffer is underrun state, current level byte = %llu", bytes);
else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW)
- LOGE("audio buffer is overrun state");
+ LOGE("audio buffer is overrun state, current level byte = %llu", bytes);
}
-void _video_seek_data_cb (unsigned long long offset, void *user_data)
+void _video_seek_data_cb(unsigned long long offset, void *user_data)
{
LOGE("seek offset of video is %llu", offset);
}
-void _audio_seek_data_cb (unsigned long long offset, void *user_data)
+void _audio_seek_data_cb(unsigned long long offset, void *user_data)
{
LOGE("seek offset of audio is %llu", offset);
}
-static int app_reset(bundle *b, void *data)
+static int app_reset(bundle * b, void *data)
{
/* Take necessary actions when application becomes visible. */
- appdata_s *ad = (appdata_s *)data;
+ appdata_s *ad = (appdata_s *) data;
int ret = PLAYER_ERROR_NONE;
LOGD("start");
goto FAILED;
}
- ret = player_set_uri(ad->player_handle, ES_FEEDING_PATH);
- if (ret != PLAYER_ERROR_NONE) {
- LOGE("player_set_uri failed : 0x%x", ret);
- goto FAILED;
- }
-
/* get media format format */
ret = media_format_create(&ad->video_fmt);
if (ret != MEDIA_FORMAT_ERROR_NONE) {
/* set video format */
media_format_set_video_mime(ad->video_fmt, ES_DEFAULT_VIDEO_FORMAT_TYPE);
media_format_set_video_width(ad->video_fmt, ES_DEFAULT_VIDEO_FORMAT_WIDTH);
- media_format_set_video_height(ad->video_fmt,ES_DEFAULT_VIDEO_FORMAT_HEIGHT);
+ media_format_set_video_height(ad->video_fmt, ES_DEFAULT_VIDEO_FORMAT_HEIGHT);
+
+ player_set_media_stream_buffer_max_size(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, (unsigned long long)3 * 1024 * 1024);
+ player_set_media_stream_buffer_min_threshold(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, 50);
- ret = player_set_media_stream_buffer_status_cb(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, _video_buffer_status_cb, (void*)ad);
+ ret = player_set_media_stream_buffer_status_cb_ex(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, _video_buffer_status_cb_ex, (void *)ad);
if (ret != PLAYER_ERROR_NONE) {
LOGE("player set video buffer status cb failed : 0x%x", ret);
goto FAILED;
}
- ret = player_set_media_stream_buffer_status_cb(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO, _audio_buffer_status_cb, (void*)ad);
+ ret = player_set_media_stream_buffer_status_cb_ex(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO, _audio_buffer_status_cb_ex, (void *)ad);
if (ret != PLAYER_ERROR_NONE) {
LOGE("player set audio buffer status cb failed : 0x%x", ret);
goto FAILED;
}
- ret = player_set_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, _video_seek_data_cb, (void*)ad);
+ ret = player_set_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, _video_seek_data_cb, (void *)ad);
if (ret != PLAYER_ERROR_NONE) {
LOGE("player set seek data cb for video failed : 0x%x", ret);
goto FAILED;
}
- ret = player_set_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO, _audio_seek_data_cb, (void*)ad);
+ ret = player_set_media_stream_seek_cb(ad->player_handle, PLAYER_STREAM_TYPE_AUDIO, _audio_seek_data_cb, (void *)ad);
if (ret != PLAYER_ERROR_NONE) {
LOGE("player set seek data cb for audio failed : 0x%x", ret);
goto FAILED;
/* send media packet to player */
player_set_media_stream_info(ad->player_handle, PLAYER_STREAM_TYPE_VIDEO, ad->video_fmt);
- ret = player_prepare_async(ad->player_handle, _player_prepared_cb, (void*)ad);
+ ret = player_prepare_async(ad->player_handle, _player_prepared_cb, (void *)ad);
if (ret != PLAYER_ERROR_NONE) {
LOGE("player prepare failed : 0x%x", ret);
goto FAILED;
}
- pthread_create(&ad->feeding_thread_id, NULL, (void*)feed_video_data_thread_func, (void *)ad);
+ pthread_create(&ad->feeding_thread_id, NULL, (void *)feed_video_data_thread_func, (void *)ad);
LOGD("done");
return 0;
-FAILED:
+ FAILED:
if (ad->player_handle) {
player_destroy(ad->player_handle);
ad->player_handle = NULL;
static int app_terminate(void *data)
{
/* Release all resources. */
- appdata_s *ad = (appdata_s *)data;
+ appdata_s *ad = (appdata_s *) data;
LOGD("start");
int main(int argc, char *argv[])
{
int ret = 0;
- static appdata_s ad = {0,};
+ static appdata_s ad = { 0, };
LOGD("start");