2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <player_internal.h>
18 #include <sound_manager.h>
22 #include <appcore-efl.h>
23 #include <Elementary.h>
29 #include <Ecore_Wayland.h>
38 #define PACKAGE "player_test"
43 #define LOG_TAG "PLAYER_TEST"
45 #define MAX_STRING_LEN 2048
46 #define MMTS_SAMPLELIST_INI_DEFAULT_PATH "/opt/etc/mmts_filelist.ini"
47 #define PLAYER_TEST_DUMP_PATH_PREFIX "/home/owner/content/dump_pcm_"
48 #define INI_SAMPLE_LIST_MAX 9
49 #define DEFAULT_HTTP_TIMEOUT -1
51 static gboolean g_memory_playback = FALSE;
52 static char g_uri[MAX_STRING_LEN];
53 static char g_subtitle_uri[MAX_STRING_LEN];
54 static FILE *g_pcm_fd;
56 static gboolean is_es_push_mode = FALSE;
57 static pthread_t g_feed_video_thread_id = 0;
58 static bool g_thread_end = FALSE;
59 static media_packet_h g_audio_pkt = NULL;
60 static media_format_h g_audio_fmt = NULL;
62 static media_packet_h g_video_pkt = NULL;
63 static media_format_h g_video_fmt = NULL;
65 static int _save(unsigned char *src, int length);
74 CURRENT_STATUS_MAINMENU,
75 CURRENT_STATUS_HANDLE_NUM,
76 CURRENT_STATUS_FILENAME,
77 CURRENT_STATUS_VOLUME,
78 CURRENT_STATUS_SOUND_TYPE,
79 CURRENT_STATUS_SOUND_STREAM_INFO,
81 CURRENT_STATUS_POSITION_TIME,
82 CURRENT_STATUS_LOOPING,
83 CURRENT_STATUS_DISPLAY_SURFACE_CHANGE,
84 CURRENT_STATUS_DISPLAY_MODE,
85 CURRENT_STATUS_DISPLAY_ROTATION,
86 CURRENT_STATUS_DISPLAY_VISIBLE,
87 CURRENT_STATUS_DISPLAY_ROI_MODE,
88 CURRENT_STATUS_DISPLAY_DST_ROI,
89 CURRENT_STATUS_DISPLAY_SRC_CROP,
90 CURRENT_STATUS_SUBTITLE_FILENAME,
91 CURRENT_STATUS_AUDIO_EQUALIZER,
92 CURRENT_STATUS_PLAYBACK_RATE,
93 CURRENT_STATUS_STREAMING_PLAYBACK_RATE,
94 CURRENT_STATUS_SWITCH_SUBTITLE,
99 /* for video display */
100 static Evas_Object *g_xid;
101 #ifdef _ACTIVATE_EOM_
102 static Evas_Object *g_external_xid;
104 static Evas_Object *selected_xid;
105 static Evas_Object *g_eo[MAX_HANDLE] = {0, };
107 static int g_current_surface_type = PLAYER_DISPLAY_TYPE_OVERLAY;
111 Evas_Object *layout_main; /* layout widget based on EDJ */
117 /* add more variables here */
118 #ifdef _ACTIVATE_EOM_
124 static player_h g_player[MAX_HANDLE] = {0, };
126 int g_handle_num = 1;
127 int g_menu_state = CURRENT_STATUS_MAINMENU;
128 char g_file_list[9][256];
129 gboolean quit_pushing;
130 sound_stream_info_h g_stream_info_h = NULL;
132 static void win_del(void *data, Evas_Object *obj, void *event)
137 static Evas_Object *create_win(const char *name)
139 Evas_Object *eo = NULL;
143 g_print("[%s][%d] name=%s\n", __func__, __LINE__, name);
145 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
147 elm_win_title_set(eo, name);
148 elm_win_borderless_set(eo, EINA_TRUE);
149 evas_object_smart_callback_add(eo, "delete,request", win_del, NULL);
150 elm_win_screen_size_get(eo, NULL, NULL, &w, &h);
151 g_print("window size :%d,%d", w, h);
152 evas_object_resize(eo, w, h);
153 elm_win_autodel_set(eo, EINA_TRUE);
155 elm_win_alpha_set(eo, EINA_TRUE);
161 static Evas_Object *create_image_object(Evas_Object *eo_parent)
166 Evas *evas = evas_object_evas_get(eo_parent);
167 Evas_Object *eo = NULL;
169 eo = evas_object_image_add(evas);
174 void create_render_rect_and_bg(Evas_Object *win)
180 Evas_Object *bg, *rect;
182 bg = elm_bg_add(win);
183 elm_win_resize_object_add(win, bg);
184 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
185 evas_object_show(bg);
187 rect = evas_object_rectangle_add(evas_object_evas_get(win));
192 evas_object_color_set(rect, 0, 0, 0, 0);
193 evas_object_render_op_set(rect, EVAS_RENDER_COPY);
195 elm_win_resize_object_add(win, rect);
196 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
197 evas_object_show(rect);
198 evas_object_show(win);
200 #ifdef _ACTIVATE_EOM_
201 int eom_get_output_id(const char *output_name)
203 eom_output_id *output_ids = NULL;
204 eom_output_id output_id = 0;
205 eom_output_type_e output_type = EOM_OUTPUT_TYPE_UNKNOWN;
210 output_ids = eom_get_eom_output_ids(&id_cnt);
212 g_print("[eom] no external outuputs supported\n");
216 /* find output ids interested */
217 for (i = 0; i < id_cnt; i++) {
218 eom_get_output_type(output_ids[i], &output_type);
219 if (!strncmp(output_name, "HDMI", 4)) {
220 if (output_type == EOM_OUTPUT_TYPE_HDMIA || output_type == EOM_OUTPUT_TYPE_HDMIB) {
221 output_id = output_ids[i];
224 } else if (!strncmp(output_name, "Virtual", 4)) {
225 if (output_type == EOM_OUTPUT_TYPE_VIRTUAL) {
226 output_id = output_ids[i];
238 static void eom_notify_cb_output_add(eom_output_id output_id, void *user_data)
240 appdata *info = (appdata *)user_data;
242 if (info->hdmi_output_id != output_id) {
243 g_print("[eom] OUTPUT ADDED. SKIP. my output ID is %d\n", info->hdmi_output_id);
246 g_print("[eom] output(%d) connected\n", output_id);
247 /* it is for external window */
248 if (!g_external_xid) {
249 g_external_xid = elm_win_add(NULL, "External", ELM_WIN_BASIC);
250 if (eom_set_output_window(info->hdmi_output_id, g_external_xid) == EOM_ERROR_NONE) {
251 create_render_rect_and_bg(g_external_xid);
252 g_print("[eom] create external window\n");
254 evas_object_del(g_external_xid);
255 g_external_xid = NULL;
256 g_print("[eom] create external window fail\n");
261 static void eom_notify_cb_output_remove(eom_output_id output_id, void *user_data)
263 appdata *info = (appdata *)user_data;
264 player_state_e state;
266 if (info->hdmi_output_id != output_id) {
267 g_print("[eom] OUTPUT REMOVED. SKIP. my output ID is %d\n", info->hdmi_output_id);
270 g_print("[eom] output(%d) disconnected\n", output_id);
272 if (selected_xid == g_external_xid && g_player[0]) {
273 player_get_state(g_player[0], &state);
274 if (state >= PLAYER_STATE_READY) {
276 g_xid = create_win(PACKAGE);
279 g_print("create xid %p\n", g_xid);
280 create_render_rect_and_bg(g_xid);
281 elm_win_activate(g_xid);
282 evas_object_show(g_xid);
284 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(g_xid));
288 /* it is for external window */
289 if (g_external_xid) {
290 evas_object_del(g_external_xid);
291 g_external_xid = NULL;
293 selected_xid = g_xid;
296 static void eom_notify_cb_mode_changed(eom_output_id output_id, void *user_data)
298 appdata *info = (appdata *)user_data;
299 eom_output_mode_e mode = EOM_OUTPUT_MODE_NONE;
301 if (info->hdmi_output_id != output_id) {
302 g_print("[eom] MODE CHANGED. SKIP. my output ID is %d\n", info->hdmi_output_id);
306 eom_get_output_mode(output_id, &mode);
307 g_print("[eom] output(%d) mode changed(%d)\n", output_id, mode);
310 static void eom_notify_cb_attribute_changed(eom_output_id output_id, void *user_data)
312 appdata *info = (appdata *)user_data;
314 eom_output_attribute_e attribute = EOM_OUTPUT_ATTRIBUTE_NONE;
315 eom_output_attribute_state_e state = EOM_OUTPUT_ATTRIBUTE_STATE_NONE;
317 if (info->hdmi_output_id != output_id) {
318 g_print("[eom] ATTR CHANGED. SKIP. my output ID is %d\n", info->hdmi_output_id);
322 eom_get_output_attribute(output_id, &attribute);
323 eom_get_output_attribute_state(output_id, &state);
325 g_print("[eom] output(%d) attribute changed(%d, %d)\n", output_id, attribute, state);
326 if (state == EOM_OUTPUT_ATTRIBUTE_STATE_ACTIVE) {
327 g_print("[eom] active\n");
328 if (!g_external_xid) {
329 g_external_xid = elm_win_add(NULL, "External", ELM_WIN_BASIC);
330 if (eom_set_output_window(info->hdmi_output_id, g_external_xid) == EOM_ERROR_NONE) {
331 create_render_rect_and_bg(g_external_xid);
332 g_print("[eom] create external window\n");
334 evas_object_del(g_external_xid);
335 g_external_xid = NULL;
336 g_print("[eom] create external window fail\n");
339 selected_xid = g_external_xid;
340 /* play video on external window */
342 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(selected_xid));
343 } else if (state == EOM_OUTPUT_ATTRIBUTE_STATE_INACTIVE) {
344 g_print("[eom] inactive\n");
346 g_xid = create_win(PACKAGE);
349 g_print("create xid %p\n", g_xid);
350 create_render_rect_and_bg(g_xid);
351 elm_win_activate(g_xid);
352 evas_object_show(g_xid);
354 selected_xid = g_xid;
356 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(selected_xid));
358 if (g_external_xid) {
359 evas_object_del(g_external_xid);
360 g_external_xid = NULL;
362 } else if (state == EOM_OUTPUT_ATTRIBUTE_STATE_LOST) {
363 g_print("[eom] lost\n");
365 g_xid = create_win(PACKAGE);
368 g_print("create xid %p\n", g_xid);
369 create_render_rect_and_bg(g_xid);
370 elm_win_activate(g_xid);
371 evas_object_show(g_xid);
373 selected_xid = g_xid;
376 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(selected_xid));
378 if (g_external_xid) {
379 evas_object_del(g_external_xid);
380 g_external_xid = NULL;
383 eom_unset_output_added_cb(eom_notify_cb_output_add);
384 eom_unset_output_removed_cb(eom_notify_cb_output_remove);
385 eom_unset_mode_changed_cb(eom_notify_cb_mode_changed);
386 eom_unset_attribute_changed_cb(eom_notify_cb_attribute_changed);
392 static int app_create(void *data)
395 Evas_Object *win = NULL;
396 #ifdef _ACTIVATE_EOM_
397 eom_output_mode_e output_mode = EOM_OUTPUT_MODE_NONE;
400 elm_config_preferred_engine_set("3d");
403 win = create_win(PACKAGE);
408 selected_xid = g_xid;
409 create_render_rect_and_bg(ad->win);
410 /* Create evas image object for EVAS surface */
411 g_eo[0] = create_image_object(ad->win);
412 evas_object_image_size_set(g_eo[0], 500, 500);
413 evas_object_image_fill_set(g_eo[0], 0, 0, 500, 500);
414 evas_object_resize(g_eo[0], 500, 500);
416 elm_win_activate(win);
417 evas_object_show(win);
418 #ifdef _ACTIVATE_EOM_
419 /* check external device */
421 ad->hdmi_output_id = eom_get_output_id("HDMI");
422 if (ad->hdmi_output_id == 0) {
423 g_print("[eom] error : HDMI output id is NULL.\n");
427 g_print("eom_set_output_attribute EOM_OUTPUT_ATTRIBUTE_NORMAL(id:%d)\n", ad->hdmi_output_id);
428 if (eom_set_output_attribute(ad->hdmi_output_id, EOM_OUTPUT_ATTRIBUTE_NORMAL) != EOM_ERROR_NONE) {
429 g_print("attribute set fail. cannot use external output\n");
433 eom_get_output_mode(ad->hdmi_output_id, &output_mode);
434 if (output_mode != EOM_OUTPUT_MODE_NONE) {
435 g_external_xid = elm_win_add(NULL, "External", ELM_WIN_BASIC);
436 if (eom_set_output_window(ad->hdmi_output_id, g_external_xid) == EOM_ERROR_NONE) {
437 create_render_rect_and_bg(g_external_xid);
438 g_print("[eom] create external window\n");
440 evas_object_del(g_external_xid);
441 g_external_xid = NULL;
442 g_print("[eom] create external window fail\n");
444 selected_xid = g_external_xid;
447 /* set callback for detecting external device */
448 eom_set_output_added_cb(eom_notify_cb_output_add, ad);
449 eom_set_output_removed_cb(eom_notify_cb_output_remove, ad);
450 eom_set_mode_changed_cb(eom_notify_cb_mode_changed, ad);
451 eom_set_attribute_changed_cb(eom_notify_cb_attribute_changed, ad);
456 static int app_terminate(void *data)
461 for (i = 0; i < MAX_HANDLE; i++) {
463 evas_object_del(g_eo[i]);
468 evas_object_del(g_xid);
471 #ifdef _ACTIVATE_EOM_
472 if (g_external_xid) {
473 evas_object_del(g_external_xid);
474 g_external_xid = NULL;
479 #ifdef _ACTIVATE_EOM_
480 eom_unset_output_added_cb(eom_notify_cb_output_add);
481 eom_unset_output_removed_cb(eom_notify_cb_output_remove);
482 eom_unset_mode_changed_cb(eom_notify_cb_mode_changed);
483 eom_unset_attribute_changed_cb(eom_notify_cb_attribute_changed);
490 struct appcore_ops ops = {
491 .create = app_create,
492 .terminate = app_terminate,
495 static void prepared_cb(void *user_data)
497 g_print("[Player_Test] prepared_cb!!!!\n");
500 static void _audio_frame_decoded_cb_ex(player_audio_raw_data_s *audio_raw_frame, void *user_data)
502 player_audio_raw_data_s *audio_raw = audio_raw_frame;
507 g_print("[Player_Test] decoded_cb_ex! channel: %d channel_mask: %" G_GUINT64_FORMAT "\n", audio_raw->channel, audio_raw->channel_mask);
510 if (audio_raw->channel_mask == 1 && fp_out1)
511 fwrite((guint8 *)audio_raw->data, 1, audio_raw->size, fp_out1);
512 else if (audio_raw->channel_mask == 2 && fp_out2)
513 fwrite((guint8 *)audio_raw->data, 1, audio_raw->size, fp_out2);
517 static void progress_down_cb(player_pd_message_type_e type, void *user_data)
519 g_print("[Player_Test] progress_down_cb!!!! type : %d\n", type);
522 static void buffering_cb(int percent, void *user_data)
524 g_print("[Player_Test] buffering_cb!!!! percent : %d\n", percent);
527 static void seek_completed_cb(void *user_data)
529 g_print("[Player_Test] seek_completed_cb!!! \n");
532 static void completed_cb(void *user_data)
534 g_print("[Player_Test] completed_cb!!!!\n");
537 static void error_cb(int code, void *user_data)
539 g_print("[Player_Test] error_cb!!!! code : %d\n", code);
542 static void interrupted_cb(player_interrupted_code_e code, void *user_data)
544 g_print("[Player_Test] interrupted_cb!!!! code : %d\n", code);
548 static void audio_frame_decoded_cb(unsigned char *data, unsigned int size, void *user_data)
552 if (data && g_pcm_fd)
553 fwrite(data, 1, size, g_pcm_fd);
554 player_get_play_position(g_player[0], &pos);
555 g_print("[Player_Test] audio_frame_decoded_cb [size: %d] --- current pos : %d!!!!\n", size, pos);
559 static void subtitle_updated_cb(unsigned long duration, char *text, void *user_data)
561 g_print("[Player_Test] subtitle_updated_cb!!!! [%ld] %s\n", duration, text);
564 static void video_captured_cb(unsigned char *data, int width, int height, unsigned int size, void *user_data)
566 g_print("[Player_Test] video_captured_cb!!!! width: %d, height : %d, size : %d \n", width, height, size);
570 static int _save(unsigned char *src, int length)
572 /* unlink(CAPTUERD_IMAGE_SAVE_PATH); */
574 char filename[256] = {0, };
575 static int WRITE_COUNT = 0;
576 /* gchar *filename = CAPTUERD_IMAGE_SAVE_PATH; */
577 snprintf(filename, 256, "IMAGE_client%d", WRITE_COUNT);
579 fp = fopen(filename, "w+");
581 g_print("file open error!!\n");
584 g_print("open success\n");
585 if (fwrite(src, 1, length, fp) < 1) {
586 g_print("file write error!!\n");
590 g_print("write success(%s)\n", filename);
597 static void reset_display()
601 /* delete evas window, if it is */
602 for (i = 0; i < MAX_HANDLE; i++) {
604 evas_object_del(g_eo[i]);
610 static void input_filename(char *filename)
612 int len = strlen(filename);
615 if (len < 0 || len > MAX_STRING_LEN - 1)
618 for (i = 0; i < g_handle_num; i++) {
619 if (g_player[i] != NULL) {
620 player_unprepare(g_player[i]);
621 player_destroy(g_player[i]);
625 if (player_create(&g_player[i]) != PLAYER_ERROR_NONE)
626 g_print("player create is failed\n");
629 strncpy(g_uri, filename, len);
633 /* ned(APPSRC_TEST) */
638 GError *error = NULL;
639 guint8 *g_media_mem = NULL;
643 file = g_mapped_file_new(ext, FALSE, &error);
644 file_size = g_mapped_file_get_length(file);
645 g_media_mem = (guint8 *) g_mapped_file_get_contents(file);
647 g_sprintf(uri, "mem://ext=%s,size=%d", ext ? ext : "", file_size);
648 g_print("[uri] = %s\n", uri);
650 mm_player_set_attribute(g_player[0], &g_err_name, "profile_uri", uri, strlen(uri), "profile_user_param", g_media_mem, file_size NULL);
652 /* player_set_uri(g_player[0], filename); */
657 player_state_e state;
658 for (i = 0; i < g_handle_num; i++) {
659 ret = player_get_state(g_player[i], &state);
660 g_print("player_get_state returned [%d]\n", ret);
661 g_print("1. After player_create() - Current State : %d \n", state);
665 /* use this API instead of player_set_uri */
666 static void player_set_memory_buffer_test()
670 guint8 *g_media_mem = NULL;
672 file = g_mapped_file_new(g_uri, FALSE, NULL);
673 file_size = g_mapped_file_get_length(file);
674 g_media_mem = (guint8 *)g_mapped_file_get_contents(file);
676 int ret = player_set_memory_buffer(g_player[0], (void *)g_media_mem, file_size);
677 g_print("player_set_memory_buffer ret : %d\n", ret);
680 int video_packet_count = 0;
682 static void buffer_need_video_data_cb(unsigned int size, void *user_data)
684 int real_read_len = 0;
687 static unsigned long long pts = 0L;
690 guint8 *buff_ptr = NULL;
693 memset(fname, 0, 128);
694 memset(fptsname, 0, 128);
696 video_packet_count++;
698 if (video_packet_count > 1000) {
701 /* player_submit_packet(g_player[0], NULL, 0, 0, 1); */
702 player_push_media_stream(g_player[0], NULL);
706 /* snprintf(fname, 128, "/opt/storage/usb/test/packet/packet_%d.dat", video_packet_count); */
707 /* snprintf(fptsname, 128, "/opt/storage/usb/test/packet/gstpts_%d.dat", video_packet_count); */
708 snprintf(fname, 128, "/home/developer/test/packet/packet_%d.dat", video_packet_count);
709 snprintf(fptsname, 128, "/home/developer/test/packet/gstpts_%d.dat", video_packet_count);
711 fp = fopen(fptsname, "rb");
714 pts_len = fread(&pts, 1, sizeof(unsigned long long), fp);
715 if (pts_len != sizeof(unsigned long long))
716 g_print("Warning, pts value can be wrong.\n");
721 fp = fopen(fname, "rb");
723 buff_ptr = (guint8 *)g_malloc0(1048576);
725 g_print("no free space\n");
730 real_read_len = fread(buff_ptr, 1, size, fp);
734 g_print("video need data - data size : %d, pts : %" G_GUINT64_FORMAT "\n", real_read_len, pts);
736 player_submit_packet(g_player[0], buff_ptr, real_read_len, (pts / 1000000), 1);
738 /* create media packet */
740 media_packet_destroy(g_video_pkt);
744 media_packet_create_alloc(g_video_fmt, NULL, NULL, &g_video_pkt);
746 g_print("packet = %p, src = %p\n", g_video_pkt, src);
748 if (media_packet_get_buffer_data_ptr(g_video_pkt, &src) != MEDIA_PACKET_ERROR_NONE)
751 if (media_packet_set_pts(g_video_pkt, (uint64_t)pts) != MEDIA_PACKET_ERROR_NONE)
754 if (media_packet_set_buffer_size(g_video_pkt, (uint64_t)real_read_len) != MEDIA_PACKET_ERROR_NONE)
757 memcpy(src, buff_ptr, real_read_len);
760 player_push_media_stream(g_player[0], g_video_pkt);
770 int audio_packet_count = 0;
771 static void buffer_need_audio_data_cb(unsigned int size, void *user_data)
773 int real_read_len = 0;
776 guint8 *buff_ptr = NULL;
779 memset(fname, 0, 128);
780 audio_packet_count++;
782 if (audio_packet_count > 1000) {
784 /* player_submit_packet(g_player[0], NULL, 0, 0, 0); */
785 player_push_media_stream(g_player[0], NULL);
789 /* snprintf(fname, 128, "/opt/storage/usb/test/audio_packet/packet_%d.dat", audio_packet_count); */
790 snprintf(fname, 128, "/home/developer/test/audio_packet/packet_%d.dat", audio_packet_count);
792 static unsigned long long audio_pts = 0;
793 unsigned long long audio_dur = 21333333;
795 fp = fopen(fname, "rb");
797 buff_ptr = (guint8 *)g_malloc0(1048576);
799 g_print("no free space\n");
804 real_read_len = fread(buff_ptr, 1, size, fp);
808 g_print("\t audio need data - data size : %d, pts : %" G_GUINT64_FORMAT "\n", real_read_len, audio_pts);
811 player_submit_packet(g_player[0], buff_ptr, real_read_len, (audio_pts / 1000000), 0);
813 /* create media packet */
815 media_packet_destroy(g_audio_pkt);
818 media_packet_create_alloc(g_audio_fmt, NULL, NULL, &g_audio_pkt);
820 g_print("packet = %p, src = %p\n", g_audio_pkt, src);
822 if (media_packet_get_buffer_data_ptr(g_audio_pkt, &src) != MEDIA_PACKET_ERROR_NONE)
825 if (media_packet_set_pts(g_audio_pkt, (uint64_t)audio_pts) != MEDIA_PACKET_ERROR_NONE)
828 if (media_packet_set_buffer_size(g_audio_pkt, (uint64_t)real_read_len) != MEDIA_PACKET_ERROR_NONE)
831 memcpy(src, buff_ptr, real_read_len);
834 player_push_media_stream(g_player[0], g_audio_pkt);
837 audio_pts += audio_dur;
845 static void set_content_info(bool is_push_mode)
847 /* testcode for es buff src case, please input url as es_buff://123 or es_buff://push_mode */
848 /* unsigned char codec_data[45] = {0x0,0x0,0x1,0xb0,0x1,0x0,0x0,0x1,0xb5,0x89,0x13,0x0,0x0,0x1,0x0,0x0,0x0,0x1,0x20,0x0,0xc4,0x8d,0x88,0x5d,0xad,0x14,0x4,0x22,0x14,0x43,0x0,0x0,0x1,0xb2,0x4c,0x61,0x76,0x63,0x35,0x31,0x2e,0x34,0x30,0x2e,0x34}; */
850 /* create media format */
851 media_format_create(&g_audio_fmt);
852 media_format_create(&g_video_fmt);
855 /* configure media format for video and set to player */
856 media_format_set_video_mime(g_video_fmt, MEDIA_FORMAT_MPEG4_SP);
857 media_format_set_video_width(g_video_fmt, 640);
858 media_format_set_video_height(g_video_fmt, 272);
859 /* player_set_media_stream_info(g_player[0], PLAYER_STREAM_TYPE_VIDEO, g_video_fmt); */
861 /* Audio--aac--StarWars.mp4 */
862 media_format_set_audio_mime(g_audio_fmt, MEDIA_FORMAT_AAC);
863 media_format_set_audio_channel(g_audio_fmt, 2);
864 media_format_set_audio_samplerate(g_audio_fmt, 48000);
865 /* player_set_media_stream_info(g_player[0], PLAYER_STREAM_TYPE_AUDIO, g_audio_fmt); */
867 /* video_info->mime = g_strdup("video/mpeg"); */ /* CODEC_ID_MPEG4VIDEO */
868 video_info->width = 640;
869 video_info->height = 272;
870 video_info->version = 4;
871 video_info->framerate_den = 100;
872 video_info->framerate_num = 2997;
874 video_info->extradata_size = 45;
875 video_info->codec_extradata = codec_data;
876 player_set_video_stream_info(g_player[0], video_info);
878 /* audio--aac--StarWars.mp4 */
879 /* audio_info->mime = g_strdup("audio/mpeg"); */
880 /* audio_info->version = 2; */
881 /* audio_info->user_info = 0; */ /* raw */
886 player_set_buffer_need_video_data_cb(g_player[0], buffer_need_video_data_cb, (void *)g_player[0]);
887 player_set_buffer_need_audio_data_cb(g_player[0], buffer_need_audio_data_cb, (void *)g_player[0]);
892 static void feed_video_data_thread_func(void *data)
894 while (!g_thread_end) {
895 buffer_need_video_data_cb(1048576, NULL);
896 buffer_need_audio_data_cb(1048576, NULL);
900 static void _player_prepare(bool async)
903 int slen = strlen(g_subtitle_uri);
905 if (slen > 0 && slen < MAX_STRING_LEN) {
906 g_print("0. set subtile path() (size : %d) - %s \n", slen, g_subtitle_uri);
907 player_set_subtitle_path(g_player[0], g_subtitle_uri);
908 player_set_subtitle_updated_cb(g_player[0], subtitle_updated_cb, (void *)g_player[0]);
910 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
911 player_set_display(g_player[0], g_current_surface_type, GET_DISPLAY(selected_xid));
912 player_set_buffering_cb(g_player[0], buffering_cb, (void *)g_player[0]);
913 player_set_completed_cb(g_player[0], completed_cb, (void *)g_player[0]);
914 player_set_interrupted_cb(g_player[0], interrupted_cb, (void *)g_player[0]);
915 player_set_error_cb(g_player[0], error_cb, (void *)g_player[0]);
916 if (g_memory_playback)
917 player_set_memory_buffer_test();
919 player_set_uri(g_player[0], g_uri);
922 for (i = 0; i < g_handle_num; i++) {
923 player_set_display(g_player[i], g_current_surface_type, g_eo[i]);
924 player_set_buffering_cb(g_player[i], buffering_cb, (void *)g_player[i]);
925 player_set_completed_cb(g_player[i], completed_cb, (void *)g_player[i]);
926 player_set_interrupted_cb(g_player[i], interrupted_cb, (void *)g_player[i]);
927 player_set_error_cb(g_player[i], error_cb, (void *)g_player[i]);
928 if (g_memory_playback)
929 player_set_memory_buffer_test();
931 player_set_uri(g_player[i], g_uri);
935 if (strstr(g_uri, "es_buff://")) {
936 is_es_push_mode = FALSE;
937 video_packet_count = 0;
938 audio_packet_count = 0;
940 if (strstr(g_uri, "es_buff://push_mode")) {
941 set_content_info(TRUE);
943 is_es_push_mode = TRUE;
946 set_content_info(FALSE);
951 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
953 ret = player_prepare_async(g_player[0], prepared_cb, (void *)g_player[0]);
955 ret = player_prepare(g_player[0]);
958 for (i = 0; i < g_handle_num; i++) {
960 ret = player_prepare_async(g_player[i], prepared_cb, (void *)g_player[i]);
962 ret = player_prepare(g_player[i]);
966 if (ret != PLAYER_ERROR_NONE)
967 g_print("prepare is failed (errno = %d) \n", ret);
969 player_state_e state;
970 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
971 ret = player_get_state(g_player[0], &state);
972 g_print("After player_prepare() - Current State : %d \n", state);
975 for (i = 0; i < g_handle_num; i++) {
976 ret = player_get_state(g_player[i], &state);
977 g_print("After player_prepare() - Current State : %d \n", state);
982 pthread_create(&g_feed_video_thread_id, NULL, (void *)feed_video_data_thread_func, NULL);
986 static void _player_unprepare()
990 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
991 ret = player_unprepare(g_player[0]);
992 if (ret != PLAYER_ERROR_NONE)
993 g_print("unprepare is failed (errno = %d) \n", ret);
995 ret = player_unset_subtitle_updated_cb(g_player[0]);
996 g_print("player_unset_subtitle_updated_cb ret %d\n", ret);
998 ret = player_unset_buffering_cb(g_player[0]);
999 g_print("player_unset_buffering_cb ret %d\n", ret);
1001 ret = player_unset_completed_cb(g_player[0]);
1002 g_print("player_unset_completed_cb ret %d\n", ret);
1004 ret = player_unset_interrupted_cb(g_player[0]);
1005 g_print("player_unset_interrupted_cb ret %d\n", ret);
1007 ret = player_unset_error_cb(g_player[0]);
1008 g_print("player_unset_error_cb ret %d\n", ret);
1010 for (i = 0; i < g_handle_num; i++) {
1011 if (g_player[i] != NULL) {
1012 ret = player_unprepare(g_player[i]);
1013 if (ret != PLAYER_ERROR_NONE)
1014 g_print("unprepare is failed (errno = %d) \n", ret);
1016 ret = player_unset_subtitle_updated_cb(g_player[i]);
1017 g_print("player_unset_subtitle_updated_cb [%d] ret %d\n", i, ret);
1019 ret = player_unset_buffering_cb(g_player[i]);
1020 g_print("player_unset_buffering_cb [%d] ret %d\n", i, ret);
1022 ret = player_unset_completed_cb(g_player[i]);
1023 g_print("player_unset_completed_cb [%d] ret %d\n", i, ret);
1025 ret = player_unset_interrupted_cb(g_player[i]);
1026 g_print("player_unset_interrupted_cb [%d] ret %d\n", i, ret);
1028 ret = player_unset_error_cb(g_player[i]);
1029 g_print("player_unset_error_cb [%d] ret %d\n", i, ret);
1033 /* attention! surface(evas) -> unprepare -> surface(evas) : evas object will disappear. */
1035 memset(g_subtitle_uri, 0, sizeof(g_subtitle_uri));
1036 player_state_e state;
1037 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1038 ret = player_get_state(g_player[0], &state);
1039 g_print(" After player_unprepare() - Current State : %d \n", state);
1041 for (i = 0; i < g_handle_num; i++) {
1042 ret = player_get_state(g_player[i], &state);
1043 g_print(" After player_unprepare() - Current State : %d \n", state);
1048 static void _player_destroy()
1052 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1053 player_unprepare(g_player[0]);
1054 for (i = 0; i < g_handle_num; i++) {
1055 player_destroy(g_player[i]);
1059 for (i = 0; i < g_handle_num; i++) {
1060 if (g_player[i] != NULL) {
1061 player_unprepare(g_player[i]);
1062 player_destroy(g_player[i]);
1068 if (g_stream_info_h) {
1069 sound_manager_destroy_stream_information(g_stream_info_h);
1070 g_stream_info_h = NULL;
1074 media_packet_destroy(g_video_pkt);
1077 media_packet_destroy(g_audio_pkt);
1088 static void _player_play()
1092 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1093 #ifdef _ACTIVATE_EOM_
1094 /* for checking external display.... */
1095 player_set_display(g_player[0], g_current_surface_type, GET_DISPLAY(selected_xid));
1097 bRet = player_start(g_player[0]);
1098 g_print("player_start returned [%d]", bRet);
1100 for (i = 0; i < g_handle_num; i++) {
1101 bRet = player_start(g_player[i]);
1102 g_print("player_start returned [%d]", bRet);
1107 static void _player_stop()
1111 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1112 bRet = player_stop(g_player[0]);
1113 g_print("player_stop returned [%d]", bRet);
1115 for (i = 0; i < g_handle_num; i++) {
1116 bRet = player_stop(g_player[i]);
1117 g_print("player_stop returned [%d]", bRet);
1121 g_thread_end = TRUE;
1122 if (g_feed_video_thread_id) {
1123 pthread_join(g_feed_video_thread_id, NULL);
1124 g_feed_video_thread_id = 0;
1129 static void _player_resume()
1133 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1134 #ifdef _ACTIVATE_EOM_
1135 /* for checking external display.... */
1136 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(selected_xid));
1138 bRet = player_start(g_player[0]);
1139 g_print("player_start returned [%d]", bRet);
1141 for (i = 0; i < g_handle_num; i++) {
1142 bRet = player_start(g_player[i]);
1143 g_print("player_start returned [%d]", bRet);
1148 static void _player_pause()
1152 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1153 bRet = player_pause(g_player[0]);
1154 g_print("player_pause returned [%d]", bRet);
1156 for (i = 0; i < g_handle_num; i++) {
1157 bRet = player_pause(g_player[i]);
1158 g_print("player_pause returned [%d]", bRet);
1163 static void _player_state()
1165 player_state_e state;
1166 player_get_state(g_player[0], &state);
1167 g_print(" ==> [Player_Test] Current Player State : %d\n", state);
1170 static void _player_set_progressive_download()
1172 player_set_progressive_download_path(g_player[0], "/home/owner/test.pd");
1173 player_set_progressive_download_message_cb(g_player[0], progress_down_cb, (void *)g_player[0]);
1176 static void _player_get_progressive_download_status()
1179 unsigned long curr, total;
1180 bRet = player_get_progressive_download_status(g_player[0], &curr, &total);
1181 g_print("player_get_progressive_download_status return[%d] ==> [Player_Test] progressive download status : %lu/%lu\n", bRet, curr, total);
1184 static void set_volume(float volume)
1186 if (player_set_volume(g_player[0], volume, volume) != PLAYER_ERROR_NONE)
1187 g_print("failed to set volume\n");
1190 static void get_volume(float *left, float *right)
1192 player_get_volume(g_player[0], left, right);
1193 g_print(" ==> [Player_Test] volume - left : %f, right : %f\n", *left, *right);
1196 static void set_mute(bool mute)
1198 if (player_set_mute(g_player[0], mute) != PLAYER_ERROR_NONE)
1199 g_print("failed to set_mute\n");
1202 static void get_mute(bool * mute)
1204 player_is_muted(g_player[0], mute);
1205 g_print(" ==> [Player_Test] mute = %d\n", *mute);
1208 static void set_sound_type(sound_type_e type)
1210 if (player_set_sound_type(g_player[0], type) != PLAYER_ERROR_NONE)
1211 g_print("failed to set sound type(%d)\n", type);
1213 g_print("set sound type(%d) success", type);
1216 void focus_callback(sound_stream_info_h stream_info, sound_stream_focus_change_reason_e reason_for_change, const char *additional_info, void *user_data)
1218 g_print("FOCUS callback is called, reason_for_change(%d), additional_info(%s), userdata(%p)", reason_for_change, additional_info, user_data);
1222 static void set_sound_stream_info(int type)
1224 if (g_stream_info_h) {
1225 g_print("stream information is already set, please destory handle and try again\n");
1228 if (sound_manager_create_stream_information(type, focus_callback, g_player[0], &g_stream_info_h)) {
1229 g_print("failed to create stream_information()\n");
1232 if (player_set_audio_policy_info(g_player[0], g_stream_info_h) != PLAYER_ERROR_NONE)
1233 g_print("failed to set sound stream information(%p)\n", g_stream_info_h);
1235 g_print("set stream information(%p) success", g_stream_info_h);
1238 static void get_position()
1242 ret = player_get_play_position(g_player[0], &position);
1243 g_print(" ==> [Player_Test] player_get_play_position()%d return : %d\n", ret, position);
1246 static void set_position(int position)
1248 if (player_set_play_position(g_player[0], position, TRUE, seek_completed_cb, g_player[0]) != PLAYER_ERROR_NONE)
1249 g_print("failed to set position\n");
1252 static void set_playback_rate(float rate, bool streaming)
1255 if (player_set_streaming_playback_rate(g_player[0], rate) != PLAYER_ERROR_NONE)
1256 g_print("failed to set streaming playback rate\n");
1258 if (player_set_playback_rate(g_player[0], rate) != PLAYER_ERROR_NONE)
1259 g_print("failed to set playback rate\n");
1263 static void get_duration()
1267 ret = player_get_duration(g_player[0], &duration);
1268 g_print(" ==> [Player_Test] player_get_duration() return : %d\n", ret);
1269 g_print(" ==> [Player_Test] Duration: [%d ] msec\n", duration);
1272 static void audio_frame_decoded_cb_ex()
1277 fp_out1 = fopen("/home/owner/content/out1.pcm", "wb");
1278 fp_out2 = fopen("/home/owner/content/out2.pcm", "wb");
1279 if (!fp_out1 || !fp_out2) {
1280 g_print("File open error\n");
1285 ret = player_set_pcm_extraction_mode(g_player[0], false, _audio_frame_decoded_cb_ex, &ret);
1286 g_print(" ==> [Player_Test] player_set_audio_frame_decoded_cb_ex return: %d\n", ret);
1289 static void set_pcm_spec()
1293 ret = player_set_pcm_spec(g_player[0], "F32LE", 44100, 2);
1294 g_print("[Player_Test] set_pcm_spec return: %d\n", ret);
1297 static void get_stream_info()
1303 player_get_content_info(g_player[0], PLAYER_CONTENT_INFO_ALBUM, &value);
1304 g_print(" ==> [Player_Test] PLAYER_CONTENT_INFO_ALBUM: [%s ] \n", value);
1305 player_get_content_info(g_player[0], PLAYER_CONTENT_INFO_ARTIST, &value);
1306 g_print(" ==> [Player_Test] PLAYER_CONTENT_INFO_ARTIST: [%s ] \n", value);
1307 player_get_content_info(g_player[0], PLAYER_CONTENT_INFO_AUTHOR, &value);
1308 g_print(" ==> [Player_Test] PLAYER_CONTENT_INFO_AUTHOR: [%s ] \n", value);
1309 player_get_content_info(g_player[0], PLAYER_CONTENT_INFO_GENRE, &value);
1310 g_print(" ==> [Player_Test] PLAYER_CONTENT_INFO_GENRE: [%s ] \n", value);
1311 player_get_content_info(g_player[0], PLAYER_CONTENT_INFO_TITLE, &value);
1312 g_print(" ==> [Player_Test] PLAYER_CONTENT_INFO_TITLE: [%s ] \n", value);
1315 player_get_album_art(g_player[0], &album, &size);
1316 g_print(" ==> [Player_Test] Album art : [ data : %p, size : %d ]\n", (unsigned int *)album, size);
1317 if (value != NULL) {
1325 int fps, v_bit_rate;
1326 player_get_audio_stream_info(g_player[0], &sample_rate, &channel, &bit_rate);
1327 g_print(" ==> [Player_Test] Sample Rate: [%d ] , Channel: [%d ] , Bit Rate: [%d ] \n", sample_rate, channel, bit_rate);
1329 player_get_video_stream_info(g_player[0], &fps, &v_bit_rate);
1330 g_print(" ==> [Player_Test] fps: [%d ] , Bit Rate: [%d ] \n", fps, v_bit_rate);
1332 char *audio_codec = NULL;
1333 char *video_codec = NULL;
1334 player_get_codec_info(g_player[0], &audio_codec, &video_codec);
1335 if (audio_codec != NULL) {
1336 g_print(" ==> [Player_Test] Audio Codec: [%s ] \n", audio_codec);
1340 if (video_codec != NULL) {
1341 g_print(" ==> [Player_Test] Video Codec: [%s ] \n", video_codec);
1345 player_get_video_size(g_player[0], &w, &h);
1346 g_print(" ==> [Player_Test] Width: [%d ] , Height: [%d ] \n", w, h);
1349 static void set_looping(bool looping)
1351 if (g_current_surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1352 if (player_set_looping(g_player[0], looping) != PLAYER_ERROR_NONE)
1353 g_print("failed to set_looping\n");
1356 for (i = 0; i < g_handle_num; i++) {
1357 if (player_set_looping(g_player[i], looping) != PLAYER_ERROR_NONE)
1358 g_print("failed to set_looping\n");
1363 static void get_looping(bool *looping)
1365 player_is_looping(g_player[0], looping);
1366 g_print(" ==> [Player_Test] looping = %d\n", *looping);
1369 static void change_surface(int option)
1371 player_display_type_e surface_type = 0;
1372 int ret = PLAYER_ERROR_NONE;
1373 #ifdef _ACTIVATE_EOM_
1375 eom_output_mode_e output_mode;
1380 surface_type = PLAYER_DISPLAY_TYPE_OVERLAY;
1381 g_print("change surface type to X\n");
1386 surface_type = PLAYER_DISPLAY_TYPE_EVAS;
1387 g_print("change surface type to EVAS\n");
1391 g_print("change surface type to NONE\n");
1392 player_set_display(g_player[0], PLAYER_DISPLAY_TYPE_NONE, NULL);
1395 g_print("invalid surface type\n");
1399 if (surface_type == g_current_surface_type) {
1400 g_print("same with the previous surface type(%d)\n", g_current_surface_type);
1403 player_state_e player_state = PLAYER_STATE_NONE;
1404 ret = player_get_state(g_player[0], &player_state);
1406 g_print("failed to player_get_state(), ret(0x%x)\n", ret);
1410 if (surface_type == PLAYER_DISPLAY_TYPE_OVERLAY) {
1411 #ifdef _ACTIVATE_EOM_
1412 hdmi_output_id = eom_get_output_id("HDMI");
1413 if (hdmi_output_id == 0)
1414 g_print("[eom] error : HDMI output id is NULL.\n");
1416 eom_get_output_mode(hdmi_output_id, &output_mode);
1417 if (output_mode == EOM_OUTPUT_MODE_NONE) {
1420 g_xid = create_win(PACKAGE);
1423 g_print("create xid %p\n", g_xid);
1424 create_render_rect_and_bg(g_xid);
1425 elm_win_activate(g_xid);
1426 evas_object_show(g_xid);
1427 g_xid = selected_xid;
1429 #ifdef _ACTIVATE_EOM_
1434 ret = player_set_display(g_player[0], surface_type, GET_DISPLAY(selected_xid));
1437 g_xid = create_win(PACKAGE);
1440 g_print("create xid %p\n", g_xid);
1441 create_render_rect_and_bg(g_xid);
1442 elm_win_activate(g_xid);
1443 evas_object_show(g_xid);
1446 for (i = 0; i < g_handle_num; i++) {
1447 /* Create evas image object for EVAS surface */
1449 g_eo[i] = create_image_object(g_xid);
1450 g_print("create eo[%d] %p\n", i, g_eo[i]);
1451 evas_object_image_size_set(g_eo[i], 500, 500);
1452 evas_object_image_fill_set(g_eo[i], 0, 0, 500, 500);
1453 evas_object_resize(g_eo[i], 500, 500);
1454 evas_object_move(g_eo[i], i * 20, i * 20);
1456 ret = player_set_display(g_player[i], surface_type, g_eo[i]);
1461 g_print("failed to set display, surface_type(%d)\n", surface_type);
1464 g_current_surface_type = surface_type;
1469 static void set_display_mode(int mode)
1471 if (player_set_display_mode(g_player[0], mode) != PLAYER_ERROR_NONE)
1472 g_print("failed to player_set_display_mode\n");
1475 static void get_display_mode()
1477 player_display_mode_e mode;
1478 player_get_display_mode(g_player[0], &mode);
1479 g_print(" ==> [Player_Test] Display mode: [%d ] \n", mode);
1482 static void set_display_rotation(int rotation)
1484 if (player_set_display_rotation(g_player[0], rotation) != PLAYER_ERROR_NONE)
1485 g_print("failed to set_display_rotation\n");
1488 static void get_display_rotation()
1490 player_display_rotation_e rotation = 0;
1491 player_get_display_rotation(g_player[0], &rotation);
1492 g_print(" ==> [Player_Test] X11 Display rotation: [%d ] \n", rotation);
1495 static void set_display_visible(bool visible)
1497 if (player_set_display_visible(g_player[0], visible) != PLAYER_ERROR_NONE)
1498 g_print("failed to player_set_x11_display_visible\n");
1501 static void get_display_visible(bool *visible)
1503 player_is_display_visible(g_player[0], visible);
1504 g_print(" ==> [Player_Test] X11 Display Visible = %d\n", *visible);
1507 static void set_display_dst_roi(int x, int y, int w, int h)
1510 if (player_set_x11_display_dst_roi(g_player[0], x, y, w, h) != PLAYER_ERROR_NONE)
1511 g_print("failed to player_set_x11_display_dst_roi\n");
1513 g_print(" ==> [Player_Test] set X11 Display DST ROI (x:%d, y:%d, w:%d, h:%d)\n", x, y, w, h);
1517 static void get_display_dst_roi()
1525 if (player_get_x11_display_dst_roi(g_player[0], &x, &y, &w, &h) != PLAYER_ERROR_NONE)
1526 g_print("failed to player_get_x11_display_dst_roi\n");
1528 g_print(" ==> [Player_Test] got X11 Display DST ROI (x:%d, y:%d, w:%d, h:%d)\n", x, y, w, h);
1532 static void set_display_roi_mode(int mode)
1535 if (player_set_x11_display_roi_mode(g_player[0], (player_display_roi_mode_e) mode) != PLAYER_ERROR_NONE)
1536 g_print("failed to player_set_x11_display_roi_mode\n");
1538 g_print(" ==> [Player_Test] set X11 Display ROI mode (%d)\n", mode);
1542 static void get_display_roi_mode()
1545 player_display_roi_mode_e mode;
1546 if (player_get_x11_display_roi_mode(g_player[0], &mode) != PLAYER_ERROR_NONE)
1547 g_print("failed to player_get_x11_display_roi_mode\n");
1549 g_print(" ==> [Player_Test] got X11 Display ROI mode (%d)\n", mode);
1553 static void set_display_src_crop(int x, int y, int w, int h)
1556 if (player_set_x11_display_src_crop(g_player[0], x, y, w, h) != PLAYER_ERROR_NONE)
1557 g_print("failed to player_set_x11_display_src_crop\n");
1559 g_print(" ==> [Player_Test] set X11 Display SRC CROP (x:%d, y:%d, w:%d, h:%d)\n", x, y, w, h);
1563 static void get_display_src_crop()
1571 if (player_get_x11_display_src_crop(g_player[0], &x, &y, &w, &h) != PLAYER_ERROR_NONE)
1572 g_print("failed to player_get_x11_display_src_crop\n");
1574 g_print(" ==> [Player_Test] got X11 Display SRC CROP (x:%d, y:%d, w:%d, h:%d)\n", x, y, w, h);
1578 static void input_subtitle_filename(char *subtitle_filename)
1580 int len = strlen(subtitle_filename);
1582 if (len < 1 || len > MAX_STRING_LEN)
1585 strncpy(g_subtitle_uri, subtitle_filename, len);
1586 g_print("subtitle uri is set to %s\n", g_subtitle_uri);
1587 player_set_subtitle_path(g_player[0], g_subtitle_uri);
1590 static void switch_subtitle(int index)
1592 char *lang_code = NULL;
1593 if (player_select_track(g_player[0], PLAYER_STREAM_TYPE_TEXT, index) != PLAYER_ERROR_NONE)
1594 g_print("player_select_track failed\n");
1596 if (player_get_track_language_code(g_player[0], PLAYER_STREAM_TYPE_TEXT, index, &lang_code) == PLAYER_ERROR_NONE) {
1597 g_print("selected track code %s\n", lang_code);
1602 static void capture_video()
1604 if (player_capture_video(g_player[0], video_captured_cb, NULL) != PLAYER_ERROR_NONE)
1605 g_print("failed to player_capture_video\n");
1608 static void decoding_audio()
1612 char *suffix, *dump_path;
1613 GDateTime *time = g_date_time_new_now_local();
1615 suffix = g_date_time_format(time, "%Y%m%d_%H%M%S.pcm");
1616 dump_path = g_strjoin(NULL, PLAYER_TEST_DUMP_PATH_PREFIX, suffix, NULL);
1617 g_pcm_fd = fopen(dump_path, "w+");
1620 g_date_time_unref(time);
1622 g_print("Can not create debug dump file");
1624 ret = player_set_audio_frame_decoded_cb(g_player[0], 0, 0, audio_frame_decoded_cb, (void *)g_player[0]);
1625 if (ret != PLAYER_ERROR_NONE)
1626 g_print("player_set_audio_frame_decoded_cb is failed (errno = %d) \n", ret);
1630 static void set_audio_eq(int value)
1632 bool available = FALSE;
1633 int index, min, max;
1636 if (player_audio_effect_equalizer_is_available(g_player[0], &available) != PLAYER_ERROR_NONE)
1637 g_print("failed to player_audio_effect_equalizer_is_available\n");
1640 if ((player_audio_effect_get_equalizer_bands_count(g_player[0], &index) != PLAYER_ERROR_NONE) ||
1641 (player_audio_effect_get_equalizer_level_range(g_player[0], &min, &max) != PLAYER_ERROR_NONE) ||
1642 (player_audio_effect_set_equalizer_band_level(g_player[0], index / 2, max) != PLAYER_ERROR_NONE))
1643 g_print("failed to player_audio_effect_set_equalizer_band_level index %d, level %d\n", index / 2, max);
1648 if (player_audio_effect_equalizer_clear(g_player[0]) != PLAYER_ERROR_NONE)
1649 g_print("failed to player_audio_effect_equalizer_clear\n");
1654 static void get_audio_eq()
1656 int index, min, max, value;
1657 player_audio_effect_get_equalizer_bands_count(g_player[0], &index);
1658 g_print(" ==> [Player_Test] eq bands count: [%d] \n", index);
1659 player_audio_effect_get_equalizer_level_range(g_player[0], &min, &max);
1660 g_print(" ==> [Player_Test] eq bands range: [%d~%d] \n", min, max);
1661 player_audio_effect_get_equalizer_band_level(g_player[0], index / 2, &value);
1662 g_print(" ==> [Player_Test] eq bands level: [%d] \n", value);
1663 player_audio_effect_get_equalizer_band_frequency(g_player[0], 0, &value);
1664 g_print(" ==> [Player_Test] eq bands frequency: [%d] \n", value);
1665 player_audio_effect_get_equalizer_band_frequency_range(g_player[0], 0, &value);
1666 g_print(" ==> [Player_Test] eq bands frequency range: [%d] \n", value);
1676 for (i = 0; i < g_handle_num; i++) {
1677 if (g_player[i] != NULL) {
1678 player_unprepare(g_player[i]);
1679 player_destroy(g_player[i]);
1686 media_format_unref(g_audio_fmt);
1689 media_format_unref(g_video_fmt);
1692 void play_with_ini(char *file_path)
1694 input_filename(file_path);
1698 void _interpret_main_menu(char *cmd)
1700 int len = strlen(cmd);
1702 if (strncmp(cmd, "a", 1) == 0) {
1703 g_menu_state = CURRENT_STATUS_FILENAME;
1704 } else if (strncmp(cmd, "1", 1) == 0) {
1705 play_with_ini(g_file_list[0]);
1706 } else if (strncmp(cmd, "2", 1) == 0) {
1707 play_with_ini(g_file_list[1]);
1708 } else if (strncmp(cmd, "3", 1) == 0) {
1709 play_with_ini(g_file_list[2]);
1710 } else if (strncmp(cmd, "4", 1) == 0) {
1711 play_with_ini(g_file_list[3]);
1712 } else if (strncmp(cmd, "5", 1) == 0) {
1713 play_with_ini(g_file_list[4]);
1714 } else if (strncmp(cmd, "6", 1) == 0) {
1715 play_with_ini(g_file_list[5]);
1716 } else if (strncmp(cmd, "7", 1) == 0) {
1717 play_with_ini(g_file_list[6]);
1718 } else if (strncmp(cmd, "8", 1) == 0) {
1719 play_with_ini(g_file_list[7]);
1720 } else if (strncmp(cmd, "9", 1) == 0) {
1721 play_with_ini(g_file_list[8]);
1722 } else if (strncmp(cmd, "b", 1) == 0) {
1724 } else if (strncmp(cmd, "c", 1) == 0) {
1726 } else if (strncmp(cmd, "d", 1) == 0) {
1728 } else if (strncmp(cmd, "e", 1) == 0) {
1730 } else if (strncmp(cmd, "S", 1) == 0) {
1732 } else if (strncmp(cmd, "f", 1) == 0) {
1733 g_menu_state = CURRENT_STATUS_VOLUME;
1734 } else if (strncmp(cmd, "g", 1) == 0) {
1737 get_volume(&left, &right);
1738 } else if (strncmp(cmd, "z", 1) == 0) {
1739 g_menu_state = CURRENT_STATUS_SOUND_TYPE;
1740 } else if (strncmp(cmd, "k", 1) == 0) {
1741 g_menu_state = CURRENT_STATUS_SOUND_STREAM_INFO;
1742 } else if (strncmp(cmd, "h", 1) == 0) {
1743 g_menu_state = CURRENT_STATUS_MUTE;
1744 } else if (strncmp(cmd, "i", 1) == 0) {
1747 } else if (strncmp(cmd, "j", 1) == 0) {
1748 g_menu_state = CURRENT_STATUS_POSITION_TIME;
1749 } else if (strncmp(cmd, "l", 1) == 0) {
1751 } else if (strncmp(cmd, "m", 1) == 0) {
1753 } else if (strncmp(cmd, "n", 1) == 0) {
1755 } else if (strncmp(cmd, "o", 1) == 0) {
1756 g_menu_state = CURRENT_STATUS_LOOPING;
1757 } else if (strncmp(cmd, "p", 1) == 0) {
1759 get_looping(&looping);
1760 } else if (strncmp(cmd, "r", 1) == 0) {
1761 g_menu_state = CURRENT_STATUS_DISPLAY_MODE;
1762 } else if (strncmp(cmd, "s", 1) == 0) {
1764 } else if (strncmp(cmd, "t", 1) == 0) {
1765 g_menu_state = CURRENT_STATUS_DISPLAY_ROTATION;
1766 } else if (strncmp(cmd, "u", 1) == 0) {
1767 get_display_rotation();
1768 } else if (strncmp(cmd, "v", 1) == 0) {
1769 g_menu_state = CURRENT_STATUS_DISPLAY_VISIBLE;
1770 } else if (strncmp(cmd, "w", 1) == 0) {
1772 get_display_visible(&visible);
1773 } else if (strncmp(cmd, "x", 1) == 0) {
1774 g_menu_state = CURRENT_STATUS_DISPLAY_DST_ROI;
1775 } else if (strncmp(cmd, "y", 1) == 0) {
1776 get_display_dst_roi();
1777 } else if (strncmp(cmd, "M", 1) == 0) {
1778 g_menu_state = CURRENT_STATUS_DISPLAY_ROI_MODE;
1779 } else if (strncmp(cmd, "N", 1) == 0) {
1780 get_display_roi_mode();
1781 } else if (strncmp(cmd, "F", 1) == 0) {
1782 g_menu_state = CURRENT_STATUS_DISPLAY_SRC_CROP;
1783 } else if (strncmp(cmd, "G", 1) == 0) {
1784 get_display_src_crop();
1785 } else if (strncmp(cmd, "A", 1) == 0) {
1786 g_menu_state = CURRENT_STATUS_SUBTITLE_FILENAME;
1787 } else if (strncmp(cmd, "C", 1) == 0) {
1789 } else if (strncmp(cmd, "D", 1) == 0) {
1791 } else if (strncmp(cmd, "q", 1) == 0) {
1792 quit_pushing = TRUE;
1794 } else if (strncmp(cmd, "E", 1) == 0) {
1795 g_menu_state = CURRENT_STATUS_AUDIO_EQUALIZER;
1796 } else if (strncmp(cmd, "H", 1) == 0) {
1799 g_print("unknown menu \n");
1801 } else if (len == 2) {
1802 if (strncmp(cmd, "pr", 2) == 0) {
1804 _player_prepare(FALSE);
1805 } else if (strncmp(cmd, "pa", 2) == 0) {
1807 _player_prepare(TRUE);
1808 } else if (strncmp(cmd, "un", 2) == 0) {
1809 _player_unprepare();
1810 } else if (strncmp(cmd, "dt", 2) == 0) {
1812 } else if (strncmp(cmd, "sp", 2) == 0) {
1813 _player_set_progressive_download();
1814 } else if (strncmp(cmd, "gp", 2) == 0) {
1815 _player_get_progressive_download_status();
1816 } else if (strncmp(cmd, "mp", 2) == 0) {
1817 g_memory_playback = (g_memory_playback ? FALSE : TRUE);
1818 g_print("memory playback = %d\n", g_memory_playback);
1819 } else if (strncmp(cmd, "ds", 2) == 0) {
1820 g_menu_state = CURRENT_STATUS_DISPLAY_SURFACE_CHANGE;
1821 } else if (strncmp(cmd, "nb", 2) == 0) {
1822 g_menu_state = CURRENT_STATUS_HANDLE_NUM;
1823 } else if (strncmp(cmd, "tr", 2) == 0) {
1824 g_menu_state = CURRENT_STATUS_PLAYBACK_RATE;
1825 } else if (strncmp(cmd, "ss", 2) == 0) {
1826 g_menu_state = CURRENT_STATUS_SWITCH_SUBTITLE;
1827 } else if (strncmp(cmd, "X3", 2) == 0) {
1828 audio_frame_decoded_cb_ex();
1829 } else if (strncmp(cmd, "X4", 2) == 0) {
1832 g_print("unknown menu \n");
1835 if (strncmp(cmd, "trs", 3) == 0)
1836 g_menu_state = CURRENT_STATUS_STREAMING_PLAYBACK_RATE;
1838 g_print("unknown menu \n");
1842 void display_sub_basic()
1846 g_print("=========================================================================================\n");
1847 g_print(" Player Test (press q to quit) \n");
1848 g_print("-----------------------------------------------------------------------------------------\n");
1849 g_print("*. Sample List in [%s] \t", MMTS_SAMPLELIST_INI_DEFAULT_PATH);
1850 g_print("nb. num. of handles \n");
1851 for (idx = 1; idx <= INI_SAMPLE_LIST_MAX; idx++) {
1852 if (strlen(g_file_list[idx - 1]) > 0)
1853 g_print("%d. Play [%s]\n", idx, g_file_list[idx - 1]);
1855 g_print("-----------------------------------------------------------------------------------------\n");
1856 g_print("[playback] a. Create\t");
1857 g_print("pr. Prepare \t");
1858 g_print("pa. Prepare async \t");
1859 g_print("b. Play \t");
1860 g_print("c. Stop \t");
1861 g_print("d. Resume\t");
1862 g_print("e. Pause \t");
1863 g_print("un. Unprepare \t");
1864 g_print("dt. Destroy \n");
1865 g_print("[State] S. Player State \n");
1866 g_print("[ volume ] f. Set Volume\t");
1867 g_print("g. Get Volume\t");
1868 g_print("z. Set Sound type\t");
1869 g_print("k. Set Sound Stream Info.\t");
1870 g_print("[ mute ] h. Set Mute\t");
1871 g_print("i. Get Mute\n");
1872 g_print("[audio eq] E. Set Audio EQ\t");
1873 g_print("H. Get Audio EQ\n");
1874 g_print("[position] j. Set Position \t");
1875 g_print("l. Get Position\n");
1876 g_print("[trick] tr. set playback rate\n");
1877 g_print("[duration] m. Get Duration\n");
1878 g_print("[Stream Info] n. Get stream info (Video Size, codec, audio stream info, and tag info)\n");
1879 g_print("[Looping] o. Set Looping\t");
1880 g_print("p. Get Looping\n");
1881 g_print("[display] v. Set display visible\t");
1882 g_print("w. Get display visible\n");
1883 g_print("[display] ds. Change display surface type\n");
1884 g_print("[x display] r. Set display mode\t");
1885 g_print("s. Get display mode\n");
1886 g_print("[x display] t. Set display Rotation\t");
1887 g_print("[Track] tl. Get Track language info(single only)\n");
1888 g_print("[subtitle] A. Set(or change) subtitle path\n");
1889 g_print("[subtitle] ss. Select(or change) subtitle track\n");
1890 g_print("[Video Capture] C. Capture \n");
1891 g_print("[etc] sp. Set Progressive Download\t");
1892 g_print("gp. Get Progressive Download status\n");
1893 g_print("mp. memory playback\n");
1894 g_print("[audio_frame_decoded_cb_ex] X3. (input) set audio_frame_decoded_cb_ex callback \n");
1896 g_print("=========================================================================================\n");
1899 static void displaymenu()
1901 if (g_menu_state == CURRENT_STATUS_MAINMENU) {
1902 display_sub_basic();
1903 } else if (g_menu_state == CURRENT_STATUS_HANDLE_NUM) {
1904 g_print("*** input number of handles.(recommended only for EVAS surface)\n");
1905 } else if (g_menu_state == CURRENT_STATUS_FILENAME) {
1906 g_print("*** input mediapath.\n");
1907 } else if (g_menu_state == CURRENT_STATUS_VOLUME) {
1908 g_print("*** input volume value.(0~1.0)\n");
1909 } else if (g_menu_state == CURRENT_STATUS_SOUND_TYPE) {
1910 g_print("*** input sound type.(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:FIXED)\n");
1911 } else if (g_menu_state == CURRENT_STATUS_SOUND_STREAM_INFO) {
1912 g_print("*** input sound stream type.(0:MEDIA 1:SYSTEM 2:ALARM 3:NOTIFICATION 4:RINGTONE 5:CALL 6:VOIP)\n");
1913 } else if (g_menu_state == CURRENT_STATUS_MUTE) {
1914 g_print("*** input mute value.(0: Not Mute, 1: Mute) \n");
1915 } else if (g_menu_state == CURRENT_STATUS_POSITION_TIME) {
1916 g_print("*** input position value(msec)\n");
1917 } else if (g_menu_state == CURRENT_STATUS_LOOPING) {
1918 g_print("*** input looping value.(0: Not Looping, 1: Looping) \n");
1919 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_SURFACE_CHANGE) {
1920 g_print("*** input display surface type.(0: X surface, 1: EVAS surface) \n");
1921 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_MODE) {
1922 g_print("*** input display mode value.(0: LETTER BOX, 1: ORIGIN SIZE, 2: FULL_SCREEN, 3: CROPPED_FULL, 4: ORIGIN_OR_LETTER, 5: ROI) \n");
1923 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_ROTATION) {
1924 g_print("*** input display rotation value.(0: NONE, 1: 90, 2: 180, 3: 270, 4:F LIP_HORZ, 5: FLIP_VERT ) \n");
1925 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_VISIBLE) {
1926 g_print("*** input display visible value.(0: HIDE, 1: SHOW) \n");
1927 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_ROI_MODE) {
1928 g_print("*** input display roi mode.(0: FULL_SCREEN, 1: LETTER BOX)\n");
1929 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_DST_ROI) {
1930 g_print("*** input display roi value sequentially.(x, y, w, h)\n");
1931 } else if (g_menu_state == CURRENT_STATUS_DISPLAY_SRC_CROP) {
1932 g_print("*** input display source crop value sequentially.(x, y, w, h)\n");
1933 } else if (g_menu_state == CURRENT_STATUS_SUBTITLE_FILENAME) {
1934 g_print(" *** input subtitle file path.\n");
1935 } else if (g_menu_state == CURRENT_STATUS_AUDIO_EQUALIZER) {
1936 g_print(" *** input audio eq value.(0: UNSET, 1: SET) \n");
1937 } else if (g_menu_state == CURRENT_STATUS_PLAYBACK_RATE || g_menu_state == CURRENT_STATUS_STREAMING_PLAYBACK_RATE) {
1938 g_print(" *** input playback rate.(-5.0 ~ 5.0)\n");
1939 } else if (g_menu_state == CURRENT_STATUS_SWITCH_SUBTITLE) {
1940 int count = 0, cur_index = 0;
1943 ret = player_get_track_count(g_player[0], PLAYER_STREAM_TYPE_TEXT, &count);
1944 if (ret != PLAYER_ERROR_NONE)
1945 g_print("player_get_track_count fail!!!!\n");
1947 g_print("Total subtitle tracks = %d \n", count);
1948 player_get_current_track(g_player[0], PLAYER_STREAM_TYPE_TEXT, &cur_index);
1949 g_print("Current index = %d \n", cur_index);
1950 g_print(" *** input correct index 0 to %d\n:", (count - 1));
1952 g_print("no track\n");
1954 g_print("*** unknown status.\n");
1960 gboolean timeout_menu_display(void *data)
1966 gboolean timeout_quit_program(void *data)
1972 void reset_menu_state(void)
1974 g_menu_state = CURRENT_STATUS_MAINMENU;
1977 static void interpret(char *cmd)
1979 switch (g_menu_state) {
1980 case CURRENT_STATUS_MAINMENU:
1982 _interpret_main_menu(cmd);
1985 case CURRENT_STATUS_HANDLE_NUM:
1987 int num_handle = atoi(cmd);
1988 if (0 >= num_handle || num_handle > MAX_HANDLE)
1989 g_print("not supported this number for handles(%d)\n", num_handle);
1991 g_handle_num = num_handle;
1996 case CURRENT_STATUS_FILENAME:
1998 input_filename(cmd);
2002 case CURRENT_STATUS_VOLUME:
2004 float level = atof(cmd);
2009 case CURRENT_STATUS_SOUND_TYPE:
2011 int type = atoi(cmd);
2012 set_sound_type(type);
2016 case CURRENT_STATUS_SOUND_STREAM_INFO:
2018 int type = atoi(cmd);
2019 set_sound_stream_info(type);
2023 case CURRENT_STATUS_MUTE:
2025 int mute = atoi(cmd);
2030 case CURRENT_STATUS_POSITION_TIME:
2032 long position = atol(cmd);
2033 set_position(position);
2037 case CURRENT_STATUS_LOOPING:
2039 int looping = atoi(cmd);
2040 set_looping(looping);
2044 case CURRENT_STATUS_DISPLAY_SURFACE_CHANGE:
2046 int type = atoi(cmd);
2047 change_surface(type);
2051 case CURRENT_STATUS_DISPLAY_MODE:
2053 int mode = atoi(cmd);
2054 set_display_mode(mode);
2058 case CURRENT_STATUS_DISPLAY_ROTATION:
2060 int rotation = atoi(cmd);
2061 set_display_rotation(rotation);
2065 case CURRENT_STATUS_DISPLAY_VISIBLE:
2067 int visible = atoi(cmd);
2068 set_display_visible(visible);
2072 case CURRENT_STATUS_DISPLAY_DST_ROI:
2074 int value = atoi(cmd);
2075 static int roi_x = 0;
2076 static int roi_y = 0;
2077 static int roi_w = 0;
2078 static int roi_h = 0;
2096 set_display_dst_roi(roi_x, roi_y, roi_w, roi_h);
2097 roi_x = roi_y = roi_w = roi_h = 0;
2105 case CURRENT_STATUS_DISPLAY_SRC_CROP:
2107 int value = atoi(cmd);
2108 static int crop_x = 0;
2109 static int crop_y = 0;
2110 static int crop_w = 0;
2111 static int crop_h = 0;
2112 static int crop_cnt = 0;
2129 set_display_src_crop(crop_x, crop_y, crop_w, crop_h);
2130 crop_x = crop_y = crop_w = crop_h = 0;
2138 case CURRENT_STATUS_DISPLAY_ROI_MODE:
2140 int value = atoi(cmd);
2141 set_display_roi_mode(value);
2145 case CURRENT_STATUS_SUBTITLE_FILENAME:
2147 input_subtitle_filename(cmd);
2151 case CURRENT_STATUS_AUDIO_EQUALIZER:
2153 int value = atoi(cmd);
2154 set_audio_eq(value);
2158 case CURRENT_STATUS_PLAYBACK_RATE:
2160 float rate = atof(cmd);
2161 set_playback_rate(rate, FALSE);
2165 case CURRENT_STATUS_STREAMING_PLAYBACK_RATE:
2167 float rate = atof(cmd);
2168 set_playback_rate(rate, TRUE);
2172 case CURRENT_STATUS_SWITCH_SUBTITLE:
2174 int index = atoi(cmd);
2175 switch_subtitle(index);
2180 g_timeout_add(100, timeout_menu_display, 0);
2183 gboolean input(GIOChannel *channel)
2185 gchar buf[MAX_STRING_LEN];
2187 GError *error = NULL;
2189 g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error);
2197 int main(int argc, char *argv[])
2199 GIOChannel *stdin_channel;
2200 stdin_channel = g_io_channel_unix_new(0);
2201 g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
2202 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)input, NULL);
2205 memset(&ad, 0x0, sizeof(appdata));
2208 return appcore_efl_main(PACKAGE, &argc, &argv, &ops);