linuxOS_AP06/app/rkadk/examples/rkadk_player_test.c

1185 lines
35 KiB
C
Raw Normal View History

2025-06-03 04:28:32 +00:00
/*
* Copyright (c) 2021 Rockchip, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "rkadk_common.h"
#include "rkadk_media_comm.h"
#include "rkadk_log.h"
#include "rkadk_param.h"
#include "rkadk_player.h"
#include "rkadk_demuxer.h"
#ifndef OS_RTT
#include "rkdemuxer.h"
#else
#include "../../common_algorithm/misc/include/rkdemuxer.h"
#endif
#include <math.h>
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
extern int optind;
extern char *optarg;
static bool is_quit = false;
static bool is_destroy = false;
static RKADK_CHAR optstr[] = "i:x:y:W:H:r:a:s:P:I:t:F:T:l:c:d:O:S:V:R:w:C:A:M:N:mfvbDh";
static RKADK_VOID *mDemuxerCfg = NULL;
static void print_usage(const RKADK_CHAR *name) {
printf("usage example:\n");
printf("\t%s [-i xxx.mp4] [-x 180] [-y 320] [-W 360] [-H 640] [-r 90] "
"[-m] [-f] [-v] [-b]\n",
name);
printf("\t-i: input url, Default: /etc/bsa_file/8k8bpsMono.wav\n");
printf("\t-x: display x coordinate, Default: 0\n");
printf("\t-y: display y coordinate, Default: 0\n");
printf("\t-W: display width, Default: Physical screen width\n");
printf("\t-H: display height, Default: Physical screen height\n");
printf("\t-r: rotation, option: 0(0), 1(90), 2(180), 3(270), Default: 0\n");
printf("\t-m: mirror enable, Default: disable\n");
printf("\t-f: flip enable, Default: disable\n");
printf("\t-a: set audio enable/disable, option: 0, 1; Default: enable\n");
printf("\t-v: video enable, Default: disable\n");
printf("\t-s: vo layer splice mode, option: 0(RGA), 1(GPU), 2(ByPass); Default: 0\n");
printf("\t-P: display pixel type, option: 0(RGB888), 1(NV12), 2(RGB565), 3(RGB444); Default: 0\n");
printf("\t-I: Type of a VO interface, option: 0(DEFAILT), 1(MIPI), 2(LCD); Default: 1106: 0, other chip: 1\n");
printf("\t-F: vo display framerete, Default: 30\n");
printf("\t-t: rtsp transport protocol, option: 0(udp), 1(tcp); Default: udp\n");
printf("\t-b: Black Backgound enable, Default: disable\n");
printf("\t-T: rtsp socket I/O timeout(millisecond), option: block\n");
printf("\t-l: vo layer id, Default: 0\n");
printf("\t-c: loop play count, Default: 0\n");
printf("\t-d: loop play once duration(second), Default: file duration\n");
printf("\t-O: Vdec output buffer count, Default: 3\n");
printf("\t-S: Vdec stream(input) buffer count, Default: 3\n");
printf("\t-w: Vdec waterline(frames), Default: 0\n");
printf("\t-D: enable third-party demuxer, Default: disable\n");
printf("\t-A: adec buffer len, Default: 4\n");
printf("\t-M: vdec decode mode, option: 0(frame mode), 1(stream mode), 2(send frame decode slice), 3(send slice decode slice), Default: 0\n");
printf("\t-C: Ao sound card name, Default: RV1106/RV1103/RK3506 = hw:0,0, other chip = default\n");
printf("\t-V: ao volume, Default: 70\n");
printf("\t-A: ao sound card samplerate, Default: 16000\n");
printf("\t-N: ao sound card channel index, Default: 0\n");
printf("\t-h: help\n");
}
static void sigterm_handler(int sig) {
fprintf(stderr, "signal %d\n", sig);
is_quit = true;
}
static RKADK_VOID PlayerEventFnTest(RKADK_MW_PTR pPlayer,
RKADK_PLAYER_EVENT_E enEvent,
RKADK_VOID *pData) {
switch (enEvent) {
case RKADK_PLAYER_EVENT_STATE_CHANGED:
printf("+++++ RKADK_PLAYER_EVENT_STATE_CHANGED +++++\n");
break;
case RKADK_PLAYER_EVENT_EOF:
printf("+++++ RKADK_PLAYER_EVENT_EOF +++++\n");
#ifdef OS_RTT
is_quit = true;
#endif
break;
case RKADK_PLAYER_EVENT_SOF:
printf("+++++ RKADK_PLAYER_EVENT_SOF +++++\n");
break;
case RKADK_PLAYER_EVENT_SEEK_END:
printf("+++++ RKADK_PLAYER_EVENT_SEEK_END +++++\n");
break;
case RKADK_PLAYER_EVENT_ERROR:
printf("+++++ RKADK_PLAYER_EVENT_ERROR +++++\n");
break;
case RKADK_PLAYER_EVENT_PREPARED:
printf("+++++ RKADK_PLAYER_EVENT_PREPARED +++++\n");
break;
case RKADK_PLAYER_EVENT_PLAY:
printf("+++++ RKADK_PLAYER_EVENT_PLAY +++++\n");
break;
case RKADK_PLAYER_EVENT_PAUSED:
printf("+++++ RKADK_PLAYER_EVENT_PAUSED +++++\n");
break;
case RKADK_PLAYER_EVENT_STOPPED:
printf("+++++ RKADK_PLAYER_EVENT_STOPPED +++++\n");
break;
default:
printf("+++++ Unknown event(%d) +++++\n", enEvent);
break;
}
}
void param_init(RKADK_PLAYER_FRAME_INFO_S *pstFrmInfo) {
RKADK_CHECK_POINTER_N(pstFrmInfo);
memset(pstFrmInfo, 0, sizeof(RKADK_PLAYER_FRAME_INFO_S));
#ifndef OS_RTT
#ifdef RK3576
pstFrmInfo->u32DispWidth = 1080;
pstFrmInfo->u32DispHeight = 1920;
#else
pstFrmInfo->u32DispWidth = 720;
pstFrmInfo->u32DispHeight = 1280;
#endif
pstFrmInfo->u32ImgWidth = pstFrmInfo->u32DispWidth;
pstFrmInfo->u32ImgHeight = pstFrmInfo->u32DispHeight;
pstFrmInfo->u32VoFormat = VO_FORMAT_RGB888;
#if defined(RV1106_1103) || defined(RV1103B)
pstFrmInfo->u32EnIntfType = DISPLAY_TYPE_DEFAULT;
#else
pstFrmInfo->u32EnIntfType = DISPLAY_TYPE_MIPI;
#endif
pstFrmInfo->enIntfSync = RKADK_VO_OUTPUT_DEFAULT;
pstFrmInfo->u32BorderColor = 0x0000FA;
pstFrmInfo->bMirror = RKADK_FALSE;
pstFrmInfo->bFlip = RKADK_FALSE;
pstFrmInfo->u32Rotation = 1;
pstFrmInfo->stSyncInfo.bIdv = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIhs = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIvs = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bSynm = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIop = RKADK_TRUE;
pstFrmInfo->stSyncInfo.u16FrameRate = 30;
pstFrmInfo->stSyncInfo.u16PixClock = 65000;
pstFrmInfo->stSyncInfo.u16Hact = 1200;
pstFrmInfo->stSyncInfo.u16Hbb = 24;
pstFrmInfo->stSyncInfo.u16Hfb = 240;
pstFrmInfo->stSyncInfo.u16Hpw = 136;
pstFrmInfo->stSyncInfo.u16Hmid = 0;
pstFrmInfo->stSyncInfo.u16Vact = 1200;
pstFrmInfo->stSyncInfo.u16Vbb = 200;
pstFrmInfo->stSyncInfo.u16Vfb = 194;
pstFrmInfo->stSyncInfo.u16Vpw = 6;
pstFrmInfo->enVoSpliceMode = SPLICE_MODE_RGA;
#ifdef RK3576
pstFrmInfo->u32VoDev = 1;
pstFrmInfo->u32VoLay = 5;
#endif
#else
pstFrmInfo->u32DispWidth = 720;
pstFrmInfo->u32DispHeight = 1280;
pstFrmInfo->u32ImgWidth = pstFrmInfo->u32DispWidth;
pstFrmInfo->u32ImgHeight = pstFrmInfo->u32DispHeight;
pstFrmInfo->u32VoFormat = VO_FORMAT_RGB888;
#if defined(RV1106_1103) || defined(RV1103B)
pstFrmInfo->u32EnIntfType = DISPLAY_TYPE_DEFAULT;
#else
pstFrmInfo->u32EnIntfType = DISPLAY_TYPE_MIPI;
#endif
pstFrmInfo->enIntfSync = RKADK_VO_OUTPUT_480P60;
pstFrmInfo->u32BorderColor = 0x0000FA;
pstFrmInfo->bMirror = RKADK_FALSE;
pstFrmInfo->bFlip = RKADK_FALSE;
pstFrmInfo->u32Rotation = 1;
pstFrmInfo->stSyncInfo.bIdv = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIhs = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIvs = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bSynm = RKADK_TRUE;
pstFrmInfo->stSyncInfo.bIop = RKADK_TRUE;
pstFrmInfo->stSyncInfo.u16FrameRate = 25;
pstFrmInfo->stSyncInfo.u16PixClock = 65000;
pstFrmInfo->stSyncInfo.u16Hact = 1200;
pstFrmInfo->stSyncInfo.u16Hbb = 24;
pstFrmInfo->stSyncInfo.u16Hfb = 240;
pstFrmInfo->stSyncInfo.u16Hpw = 136;
pstFrmInfo->stSyncInfo.u16Hmid = 0;
pstFrmInfo->stSyncInfo.u16Vact = 1200;
pstFrmInfo->stSyncInfo.u16Vbb = 200;
pstFrmInfo->stSyncInfo.u16Vfb = 194;
pstFrmInfo->stSyncInfo.u16Vpw = 6;
pstFrmInfo->enVoSpliceMode = SPLICE_MODE_RGA;
#endif
return;
}
RKADK_VOID *GetPosition(RKADK_VOID *arg) {
RKADK_S64 position = 0;
while (!is_quit && !is_destroy) {
position = RKADK_PLAYER_GetCurrentPosition(arg);
printf("position = %lld\n", position);
#ifndef OS_RTT
usleep(1000000);
#else
rkos_msleep(1000);
#endif
}
return NULL;
}
static void SnapshotDataRecv(RKADK_PLAYER_SNAPSHOT_S *pstData) {
static RKADK_U32 snapshotId = 0;
char jpegPath[128];
FILE *file = NULL;
if (!pstData || !pstData->pu8DataBuf) {
RKADK_LOGE("Invalid photo data");
return;
}
memset(jpegPath, 0, 128);
sprintf(jpegPath, "/tmp/Snapshot_%d.jpeg", snapshotId);
file = fopen(jpegPath, "w");
if (!file) {
RKADK_LOGE("Create jpeg file(%s) failed", jpegPath);
return;
}
RKADK_LOGP("save snapshot[%d, %d] jpeg to %s", pstData->u32Width, pstData->u32Height, jpegPath);
fwrite(pstData->pu8DataBuf, 1, pstData->u32DataLen, file);
fclose(file);
snapshotId++;
if (snapshotId > 10)
snapshotId = 0;
}
static RKADK_S32 DemuxerBufferFree(RKADK_VOID *opaque) {
if (opaque) {
free(opaque);
opaque = NULL;
}
return 0;
}
static RKADK_VOID DemuxerReadVideoPacket(RKADK_VOID* pPacket) {
int ret;
RKADK_PLAYER_PACKET stPacket;
DemuxerPacket *pstDemuxerPacket = (DemuxerPacket *)pPacket;
memset(&stPacket, 0, sizeof(RKADK_PLAYER_PACKET));
stPacket.bBypass = false;
stPacket.pFreeCB = DemuxerBufferFree;
stPacket.bEofFlag = pstDemuxerPacket->s8EofFlag ? true : false;
stPacket.s32PacketSize = pstDemuxerPacket->s32PacketSize;
stPacket.s8PacketData = (RKADK_S8 *)pstDemuxerPacket->s8PacketData;
stPacket.s64Pts = pstDemuxerPacket->s64Pts;
stPacket.u32Seq = pstDemuxerPacket->s32Series;
ret = RKADK_PLAYER_SendVideoPacket(pstDemuxerPacket->ptr, &stPacket);
if (ret)
RKADK_LOGE("SendVideoPacket failed");
}
static RKADK_VOID DemuxerReadAudioPacket(RKADK_VOID* pPacket) {
int ret;
RKADK_PLAYER_PACKET stPacket;
DemuxerPacket *pstDemuxerPacket = (DemuxerPacket *)pPacket;
memset(&stPacket, 0, sizeof(RKADK_PLAYER_PACKET));
stPacket.bBypass = false;
stPacket.pFreeCB = DemuxerBufferFree;
stPacket.bEofFlag = pstDemuxerPacket->s8EofFlag ? true : false;
stPacket.s32PacketSize = pstDemuxerPacket->s32PacketSize;
stPacket.s8PacketData = (RKADK_S8 *)pstDemuxerPacket->s8PacketData;
stPacket.s64Pts = pstDemuxerPacket->s64Pts;
stPacket.u32Seq = pstDemuxerPacket->s32Series;
ret = RKADK_PLAYER_SendAudioPacket(pstDemuxerPacket->ptr, &stPacket);
if (ret)
RKADK_LOGE("SendAudioPacket failed");
}
static int DemuxerSetDataParam(RKADK_MW_PTR pPlayer, char *file,
RKADK_PLAYER_CFG_S stPlayCfg) {
int ret;
RKADK_DEMUXER_INPUT_S stDemuxerInput;
RKADK_DEMUXER_PARAM_S stDemuxerParam;
RKADK_PLAYER_DATA_PARAM_S stDataParam;
memset(&stDemuxerInput, 0, sizeof(RKADK_DEMUXER_INPUT_S));
memset(&stDemuxerParam, 0, sizeof(RKADK_DEMUXER_PARAM_S));
memset(&stDataParam, 0, sizeof(RKADK_PLAYER_DATA_PARAM_S));
stDemuxerInput.ptr = pPlayer;
stDemuxerInput.readModeFlag = DEMUXER_TYPE_PASSIVE;
stDemuxerInput.videoEnableFlag = stPlayCfg.bEnableVideo;
stDemuxerInput.audioEnableFlag = stPlayCfg.bEnableAudio;
stDemuxerInput.transport = stPlayCfg.stNetStreamCfg.transport;
stDemuxerInput.u32IoTimeout = stPlayCfg.stNetStreamCfg.u32IoTimeout;
if (RKADK_DEMUXER_Create(&mDemuxerCfg, &stDemuxerInput)) {
RKADK_LOGE("RKADK_DEMUXER_Create failed");
return -1;
}
stDemuxerParam.pstReadPacketCallback.pfnReadVideoPacketCallback = DemuxerReadVideoPacket;
stDemuxerParam.pstReadPacketCallback.pfnReadAudioPacketCallback = DemuxerReadAudioPacket;
if (RKADK_DEMUXER_GetParam(mDemuxerCfg, file, &stDemuxerParam)) {
RKADK_LOGE("RKADK_DEMUXER_GetParam failed");
return -1;
}
stDataParam.pFilePath = file;
stDataParam.bVideoExist = stPlayCfg.bEnableVideo;
stDataParam.bAudioExist = stPlayCfg.bEnableAudio;
if (strstr(file, "rtsp://"))
stDataParam.bIsNetRTStream = RKADK_TRUE;
if (stDataParam.bVideoExist) {
if (stDemuxerParam.pVideoCodec != NULL) {
if (!strcmp(stDemuxerParam.pVideoCodec, "h264")) {
stDataParam.enVCodecType = RKADK_CODEC_TYPE_H264;
} else if (!strcmp(stDemuxerParam.pVideoCodec, "h265")) {
stDataParam.enVCodecType = RKADK_CODEC_TYPE_H265;
} else {
RKADK_LOGE("Unsupported audio format[%s]", stDemuxerParam.pVideoCodec);
return -1;
}
}
if (stDemuxerParam.VideoFormat == DEMUXER_VIDEO_YUV420SP_10BIT)
stDataParam.enPixFmt = RK_FMT_YUV420SP_10BIT;
else
stDataParam.enPixFmt = RK_FMT_YUV420SP;
stDataParam.u32Width = stDemuxerParam.videoWidth;
stDataParam.u32Height = stDemuxerParam.videoHeigh;
stDataParam.u32FrameRate = stDemuxerParam.videoAvgFrameRate;
}
if (stDataParam.bAudioExist) {
if (stDemuxerParam.pAudioCodec != NULL) {
if (!strcmp(stDemuxerParam.pAudioCodec, "mp3"))
stDataParam.enACodecType = RKADK_CODEC_TYPE_MP3;
else if (!strcmp(stDemuxerParam.pAudioCodec, "wav"))
stDataParam.enACodecType = RKADK_CODEC_TYPE_PCM;
else if (!strcmp(stDemuxerParam.pAudioCodec, "pcm_alaw"))
stDataParam.enACodecType = RKADK_CODEC_TYPE_G711A;
else {
RKADK_LOGE("Unsupported audio format[%s]", stDemuxerParam.pAudioCodec);
return -1;
}
}
if (stDemuxerParam.audioFormat == 0)
stDataParam.u32BitWidth = 8;
else if (stDemuxerParam.audioFormat == 1)
stDataParam.u32BitWidth = 16;
else {
RKADK_LOGE("Unsupported audioFormat = %d", stDemuxerParam.audioFormat);
return -1;
}
stDataParam.u32SampleRate = stDemuxerParam.audioSampleRate;
stDataParam.u32Channel = stDemuxerParam.audioChannels;
}
ret = RKADK_PLAYER_SetDataParam(pPlayer, &stDataParam);
if (ret) {
RKADK_LOGE("SetDataParam failed, ret = %d", ret);
return -1;
}
return 0;
}
#ifdef OS_LINUX
int main(int argc, char *argv[]) {
int c, ret, transport = 0;
char *file = "/userdata/16000_2.mp3";
RKADK_BOOL bVideoEnable = false;
RKADK_BOOL bAudioEnable = true;
RKADK_BOOL bBlackBackgroundEnable = false;
RKADK_MW_PTR pPlayer = NULL;
RKADK_S64 seekTimeInMs = 0, maxSeekTimeInMs = (RKADK_S64)pow(2, 63) / 1000;
pthread_t getPosition = 0;
RKADK_U32 duration = 0;
int u32VoFormat = -1, u32SpliceMode = -1, u32IntfType = -1;
RKADK_PLAYER_CFG_S stPlayCfg;
int loop_count = -1, loop_duration = 0;
RKADK_PLAYER_STATE_E enState = RKADK_PLAYER_STATE_BUTT;
RKADK_U32 u32Waterline = 0;
RKADK_U32 u32DecodeMode = 0;
RKADK_U32 u32SeekTime = 3000;
memset(&stPlayCfg, 0, sizeof(RKADK_PLAYER_CFG_S));
param_init(&stPlayCfg.stFrmInfo);
#if defined(RK3506) || defined(RV1106_1103) || defined(RV1103B)
stPlayCfg.stAudioCfg.pSoundCard = "hw:0,0";
#else
stPlayCfg.stAudioCfg.pSoundCard = "default";
#endif
while ((c = getopt(argc, argv, optstr)) != -1) {
switch (c) {
case 'i':
file = optarg;
break;
case 'x':
stPlayCfg.stFrmInfo.u32FrmInfoX = atoi(optarg);
break;
case 'y':
stPlayCfg.stFrmInfo.u32FrmInfoY = atoi(optarg);
break;
case 'W':
stPlayCfg.stFrmInfo.u32DispWidth = atoi(optarg);
break;
case 'H':
stPlayCfg.stFrmInfo.u32DispHeight = atoi(optarg);
break;
case 'r':
stPlayCfg.stFrmInfo.u32Rotation = atoi(optarg);
break;
case 'F':
stPlayCfg.stFrmInfo.stSyncInfo.u16FrameRate = atoi(optarg);
break;
case 'm':
stPlayCfg.stFrmInfo.bMirror = true;
break;
case 'f':
stPlayCfg.stFrmInfo.bFlip = true;
break;
case 'T':
stPlayCfg.stNetStreamCfg.u32IoTimeout = atoi(optarg) * 1000;
break;
case 'l':
stPlayCfg.stFrmInfo.u32VoLay = atoi(optarg);
break;
case 'O':
stPlayCfg.stVdecCfg.u32FrameBufCnt = atoi(optarg);
break;
case 'S':
stPlayCfg.stVdecCfg.u32StreamBufCnt = atoi(optarg);
break;
case 'w':
u32Waterline = atoi(optarg);
break;
case 'v':
bVideoEnable = true;
break;
case 'b':
bBlackBackgroundEnable = true;
break;
case 'a':
bAudioEnable = atoi(optarg);
break;
case 's':
u32SpliceMode = atoi(optarg);
break;
case 'P':
u32VoFormat = atoi(optarg);
break;
case 'I':
u32IntfType = atoi(optarg);
break;
case 't':
transport = atoi(optarg);
break;
case 'c':
loop_count = atoi(optarg);
break;
case 'd':
loop_duration = atoi(optarg);
break;
case 'D':
stPlayCfg.bEnableThirdDemuxer = true;
RKADK_LOGP("Enable third-party demuxer");
break;
case 'A':
stPlayCfg.stAudioCfg.u32AdecBufCnt= atoi(optarg);
break;
case 'M':
u32DecodeMode= atoi(optarg);
break;
case 'C':
stPlayCfg.stAudioCfg.pSoundCard = optarg;
break;
case 'V':
stPlayCfg.stAudioCfg.u32SpeakerVolume = atoi(optarg);
break;
case 'R':
stPlayCfg.stAudioCfg.u32AoSampleRate = atoi(optarg);
break;
case 'N':
stPlayCfg.stAudioCfg.u32AoChnId = atoi(optarg);
break;
case 'h':
default:
print_usage(argv[0]);
optind = 0;
return 0;
}
}
optind = 0;
RKADK_LOGP("#play file: %s, bVideoEnable: %d, bAudioEnable: %d",file, bVideoEnable, bAudioEnable);
RKADK_LOGP("#video display rect[%d, %d, %d, %d], u32SpliceMode: %d, u32VoFormat: %d, fps: %d",
stPlayCfg.stFrmInfo.u32FrmInfoX, stPlayCfg.stFrmInfo.u32FrmInfoY,
stPlayCfg.stFrmInfo.u32DispWidth, stPlayCfg.stFrmInfo.u32DispHeight,
u32SpliceMode, u32VoFormat, stPlayCfg.stFrmInfo.stSyncInfo.u16FrameRate);
RKADK_LOGP("u32Waterline: %d, u32FrameBufCnt: %d, u32StreamBufCnt: %d",
u32Waterline, stPlayCfg.stVdecCfg.u32FrameBufCnt, stPlayCfg.stVdecCfg.u32StreamBufCnt);
RKADK_LOGP("transport: %d, u32IoTimeout: %d(us), pSoundCard: %s",
transport, stPlayCfg.stNetStreamCfg.u32IoTimeout, stPlayCfg.stAudioCfg.pSoundCard);
if (u32SpliceMode == 1)
stPlayCfg.stFrmInfo.enVoSpliceMode = SPLICE_MODE_GPU;
else if (u32SpliceMode == 2)
stPlayCfg.stFrmInfo.enVoSpliceMode = SPLICE_MODE_BYPASS;
if (u32VoFormat == 1)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_NV12;
else if (u32VoFormat == 2)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_RGB565;
else if (u32VoFormat == 3)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_RGB444;
if (u32IntfType == 1)
stPlayCfg.stFrmInfo.u32EnIntfType = DISPLAY_TYPE_MIPI;
else if (u32IntfType == 2)
stPlayCfg.stFrmInfo.u32EnIntfType = DISPLAY_TYPE_LCD;
if (u32DecodeMode == 1)
stPlayCfg.stVdecCfg.u32DecodeMode = RKADK_DECODE_MODE_STREAM;
else if (u32DecodeMode == 2)
stPlayCfg.stVdecCfg.u32DecodeMode = RKADK_DECODE_MODE_FRAME_SLICE;
else if (u32DecodeMode == 3)
stPlayCfg.stVdecCfg.u32DecodeMode = RKADK_DECODE_MODE_SLICE;
else if (u32DecodeMode == 4)
stPlayCfg.stVdecCfg.u32DecodeMode = RKADK_DECODE_MODE_COMPAT;
signal(SIGINT, sigterm_handler);
RKADK_MPI_SYS_Init();
if (bAudioEnable)
stPlayCfg.bEnableAudio = true;
if (bVideoEnable)
stPlayCfg.bEnableVideo = true;
if (bBlackBackgroundEnable)
stPlayCfg.bEnableBlackBackground = true;
stPlayCfg.pfnPlayerCallback = PlayerEventFnTest;
//for rtsp
if (transport == 1)
stPlayCfg.stNetStreamCfg.transport = "tcp";
else
stPlayCfg.stNetStreamCfg.transport = "udp";
stPlayCfg.stSnapshotCfg.u32VencChn = 15;
stPlayCfg.stSnapshotCfg.pfnDataCallback = SnapshotDataRecv;
if (RKADK_PARAM_GetCommParam(RKADK_PARAM_TYPE_VOLUME, &stPlayCfg.stAudioCfg.u32SpeakerVolume))
stPlayCfg.stAudioCfg.u32SpeakerVolume = 70;
if (RKADK_PLAYER_Create(&pPlayer, &stPlayCfg)) {
RKADK_LOGE("RKADK_PLAYER_Create failed");
return -1;
}
if (u32Waterline > 0)
RKADK_PLAYER_SetVdecWaterline(pPlayer, u32Waterline);
if (stPlayCfg.bEnableThirdDemuxer) {
ret = DemuxerSetDataParam(pPlayer, file, stPlayCfg);
if (ret) {
RKADK_LOGE("DemuxerSetDataParam failed");
goto __EXIT;
}
} else {
ret = RKADK_PLAYER_SetDataSource(pPlayer, file);
if (ret) {
RKADK_LOGE("SetDataSource failed, ret = %d", ret);
goto __EXIT;
}
}
ret = RKADK_PLAYER_Prepare(pPlayer);
if (ret) {
RKADK_LOGE("Prepare failed, ret = %d", ret);
goto __EXIT;
}
RKADK_PLAYER_GetDuration(pPlayer, &duration);
RKADK_LOGP("file duration: %d ms", duration);
if (duration > 0) {
if (loop_duration <= 0 || loop_duration > duration / 1000)
loop_duration = duration / 1000 + 1; //ms to m
}
RKADK_LOGP("loop_count: %d, duration:%d(ms), loop_duration: %d(s)", loop_count, duration, loop_duration);
if (stPlayCfg.bEnableThirdDemuxer) {
ret = RKADK_DEMUXER_ReadPacketStart(mDemuxerCfg, 0);
if (ret != 0) {
RKADK_LOGE("RKADK_DEMUXER_ReadPacketStart failed");
goto __EXIT;
}
}
ret = RKADK_PLAYER_Play(pPlayer);
if (ret) {
RKADK_LOGE("Play failed, ret = %d", ret);
return -1;
}
loop_count--;
pthread_create(&getPosition, 0, GetPosition, pPlayer);
char cmd[64];
printf("\n#Usage: input 'quit' to exit programe!\n"
"peress any other key to capture one picture to file\n");
while (!is_quit) {
if (loop_count >= 0 && !stPlayCfg.bEnableThirdDemuxer) {
RKADK_PLAYER_GetPlayStatus(pPlayer, &enState);
if (loop_duration > 0) {
sleep(loop_duration);
} else if (enState != RKADK_PLAYER_STATE_EOF) {
sleep(1);
continue;
}
RKADK_LOGP("seek + replay test, loop_count: %d", loop_count);
if (loop_count == 0) {
RKADK_LOGP("loop play end!");
is_quit = true;
goto __EXIT;
}
ret = RKADK_PLAYER_Stop(pPlayer);
if (ret) {
RKADK_LOGE("Stop failed");
}
ret = RKADK_PLAYER_Destroy(pPlayer);
if (ret) {
RKADK_LOGE("Destroy failed");
goto __EXIT;
}
if (getPosition) {
is_destroy = true;
pthread_join(getPosition, RKADK_NULL);
getPosition = 0;
}
pPlayer = NULL;
ret = RKADK_PLAYER_Create(&pPlayer, &stPlayCfg);
if (ret) {
RKADK_LOGE("Create failed");
goto __EXIT;
}
ret = RKADK_PLAYER_SetDataSource(pPlayer, file);
if (ret) {
RKADK_LOGE("SetDataSource failed, ret = %d", ret);
break;
}
ret = RKADK_PLAYER_Prepare(pPlayer);
if (ret) {
RKADK_LOGE("Prepare failed, ret = %d", ret);
break;
}
RKADK_PLAYER_GetDuration(pPlayer, &duration);
ret = RKADK_PLAYER_Play(pPlayer);
if (ret) {
RKADK_LOGE("Play failed, ret = %d", ret);
break;
}
is_destroy = false;
pthread_create(&getPosition, 0, GetPosition, pPlayer);
if ((loop_count % 3) == 0) {
u32SeekTime = 9200;
} else if ((loop_count % 2) == 0) {
u32SeekTime = 15800;
usleep(5 * 1000);
} else {
u32SeekTime = 3000;
}
RKADK_PLAYER_Seek(pPlayer, u32SeekTime);
if ((loop_count % 2) == 0)
sleep(3);
loop_count--;
} else {
fgets(cmd, sizeof(cmd), stdin);
RKADK_LOGP("#Input cmd: %s", cmd);
if (strstr(cmd, "quit") || is_quit) {
RKADK_LOGP("#Get 'quit' cmd!");
if (!is_quit)
is_quit = true;
break;
} else if (strstr(cmd, "pause")) {
ret = RKADK_PLAYER_Pause(pPlayer);
if (ret) {
RKADK_LOGE("Pause failed, ret = %d", ret);
break;
}
} else if (strstr(cmd, "resume")) {
ret = RKADK_PLAYER_Play(pPlayer);
if (ret) {
RKADK_LOGE("Play failed, ret = %d", ret);
break;
}
} else if (strstr(cmd, "replay")) {
if (stPlayCfg.bEnableThirdDemuxer) {
//for exit ao pause
RKADK_PLAYER_GetPlayStatus(pPlayer, &enState);
if (enState == RKADK_PLAYER_STATE_PAUSE)
RKADK_PLAYER_Play(pPlayer);
RKADK_DEMUXER_ReadPacketStop(mDemuxerCfg);
}
RKADK_PLAYER_Stop(pPlayer);
if (stPlayCfg.bEnableThirdDemuxer) {
ret = DemuxerSetDataParam(pPlayer, file, stPlayCfg);
if (ret) {
RKADK_LOGE("DemuxerSetDataParam failed");
break;
}
} else {
ret = RKADK_PLAYER_SetDataSource(pPlayer, file);
if (ret) {
RKADK_LOGE("SetDataSource failed, ret = %d", ret);
break;
}
}
ret = RKADK_PLAYER_Prepare(pPlayer);
if (ret) {
RKADK_LOGE("Prepare failed, ret = %d", ret);
break;
}
if (stPlayCfg.bEnableThirdDemuxer) {
ret = RKADK_DEMUXER_ReadPacketStart(mDemuxerCfg, 0);
if (ret != 0) {
RKADK_LOGE("RKADK_DEMUXER_ReadPacketStart failed");
break;
}
}
ret = RKADK_PLAYER_Play(pPlayer);
if (ret) {
RKADK_LOGE("Play failed, ret = %d", ret);
break;
}
RKADK_PLAYER_GetDuration(pPlayer, &duration);
} else if (strstr(cmd, "seek")) {
if (stPlayCfg.bEnableThirdDemuxer)
break;
fgets(cmd, sizeof(cmd), stdin);
seekTimeInMs = atoi(cmd);
if ((seekTimeInMs < 0) || (seekTimeInMs > maxSeekTimeInMs)) {
RKADK_LOGE("seekTimeInMs(%lld) is out of range", seekTimeInMs);
break;
}
RKADK_PLAYER_Seek(pPlayer, seekTimeInMs);
} else if (strstr(cmd, "snap")) {
RKADK_PLAYER_Snapshot(pPlayer);
}
usleep(500000);
}
}
__EXIT:
if (stPlayCfg.bEnableThirdDemuxer) {
//for exit ao pause
RKADK_PLAYER_GetPlayStatus(pPlayer, &enState);
if (enState == RKADK_PLAYER_STATE_PAUSE)
RKADK_PLAYER_Play(pPlayer);
RKADK_DEMUXER_ReadPacketStop(mDemuxerCfg);
if (mDemuxerCfg)
RKADK_DEMUXER_Destroy(&mDemuxerCfg);
}
RKADK_PLAYER_Destroy(pPlayer);
if (getPosition)
pthread_join(getPosition, RKADK_NULL);
pPlayer = NULL;
RKADK_MPI_SYS_Exit();
return 0;
}
#elif defined(OS_RTT)
#include <finsh.h>
typedef struct {
int argc;
const char **argv;
} RKADK_ARG;
static void playerMain(void *arg) {
int c, ret, transport = 0;
char *file = "16000_2.mp3";
RKADK_BOOL bVideoEnable = false;
RKADK_BOOL bAudioEnable = true;
RKADK_BOOL bBlackBackgroundEnable = false;
RKADK_ARG *argCfg = (RKADK_ARG *)arg;
RKADK_MW_PTR pPlayer = NULL;
RKADK_S64 seekTimeInMs = 0, maxSeekTimeInMs = (RKADK_S64)pow(2, 63) / 1000;
pthread_t getPosition = 0;
RKADK_U32 duration = 0;
int u32VoFormat = -1, u32SpliceMode = -1, u32IntfType = -1;
RKADK_PLAYER_CFG_S stPlayCfg;
int loop_count = 1, loop_duration = 0;
RKADK_PLAYER_STATE_E enState = RKADK_PLAYER_STATE_BUTT;
RKADK_U32 u32Waterline = 0;
rt_thread_t tid = RT_NULL;
memset(&stPlayCfg, 0, sizeof(RKADK_PLAYER_CFG_S));
param_init(&stPlayCfg.stFrmInfo);
if (RKADK_PARAM_GetCommParam(RKADK_PARAM_TYPE_VOLUME, &stPlayCfg.stAudioCfg.u32SpeakerVolume))
stPlayCfg.stAudioCfg.u32SpeakerVolume = 70;
#if defined(RK3506)
stPlayCfg.stAudioCfg.pSoundCard = "es8388p";
#else
stPlayCfg.stAudioCfg.pSoundCard = "acodecp";
#endif
while ((c = getopt(argCfg->argc, argCfg->argv, optstr)) != -1) {
switch (c) {
case 'i':
file = optarg;
break;
case 'x':
stPlayCfg.stFrmInfo.u32FrmInfoX = atoi(optarg);
break;
case 'y':
stPlayCfg.stFrmInfo.u32FrmInfoY = atoi(optarg);
break;
case 'W':
stPlayCfg.stFrmInfo.u32DispWidth = atoi(optarg);
break;
case 'H':
stPlayCfg.stFrmInfo.u32DispHeight = atoi(optarg);
break;
case 'r':
stPlayCfg.stFrmInfo.u32Rotation = atoi(optarg);
break;
case 'F':
stPlayCfg.stFrmInfo.stSyncInfo.u16FrameRate = atoi(optarg);
break;
case 'm':
stPlayCfg.stFrmInfo.bMirror = true;
break;
case 'f':
stPlayCfg.stFrmInfo.bFlip = true;
break;
case 'T':
stPlayCfg.stNetStreamCfg.u32IoTimeout = atoi(optarg) * 1000;
break;
case 'l':
stPlayCfg.stFrmInfo.u32VoLay = atoi(optarg);
break;
case 'O':
stPlayCfg.stVdecCfg.u32FrameBufCnt = atoi(optarg);
break;
case 'S':
stPlayCfg.stVdecCfg.u32StreamBufCnt = atoi(optarg);
break;
case 'w':
u32Waterline = atoi(optarg);
break;
case 'v':
bVideoEnable = true;
break;
case 'b':
bBlackBackgroundEnable = true;
break;
case 'a':
bAudioEnable = atoi(optarg);
break;
case 's':
u32SpliceMode = atoi(optarg);
break;
case 'P':
u32VoFormat = atoi(optarg);
break;
case 'I':
u32IntfType = atoi(optarg);
break;
case 't':
transport = atoi(optarg);
break;
case 'c':
loop_count = atoi(optarg);
break;
case 'd':
loop_duration = atoi(optarg);
break;
case 'D':
stPlayCfg.bEnableThirdDemuxer = true;
RKADK_LOGD("Enable third-party demuxer");
break;
case 'A':
stPlayCfg.stAudioCfg.u32AdecBufCnt= atoi(optarg);
break;
case 'C':
stPlayCfg.stAudioCfg.pSoundCard = optarg;
break;
case 'V':
stPlayCfg.stAudioCfg.u32SpeakerVolume = atoi(optarg);
break;
case 'R':
stPlayCfg.stAudioCfg.u32AoSampleRate = atoi(optarg);
break;
case 'h':
default:
print_usage(argCfg->argv[0]);
optind = 0;
return 0;
}
}
optind = 0;
RKADK_LOGI("#play file: %s, bVideoEnable: %d, bAudioEnable: %d",file, bVideoEnable, bAudioEnable);
RKADK_LOGI("#video display rect[%d, %d, %d, %d], u32SpliceMode: %d, u32VoFormat: %d, fps: %d",
stPlayCfg.stFrmInfo.u32FrmInfoX, stPlayCfg.stFrmInfo.u32FrmInfoY,
stPlayCfg.stFrmInfo.u32DispWidth, stPlayCfg.stFrmInfo.u32DispHeight,
u32SpliceMode, u32VoFormat, stPlayCfg.stFrmInfo.stSyncInfo.u16FrameRate);
RKADK_LOGI("u32Waterline: %d, u32FrameBufCnt: %d, u32StreamBufCnt: %d",
u32Waterline, stPlayCfg.stVdecCfg.u32FrameBufCnt, stPlayCfg.stVdecCfg.u32StreamBufCnt);
RKADK_LOGI("transport: %d, u32IoTimeout: %d(us), pSoundCard: %s",
transport, stPlayCfg.stNetStreamCfg.u32IoTimeout, stPlayCfg.stAudioCfg.pSoundCard);
RKADK_LOGI("hact: %d, vact: %d, speakerVolume: %d",
stPlayCfg.stFrmInfo.stSyncInfo.u16Hact, stPlayCfg.stFrmInfo.stSyncInfo.u16Vact, stPlayCfg.stAudioCfg.u32SpeakerVolume);
if (u32SpliceMode == 1)
stPlayCfg.stFrmInfo.enVoSpliceMode = SPLICE_MODE_GPU;
else if (u32SpliceMode == 2)
stPlayCfg.stFrmInfo.enVoSpliceMode = SPLICE_MODE_BYPASS;
if (u32VoFormat == 1)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_NV12;
else if (u32VoFormat == 2)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_RGB565;
else if (u32VoFormat == 3)
stPlayCfg.stFrmInfo.u32VoFormat = VO_FORMAT_RGB444;
if (u32IntfType == 1)
stPlayCfg.stFrmInfo.u32EnIntfType = DISPLAY_TYPE_MIPI;
else if (u32IntfType == 2)
stPlayCfg.stFrmInfo.u32EnIntfType = DISPLAY_TYPE_LCD;
signal(SIGINT, sigterm_handler);
RKADK_MPI_SYS_Init();
if (bAudioEnable)
stPlayCfg.bEnableAudio = true;
if (bVideoEnable)
stPlayCfg.bEnableVideo = true;
if (bBlackBackgroundEnable)
stPlayCfg.bEnableBlackBackground = true;
stPlayCfg.pfnPlayerCallback = PlayerEventFnTest;
//for rtsp
if (transport == 1)
stPlayCfg.stNetStreamCfg.transport = "tcp";
else
stPlayCfg.stNetStreamCfg.transport = "udp";
stPlayCfg.stSnapshotCfg.u32VencChn = 15;
stPlayCfg.stSnapshotCfg.pfnDataCallback = SnapshotDataRecv;
while (loop_count) {
if (RKADK_PLAYER_Create(&pPlayer, &stPlayCfg)) {
RKADK_LOGE("RKADK_PLAYER_Create failed");
goto __EXIT;
}
if (u32Waterline > 0)
RKADK_PLAYER_SetVdecWaterline(pPlayer, u32Waterline);
if (stPlayCfg.bEnableThirdDemuxer) {
ret = DemuxerSetDataParam(pPlayer, file, stPlayCfg);
if (ret) {
RKADK_LOGE("DemuxerSetDataParam failed");
goto __EXIT;
}
} else {
ret = RKADK_PLAYER_SetDataSource(pPlayer, file);
if (ret) {
RKADK_LOGE("SetDataSource failed, ret = %d", ret);
goto __EXIT;
}
}
RKADK_PLAYER_GetDuration(pPlayer, &duration);
RKADK_LOGD("file duration: %d ms", duration);
if (duration > 0) {
if (loop_duration <= 0 || loop_duration > duration / 1000)
loop_duration = duration / 1000 + 1; //ms to m
}
RKADK_LOGE("loop_count: %d, duration:%d(ms), loop_duration: %d(s)", loop_count, duration, loop_duration);
ret = RKADK_PLAYER_Prepare(pPlayer);
if (ret) {
RKADK_LOGE("Prepare failed, ret = %d", ret);
goto __EXIT;
}
if (stPlayCfg.bEnableThirdDemuxer) {
ret = RKADK_DEMUXER_ReadPacketStart(mDemuxerCfg, 0);
if (ret != 0) {
RKADK_LOGE("RKADK_DEMUXER_ReadPacketStart failed");
goto __EXIT;
}
}
ret = RKADK_PLAYER_Play(pPlayer);
if (ret) {
RKADK_LOGE("Play failed, ret = %d", ret);
return -1;
}
loop_count--;
is_quit = false;
RKADK_ARG argCfg;
tid = rt_thread_create("GetPosition", GetPosition, pPlayer, 2048, 16, 10);
if (tid)
rt_thread_startup(tid);
char cmd[64];
printf("\n#Usage: input 'quit' to exit programe!\n"
"peress any other key to capture one picture to file\n");
while (!is_quit) {
rkos_msleep(1000);
}
RKADK_PLAYER_Destroy(pPlayer);
pPlayer = NULL;
}
__EXIT:
if (stPlayCfg.bEnableThirdDemuxer) {
//for exit ao pause
RKADK_PLAYER_GetPlayStatus(pPlayer, &enState);
if (enState == RKADK_PLAYER_STATE_PAUSE)
RKADK_PLAYER_Play(pPlayer);
RKADK_DEMUXER_ReadPacketStop(mDemuxerCfg);
if (mDemuxerCfg)
RKADK_DEMUXER_Destroy(&mDemuxerCfg);
}
is_quit = true;
if (pPlayer) {
RKADK_PLAYER_Destroy(pPlayer);
pPlayer = NULL;
}
RKADK_MPI_SYS_Exit();
return;
}
int rkadk_player_test_enter(int argc, char *argv[]) {
rt_thread_t tid = RT_NULL;
RKADK_ARG argCfg;
argCfg.argc = argc;
argCfg.argv = argv;
tid = rt_thread_create("playerMain", playerMain, &argCfg, 90112, 16, 10);
if (tid)
rt_thread_startup(tid);
while (tid->stat != RT_THREAD_CLOSE) {
rkos_msleep(1000);
}
rkos_msleep(10);
is_quit = false;
return 0;
}
struct _main_param
{
int argc;
char **argv;
int (* pmain)(int argc, char **argv);
};
static int thread_excute_main(void *arg)
{
struct _main_param *p;
p = (struct _main_param *)arg;
rkos_kthread_set_name(p->argv[0]);
p->pmain(p->argc, p->argv);
for (int i = 1; i < p->argc; i++)
rkos_vfree(p->argv[i]);
rkos_vfree(p->argv);
rkos_vfree(p);
return 0;
}
static int argparse_excute_main(int argc, char **argv, int (* pMain)(int argc, char **argv))
{
if (argv[argc - 1][0] != '&')
{
if (pMain)
return pMain(argc, argv);
}
else
{
char **argv_tmp = rkos_vcalloc(1, sizeof(char *) * argc);
for (int i = 0; i < (argc - 1); i++) {
argv_tmp[i] = rkos_vcalloc(1, strlen(argv[i]));
memcpy(argv_tmp[i], argv[i], strlen(argv[i]));
argv_tmp[i][strlen(argv[i])] = 0;
}
struct _main_param *p = rkos_vcalloc(1, sizeof(struct _main_param));
p->argc = argc;
p->argv = argv_tmp;
p->pmain = pMain;
rkos_kthread_create(thread_excute_main, p, argv_tmp[0], 4096, 0);
}
return 0;
}
int rkadk_player_test(int argc, char **argv)
{
argparse_excute_main(argc, argv, rkadk_player_test_enter);
return 0;
}
MSH_CMD_EXPORT(rkadk_player_test, rkadk player module test);
#endif