Skip to content
Snippets Groups Projects
Commit 24dd4150 authored by Adrien Béraud's avatar Adrien Béraud Committed by Andreas Traczyk
Browse files

video API: remove legacy FrameBuffer fields

Now that every client uses either
FrameBuffer::avframe with SinkTarget,
or VideoFrame with AVSinkTarget,
we can remove the obsolete fields in FrameBuffer
and make it a simple typedef.

Change-Id: Icf88f3d7df4f04f5cfb389f83e67aec94c17b5dc
parent ab3e5231
Branches
Tags
No related merge requests found
...@@ -57,7 +57,7 @@ public: ...@@ -57,7 +57,7 @@ public:
%{ %{
std::map<ANativeWindow*, std::unique_ptr<DRing::FrameBuffer>> windows {}; std::map<ANativeWindow*, DRing::FrameBuffer> windows {};
std::mutex windows_mutex; std::mutex windows_mutex;
std::vector<uint8_t> workspace; std::vector<uint8_t> workspace;
...@@ -159,13 +159,9 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_captureVideoPacket(JN ...@@ -159,13 +159,9 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_captureVideoPacket(JN
auto frame = DRing::getNewFrame(input); auto frame = DRing::getNewFrame(input);
if (not frame) if (not frame)
return; return;
auto packet = std::unique_ptr<AVPacket, void(*)(AVPacket*)>(new AVPacket, [](AVPacket* pkt){ auto packet = std::unique_ptr<AVPacket, void(*)(AVPacket*)>(av_packet_alloc(), [](AVPacket* pkt){
if (pkt) { av_packet_free(&pkt);
av_packet_unref(pkt);
delete pkt;
}
}); });
av_init_packet(packet.get());
if (keyframe) if (keyframe)
packet->flags = AV_PKT_FLAG_KEY; packet->flags = AV_PKT_FLAG_KEY;
setRotation(rotation); setRotation(rotation);
...@@ -314,7 +310,7 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_setNativeWindowGeomet ...@@ -314,7 +310,7 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_setNativeWindowGeomet
ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBX_8888); ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBX_8888);
} }
void releaseBuffer(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> frame) void releaseBuffer(ANativeWindow *window, DRing::FrameBuffer frame)
{ {
std::unique_lock<std::mutex> guard(windows_mutex); std::unique_lock<std::mutex> guard(windows_mutex);
try { try {
...@@ -324,16 +320,16 @@ void releaseBuffer(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> fr ...@@ -324,16 +320,16 @@ void releaseBuffer(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> fr
} }
} }
void AndroidDisplayCb(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> frame) void AndroidDisplayCb(ANativeWindow *window, DRing::FrameBuffer frame)
{ {
ANativeWindow_unlockAndPost(window); ANativeWindow_unlockAndPost(window);
releaseBuffer(window, std::move(frame)); releaseBuffer(window, std::move(frame));
} }
std::unique_ptr<DRing::FrameBuffer> sinkTargetPullCallback(ANativeWindow *window, std::size_t bytes) DRing::FrameBuffer sinkTargetPullCallback(ANativeWindow *window)
{ {
try { try {
std::unique_ptr<DRing::FrameBuffer> frame; DRing::FrameBuffer frame;
{ {
std::lock_guard<std::mutex> guard(windows_mutex); std::lock_guard<std::mutex> guard(windows_mutex);
frame = std::move(windows.at(window)); frame = std::move(windows.at(window));
...@@ -341,11 +337,11 @@ std::unique_ptr<DRing::FrameBuffer> sinkTargetPullCallback(ANativeWindow *window ...@@ -341,11 +337,11 @@ std::unique_ptr<DRing::FrameBuffer> sinkTargetPullCallback(ANativeWindow *window
if (frame) { if (frame) {
ANativeWindow_Buffer buffer; ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(window, &buffer, nullptr) == 0) { if (ANativeWindow_lock(window, &buffer, nullptr) == 0) {
frame->avframe->format = AV_PIX_FMT_RGBA; frame->format = AV_PIX_FMT_RGBA;
frame->avframe->width = buffer.width; frame->width = buffer.width;
frame->avframe->height = buffer.height; frame->height = buffer.height;
frame->avframe->data[0] = (uint8_t *) buffer.bits; frame->data[0] = (uint8_t *) buffer.bits;
frame->avframe->linesize[0] = buffer.stride * 4; frame->linesize[0] = buffer.stride * 4;
return frame; return frame;
} else { } else {
__android_log_print(ANDROID_LOG_WARN, TAG, "Can't lock window"); __android_log_print(ANDROID_LOG_WARN, TAG, "Can't lock window");
...@@ -371,13 +367,11 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_registerVideoCallback ...@@ -371,13 +367,11 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_registerVideoCallback
ANativeWindow* nativeWindow = (ANativeWindow*)((intptr_t) window); ANativeWindow* nativeWindow = (ANativeWindow*)((intptr_t) window);
auto f_display_cb = std::bind(&AndroidDisplayCb, nativeWindow, std::placeholders::_1); auto f_display_cb = std::bind(&AndroidDisplayCb, nativeWindow, std::placeholders::_1);
auto p_display_cb = std::bind(&sinkTargetPullCallback, nativeWindow, std::placeholders::_1); auto p_display_cb = std::bind(&sinkTargetPullCallback, nativeWindow);
{ {
std::lock_guard<std::mutex> guard(windows_mutex); std::lock_guard<std::mutex> guard(windows_mutex);
auto buf = std::make_unique<DRing::FrameBuffer>(); windows.emplace(nativeWindow, av_frame_alloc());
buf->avframe.reset(av_frame_alloc());
windows.emplace(nativeWindow, std::move(buf));
} }
DRing::registerSinkTarget(sink, DRing::SinkTarget {.pull=p_display_cb, .push=f_display_cb}); DRing::registerSinkTarget(sink, DRing::SinkTarget {.pull=p_display_cb, .push=f_display_cb});
} }
......
...@@ -157,26 +157,16 @@ private: ...@@ -157,26 +157,16 @@ private:
void setGeometry(int format, int width, int height) noexcept; void setGeometry(int format, int width, int height) noexcept;
}; };
/* FrameBuffer is a generic video frame container */ struct DRING_PUBLIC AVFrame_deleter {
struct DRING_PUBLIC FrameBuffer void operator()(AVFrame* frame) const { av_frame_free(&frame); }
{
uint8_t* ptr {nullptr}; // data as a plain raw pointer
std::size_t ptrSize {0}; // size in byte of ptr array
int format {0}; // as listed by AVPixelFormat (avutils/pixfmt.h)
int width {0}; // frame width
int height {0}; // frame height
std::vector<uint8_t> storage;
// If set, new frame will be written to this buffer instead
std::unique_ptr<AVFrame, void (*)(AVFrame*)> avframe {nullptr, [](AVFrame* frame) {
av_frame_free(&frame);
}};
}; };
typedef std::unique_ptr<AVFrame, AVFrame_deleter> FrameBuffer;
struct DRING_PUBLIC SinkTarget struct DRING_PUBLIC SinkTarget
{ {
using FrameBufferPtr = std::unique_ptr<FrameBuffer>; std::function<FrameBuffer()> pull;
std::function<FrameBufferPtr(std::size_t bytes)> pull; std::function<void(FrameBuffer)> push;
std::function<void(FrameBufferPtr)> push;
}; };
struct DRING_PUBLIC AVSinkTarget struct DRING_PUBLIC AVSinkTarget
......
...@@ -27,14 +27,6 @@ ...@@ -27,14 +27,6 @@
#include <memory> #include <memory>
#include <functional> #include <functional>
extern "C" {
struct AVFrame;
}
namespace DRing {
struct FrameBuffer; // from jami/videomanager_interface.h
}
namespace jami { namespace jami {
using MediaFrame = DRing::MediaFrame; using MediaFrame = DRing::MediaFrame;
......
...@@ -438,24 +438,9 @@ SinkClient::update(Observable<std::shared_ptr<MediaFrame>>* /*obs*/, ...@@ -438,24 +438,9 @@ SinkClient::update(Observable<std::shared_ptr<MediaFrame>>* /*obs*/,
if (target_.pull) { if (target_.pull) {
int width = frame->width(); int width = frame->width();
int height = frame->height(); int height = frame->height();
#if defined(__ANDROID__) || (defined(__APPLE__) && !TARGET_OS_IPHONE) if (width > 0 && height > 0) {
const int format = AV_PIX_FMT_RGBA; if (auto buffer_ptr = target_.pull()) {
#else scaler_->scale(*frame, buffer_ptr.get());
const int format = AV_PIX_FMT_BGRA;
#endif
const auto bytes = videoFrameSize(format, width, height);
if (bytes > 0) {
if (auto buffer_ptr = target_.pull(bytes)) {
if (buffer_ptr->avframe) {
scaler_->scale(*frame, buffer_ptr->avframe.get());
} else {
buffer_ptr->format = format;
buffer_ptr->width = width;
buffer_ptr->height = height;
VideoFrame dst;
dst.setFromMemory(buffer_ptr->ptr, format, width, height);
scaler_->scale(*frame, dst);
}
target_.push(std::move(buffer_ptr)); target_.push(std::move(buffer_ptr));
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment