mirror of
https://gitee.com/Vancouver2017/luban-lite.git
synced 2025-12-27 22:48:54 +00:00
507 lines
12 KiB
C
Executable File
507 lines
12 KiB
C
Executable File
/*
|
|
* Copyright (C) 2020-2023 ArtInChip Technology Co. Ltd
|
|
*
|
|
* author: <jun.ma@artinchip.com>
|
|
* Desc: OMX_VdecComponent tunneld OMX_VideoRenderComponent demo
|
|
*/
|
|
|
|
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#include <pthread.h>
|
|
|
|
#include "mpp_dec_type.h"
|
|
#include "mpp_list.h"
|
|
#include "mpp_log.h"
|
|
#include "mpp_mem.h"
|
|
#include "aic_message.h"
|
|
#include "aic_player.h"
|
|
|
|
#include <rthw.h>
|
|
#include <rtthread.h>
|
|
//#include "aic_core.h"
|
|
|
|
|
|
static int g_player_end = 0;
|
|
static int g_exit;
|
|
|
|
/*
|
|
char g_filename[][256] = {
|
|
// "liulangdiqiu_01.mp4",
|
|
"/video/19031214_01.mp4",
|
|
"/video/19031214_0ddddd1.mp4",
|
|
"/video/xihongshishoufu_01.mp4",
|
|
"/video/19030915_01.mp4",
|
|
"/video/19031208_01.mp4",
|
|
"/video/19031214_01.mp4",
|
|
"/video/19031309_01.mp4",
|
|
"/video/19031410_01.mp4",
|
|
"/video/19031422_01.mp4",
|
|
"/video/19031715_01.mp4",
|
|
"/video/19031821_01.mp4",
|
|
"/video/19031823_01.mp4",
|
|
"/video/19031910_01.mp4",
|
|
"/video/19031912_01.mp4",
|
|
"/video/19031921_01.mp4",
|
|
"/video/19031922_01.mp4",
|
|
"/video/19032115_01.mp4",
|
|
//"liulangdiqiu_01.mp4",
|
|
"kuaishou_h264_mp3.mp4",
|
|
"xihongshishoufu_01.mp4"
|
|
};
|
|
*/
|
|
|
|
char g_filename[][256] = {
|
|
"/video/19030915_no_audio_01.mp4",
|
|
"/video/19031208_no_audio_01.mp4",
|
|
"/video/19031921_no_audio_01.mp4"
|
|
};
|
|
|
|
|
|
|
|
static int g_sync_flag = AIC_PLAYER_PREPARE_SYNC;
|
|
static struct av_media_info g_media_info;
|
|
struct mpp_size g_screen_size;
|
|
|
|
struct mpp_rect g_disp_rect;
|
|
|
|
static int g_demuxer_detected_flag = 0;
|
|
s32 event_handle( void* app_data,s32 event,s32 data1,s32 data2)
|
|
{
|
|
int ret = 0;
|
|
//struct aic_player *player = (struct aic_player *)app_data;
|
|
|
|
switch(event){
|
|
case AIC_PLAYER_EVENT_PLAY_END:
|
|
g_player_end = 1;
|
|
loge("g_player_end\n");
|
|
break;
|
|
case AIC_PLAYER_EVENT_PLAY_TIME:
|
|
break;
|
|
case AIC_PLAYER_EVENT_DEMUXER_FORMAT_DETECTED:
|
|
if(AIC_PLAYER_PREPARE_ASYNC == g_sync_flag){
|
|
g_demuxer_detected_flag = 1;
|
|
loge("AIC_PLAYER_EVENT_DEMUXER_FORMAT_DETECTED\n");
|
|
}
|
|
break;
|
|
|
|
case AIC_PLAYER_EVENT_DEMUXER_FORMAT_NOT_DETECTED:
|
|
if(AIC_PLAYER_PREPARE_ASYNC == g_sync_flag){
|
|
loge("AIC_PLAYER_EVENT_DEMUXER_FORMAT_NOT_DETECTED\n");
|
|
loge("cur file format not detected,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
static void handle_exit(int signo)
|
|
{
|
|
loge("exit cause:%d\n",signo);
|
|
g_exit = 1;
|
|
}
|
|
|
|
#define BUFFER_LEN 32
|
|
|
|
int player_demo(int argc,char*argv[])
|
|
{
|
|
int ret = 0;
|
|
int i = 0;
|
|
int k = 0;
|
|
char buffer[BUFFER_LEN];
|
|
unsigned int len;
|
|
struct timeval t;
|
|
int flag;
|
|
int cnt =0;
|
|
cnt = sizeof(g_filename)/sizeof(g_filename[0]);
|
|
loge("cnt:%d",cnt);
|
|
|
|
signal(SIGINT, handle_exit);
|
|
|
|
struct aic_player *player = aic_player_create(NULL);
|
|
if(player == NULL){
|
|
loge("aic_player_create fail!!!\n");
|
|
return -1;
|
|
}
|
|
aic_player_set_event_callback(player,player,event_handle);
|
|
logi("start play........\n");
|
|
|
|
|
|
i = 0;
|
|
while(1){
|
|
k = i%cnt;
|
|
loge("play filename[%d]:%s\n",i,g_filename[k]);
|
|
|
|
aic_player_set_uri(player,g_filename[k]);
|
|
|
|
g_sync_flag = AIC_PLAYER_PREPARE_SYNC;
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_ASYNC){
|
|
ret = aic_player_prepare_async(player);
|
|
}else{
|
|
ret = aic_player_prepare_sync(player);
|
|
}
|
|
|
|
if(ret){
|
|
loge("aic_player_prepare error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_SYNC){
|
|
ret = aic_player_start(player);
|
|
if(ret != 0){
|
|
loge("aic_player_start error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
logi("aic_player_start ok\n");
|
|
|
|
aic_player_get_screen_size(player, &g_screen_size);
|
|
//g_screen_size: 1024*600
|
|
loge("screen_width:%d,screen_height:%d\n",g_screen_size.width,g_screen_size.height);
|
|
//attention:disp not exceed screen_size
|
|
g_disp_rect.x = 324;
|
|
g_disp_rect.y = 50;
|
|
g_disp_rect.width = 600;
|
|
g_disp_rect.height = 500;
|
|
ret = aic_player_set_disp_rect(player, &g_disp_rect);
|
|
|
|
if(ret != 0){
|
|
loge("aic_player_set_disp_rect error\n");
|
|
}
|
|
|
|
ret = aic_player_get_media_info(player,&g_media_info);
|
|
if(ret != 0){
|
|
loge("aic_player_get_media_info error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
|
|
}
|
|
logi("aic_player_get_media_info ok\n");
|
|
ret = aic_player_play(player);
|
|
if(ret != 0){
|
|
loge("aic_player_play error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
logi("aic_player_play ok\n");
|
|
}
|
|
|
|
flag = fcntl(STDIN_FILENO,F_GETFL);
|
|
flag |= O_NONBLOCK;
|
|
fcntl(STDIN_FILENO,F_SETFL,flag);
|
|
|
|
while(1)
|
|
{
|
|
_NEXT_FILE_:
|
|
if(g_player_end == 1){
|
|
loge("play file:%s end!!!!\n",g_filename[k]);
|
|
ret = aic_player_stop(player);
|
|
//show_mem_info_debug();
|
|
g_player_end = 0;
|
|
i++;
|
|
i = (i > cnt -1)?(0):(i);
|
|
break;
|
|
}
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_ASYNC && g_demuxer_detected_flag == 1){
|
|
g_demuxer_detected_flag = 0;
|
|
ret = aic_player_start(player);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_start error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
|
|
aic_player_get_screen_size(player, &g_screen_size);
|
|
loge("screen_width:%d,screen_height:%d\n",g_screen_size.width,g_screen_size.height);
|
|
//attention:disp not exceed screen_size
|
|
g_disp_rect.x = 324;
|
|
g_disp_rect.y = 50;
|
|
g_disp_rect.width = 600;
|
|
g_disp_rect.height = 500;
|
|
ret = aic_player_set_disp_rect(player, &g_disp_rect);
|
|
if(ret != 0){
|
|
loge("aic_player_set_disp_rect error\n");
|
|
}
|
|
|
|
ret = aic_player_get_media_info(player,&g_media_info);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_get_media_info error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
ret = aic_player_play(player);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_play error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
loge("aic_player_play ok\n");
|
|
}
|
|
|
|
if(read(STDIN_FILENO, buffer, BUFFER_LEN) > 0){
|
|
if(buffer[0] == 0x20){// pause
|
|
loge("*********enter pause ***************\n");
|
|
aic_player_pause(player);
|
|
}else if(buffer[0] == 'd'){//stop cur, star next
|
|
loge("*********enter down ***************\n");
|
|
aic_player_stop(player);
|
|
//show_mem_info_debug();
|
|
i++;
|
|
i = (i > cnt -1)?(0):(i);
|
|
break;
|
|
}else if(buffer[0] == 'u'){//stop cur, star pre
|
|
loge("*********enter up ***************\n");
|
|
aic_player_stop(player);
|
|
i--;
|
|
i = (i < 0)?(cnt-1):(i);
|
|
break;
|
|
}else{
|
|
}
|
|
}else{
|
|
usleep(1000*1000);
|
|
}
|
|
if(g_exit == 1 ){
|
|
loge("app will exit\n");
|
|
aic_player_stop(player);
|
|
loge("app will exit\n");
|
|
goto _EXIT0_;
|
|
}
|
|
}
|
|
}
|
|
|
|
_EXIT0_:
|
|
aic_player_destroy(player);
|
|
//show_mem_info_debug();
|
|
return ret;
|
|
}
|
|
#else
|
|
#define BUFFER_LEN 32
|
|
|
|
void* player_thread(void* pThreadData)
|
|
{
|
|
int ret = 0;
|
|
int i = 0;
|
|
int k = 0;
|
|
char buffer[BUFFER_LEN];
|
|
//unsigned int len;
|
|
//struct timeval t;
|
|
int flag;
|
|
int cnt =0;
|
|
cnt = sizeof(g_filename)/sizeof(g_filename[0]);
|
|
loge("cnt:%d",cnt);
|
|
|
|
//signal(SIGINT, handle_exit);
|
|
|
|
struct aic_player *player = aic_player_create(NULL);
|
|
if(player == NULL){
|
|
loge("aic_player_create fail!!!\n");
|
|
return (void*)-1;
|
|
}
|
|
aic_player_set_event_callback(player,player,event_handle);
|
|
logi("start play........\n");
|
|
|
|
|
|
i = 0;
|
|
while(1){
|
|
k = i%cnt;
|
|
loge("play filename[%d]:%s\n",i,g_filename[k]);
|
|
|
|
aic_player_set_uri(player,g_filename[k]);
|
|
|
|
g_sync_flag = AIC_PLAYER_PREPARE_SYNC;
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_ASYNC){
|
|
ret = aic_player_prepare_async(player);
|
|
}else{
|
|
ret = aic_player_prepare_sync(player);
|
|
}
|
|
|
|
if(ret){
|
|
loge("aic_player_prepare error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_SYNC){
|
|
ret = aic_player_start(player);
|
|
if(ret != 0){
|
|
loge("aic_player_start error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
logi("aic_player_start ok\n");
|
|
|
|
aic_player_get_screen_size(player, &g_screen_size);
|
|
//g_screen_size: 1024*600
|
|
loge("screen_width:%d,screen_height:%d\n",g_screen_size.width,g_screen_size.height);
|
|
//attention:disp not exceed screen_size
|
|
g_disp_rect.x = 324;
|
|
g_disp_rect.y = 50;
|
|
g_disp_rect.width = 600;
|
|
g_disp_rect.height = 500;
|
|
ret = aic_player_set_disp_rect(player, &g_disp_rect);
|
|
|
|
if(ret != 0){
|
|
loge("aic_player_set_disp_rect error\n");
|
|
}
|
|
|
|
ret = aic_player_get_media_info(player,&g_media_info);
|
|
if(ret != 0){
|
|
loge("aic_player_get_media_info error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
|
|
}
|
|
logi("aic_player_get_media_info ok\n");
|
|
ret = aic_player_play(player);
|
|
if(ret != 0){
|
|
loge("aic_player_play error!!!!\n");
|
|
g_player_end = 1;
|
|
goto _NEXT_FILE_;
|
|
}
|
|
logi("aic_player_play ok\n");
|
|
}
|
|
|
|
flag = fcntl(STDIN_FILENO,F_GETFL);
|
|
flag |= O_NONBLOCK;
|
|
fcntl(STDIN_FILENO,F_SETFL,flag);
|
|
|
|
while(1)
|
|
{
|
|
_NEXT_FILE_:
|
|
if(g_player_end == 1){
|
|
loge("play file:%s end!!!!\n",g_filename[k]);
|
|
ret = aic_player_stop(player);
|
|
//show_mem_info_debug();
|
|
g_player_end = 0;
|
|
i++;
|
|
i = (i > cnt -1)?(0):(i);
|
|
break;
|
|
}
|
|
|
|
if(g_sync_flag == AIC_PLAYER_PREPARE_ASYNC && g_demuxer_detected_flag == 1){
|
|
g_demuxer_detected_flag = 0;
|
|
ret = aic_player_start(player);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_start error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
|
|
aic_player_get_screen_size(player, &g_screen_size);
|
|
loge("screen_width:%d,screen_height:%d\n",g_screen_size.width,g_screen_size.height);
|
|
//attention:disp not exceed screen_size
|
|
g_disp_rect.x = 324;
|
|
g_disp_rect.y = 50;
|
|
g_disp_rect.width = 600;
|
|
g_disp_rect.height = 500;
|
|
ret = aic_player_set_disp_rect(player, &g_disp_rect);
|
|
if(ret != 0){
|
|
loge("aic_player_set_disp_rect error\n");
|
|
}
|
|
|
|
ret = aic_player_get_media_info(player,&g_media_info);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_get_media_info error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
ret = aic_player_play(player);
|
|
if(ret != 0){
|
|
loge("cur file aic_player_play error,play next file!!!!!!\n");
|
|
g_player_end = 1;
|
|
continue;
|
|
}
|
|
loge("aic_player_play ok\n");
|
|
}
|
|
|
|
if(read(STDIN_FILENO, buffer, BUFFER_LEN) > 0){
|
|
if(buffer[0] == 0x20){// pause
|
|
loge("*********enter pause ***************\n");
|
|
aic_player_pause(player);
|
|
}else if(buffer[0] == 'd'){//stop cur, star next
|
|
loge("*********enter down ***************\n");
|
|
aic_player_stop(player);
|
|
//show_mem_info_debug();
|
|
i++;
|
|
i = (i > cnt -1)?(0):(i);
|
|
break;
|
|
}else if(buffer[0] == 'u'){//stop cur, star pre
|
|
loge("*********enter up ***************\n");
|
|
aic_player_stop(player);
|
|
i--;
|
|
i = (i < 0)?(cnt-1):(i);
|
|
break;
|
|
}else{
|
|
}
|
|
}else{
|
|
usleep(1000*1000);
|
|
}
|
|
if(g_exit == 1 ){
|
|
loge("app will exit\n");
|
|
aic_player_stop(player);
|
|
loge("app will exit\n");
|
|
goto _EXIT0_;
|
|
}
|
|
}
|
|
}
|
|
|
|
_EXIT0_:
|
|
aic_player_destroy(player);
|
|
if(pThreadData)
|
|
mpp_free(pThreadData);
|
|
//show_mem_info_debug();
|
|
return (void*)NULL;
|
|
}
|
|
|
|
static int player_thread_attr_init(pthread_attr_t *attr)
|
|
{
|
|
// default stack size is 2K, it is not enough for decode thread
|
|
if (attr == NULL) {
|
|
return EINVAL;
|
|
}
|
|
pthread_attr_init(attr);
|
|
attr->stacksize = 16*1024;
|
|
attr->detachstate = PTHREAD_CREATE_DETACHED;
|
|
|
|
//attr->schedpolicy = 15;
|
|
return 0;
|
|
}
|
|
|
|
static void* player_demo(int argc,char*argv[])
|
|
{
|
|
pthread_t threadId;
|
|
pthread_attr_t *attr = NULL;
|
|
attr = (pthread_attr_t*)mpp_alloc(sizeof(pthread_attr_t));
|
|
player_thread_attr_init(attr);
|
|
pthread_create(&threadId, attr, player_thread, attr);
|
|
//mpp_free(attr);
|
|
return (void*)NULL;
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
MSH_CMD_EXPORT_ALIAS(player_demo,player_demo, player demo );
|
|
|