Skip to content

Commit

Permalink
feat(mediaplayer): add OnRenderFrame callback
Browse files Browse the repository at this point in the history
Signed-off-by: pingkai <pingkai010@gmail.com>
  • Loading branch information
pingkai committed May 12, 2020
1 parent 0e927e4 commit 2d46589
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 5 deletions.
3 changes: 3 additions & 0 deletions mediaPlayer/ICicadaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ namespace Cicada {
*/
virtual int SetListener(const playerListener &Listener) = 0;


virtual void SetOnRenderCallBack(onRenderFrame cb, void *userData) = 0;

/*
*设置显示窗口
*/
Expand Down
6 changes: 6 additions & 0 deletions mediaPlayer/MediaPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,12 @@ namespace Cicada {
GET_PLAYER_HANDLE;
CicadaSetOption(handle, "enableVRC", enable ? "1" : "0");
}

void MediaPlayer::SetOnRenderFrameCallback(onRenderFrame cb, void *userData)
{
GET_PLAYER_HANDLE;
CicadaSetOnRenderCallBack(handle, cb, userData);
}
void MediaPlayer::SetStreamTypeFlags(uint64_t flags)
{
GET_PLAYER_HANDLE;
Expand Down
2 changes: 2 additions & 0 deletions mediaPlayer/MediaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ namespace Cicada {

typedef void (*CicadaLogCallback)(void *userData, int prio, const char *buf);


class MediaPlayer {
public:
MediaPlayer();
Expand All @@ -61,6 +62,7 @@ namespace Cicada {
public:
void EnableVideoRenderedCallback(bool enable);

void SetOnRenderFrameCallback(onRenderFrame cb, void *userData);

void SetStreamTypeFlags(uint64_t flags);

Expand Down
15 changes: 14 additions & 1 deletion mediaPlayer/SuperMediaPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1903,12 +1903,16 @@ namespace Cicada {
return ret;
}

AVAFFrame *avafFrame = dynamic_cast<AVAFFrame *> (mAudioFrameQue.front().get());
auto *avafFrame = dynamic_cast<AVAFFrame *>(mAudioFrameQue.front().get());

if (avafFrame) {
duration = getPCMFrameDuration(avafFrame->ToAVFrame());
}

if (mFrameCb) {
mFrameCb(mFrameCbUserData, avafFrame);
}

render_ret = mAudioRender->renderFrame(mAudioFrameQue.front(), 0);

if (render_ret == IAudioRender::FORMAT_NOT_SUPPORT) {
Expand Down Expand Up @@ -2093,6 +2097,10 @@ namespace Cicada {
}
}

if (mFrameCb) {
mFrameCb(mFrameCbUserData, videoFrame.get());
}

if (render) {
SendVideoFrameToRender(move(videoFrame));

Expand Down Expand Up @@ -4143,4 +4151,9 @@ namespace Cicada {
mAudioRender->pause(!start);
}
}
void SuperMediaPlayer::SetOnRenderCallBack(onRenderFrame cb, void *userData)
{
mFrameCb = cb;
mFrameCbUserData = userData;
}
}//namespace Cicada
4 changes: 4 additions & 0 deletions mediaPlayer/SuperMediaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ namespace Cicada {

int SetListener(const playerListener &Listener) override;

void SetOnRenderCallBack(onRenderFrame cb, void *userData) override;

// TODO: use setParameters and setOpt to set
void SetRefer(const char *refer) override;

Expand Down Expand Up @@ -502,6 +504,8 @@ namespace Cicada {
int64_t mCheckAudioQueEOSTime{INT64_MIN};
uint64_t mAudioQueDuration{UINT64_MAX};

onRenderFrame mFrameCb{nullptr};
void *mFrameCbUserData{nullptr};
};
}// namespace Cicada
#endif // CICADA_PLAYER_SERVICE_H
Expand Down
8 changes: 8 additions & 0 deletions mediaPlayer/media_player_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ int CicadaSetListener(playerHandle *pHandle, const playerListener &Listener)
return 0;
}

void CicadaSetOnRenderCallBack(playerHandle *pHandle, onRenderFrame cb, void *userData)
{
GET_PLAYER;
if (player) {
player->SetOnRenderCallBack(cb, userData);
}
}

void CicadaSetComponentCb(playerHandle *pHandle, player_component_type type, void *factory)
{
GET_PLAYER;
Expand Down
3 changes: 3 additions & 0 deletions mediaPlayer/media_player_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ void CicadaReleasePlayer(playerHandle **player);
*/
int CicadaSetListener(playerHandle *pHandle, const playerListener &Listener);


void CicadaSetOnRenderCallBack(playerHandle *pHandle, onRenderFrame cb, void *userData);

/*
* set external component callback
*/
Expand Down
2 changes: 2 additions & 0 deletions mediaPlayer/native_cicada_player_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ typedef int64_t (*seekCB)(void *arg, int64_t offset, int whence);

typedef int64_t(*clockRefer)(void *arg);

typedef bool (*onRenderFrame)(void *userData, IAFFrame *frame);

class ErrorConverter {
public:
virtual int ConvertErrorCode(int code, int &outCode, std::string &outStr) = 0;
Expand Down
46 changes: 42 additions & 4 deletions mediaPlayer/tests/apiTest/mediaPlayerApiTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@
// Created by pingkai on 2020/1/13.
//

#include "tests/mediaPlayerTest.h"
#include "tests/player_command.h"
#include "gtest/gtest.h"
#include <memory>
#include "tests/mediaPlayerTest.h"
#include <utils/AFUtils.h>
#include <utils/mediaFrame.h>
#include <utils/timer.h>
#include "tests/player_command.h"
#include <vector>
#include <utils/mediaFrame.h>
#include <utils/AFUtils.h>

#ifdef __APPLE__
#include <base/media/PBAFFrame.h>
#endif

using namespace std;

Expand Down Expand Up @@ -236,3 +240,37 @@ TEST(config, set)
nullptr, nullptr);
}

bool OnRenderFrame(void *userData, IAFFrame *frame)
{
if (frame->getType() == IAFFrame::FrameTypeVideo) {
switch (frame->getInfo().format) {
case AF_PIX_FMT_APPLE_PIXEL_BUFFER: {
AF_LOGD("get a apple pixel buffer");
#ifdef __APPLE__
auto *ppBFrame = dynamic_cast<PBAFFrame *>(frame);
ppBFrame->getPixelBuffer();
#endif
break;
}
case AF_PIX_FMT_YUV420P:
AF_LOGD("get a yuv 420p");
frame->getData();
frame->getLineSize();
break;
default:
break;
}
}
return false;
}

static int setRenderCbOnCallback(Cicada::MediaPlayer *player, void *arg)
{
player->SetOnRenderFrameCallback(OnRenderFrame, nullptr);
return 0;
}

TEST(api, renderCb)
{
test_simple("http://player.alicdn.com/video/aliyunmedia.mp4", setRenderCbOnCallback, simple_loop, nullptr, nullptr);
}

0 comments on commit 2d46589

Please sign in to comment.