Files
luban-lite/packages/artinchip/mpp/middle_media/player/player_demo.c
刘可亮 564e22b32f v0.7.5
2023-08-28 09:48:01 +08:00

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 );