From 0250edfd9c4d453f25a2f9827698ccf87ff5afff Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 17 八月 2017 10:22:18 +0800 Subject: [PATCH] merge home base --- /dev/null | 125 ----------------------------------------- RtspFace/PL_InterProcessJoint.h | 1 RtspFace/PL_RTSPServer.cpp | 15 ++++- RtspFace/PL_SensetimeFaceFeatureEmit.h | 6 ++ RtspFace/PL_RTSPServer.h | 2 RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp | 4 + 6 files changed, 24 insertions(+), 129 deletions(-) diff --git a/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp b/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp index 226e45a..fa689f0 100644 --- a/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp +++ b/RtspFace/PL_AndroidMediaCodecDecoder_ndk.cpp @@ -202,6 +202,10 @@ return false; } + static FILE *pFile = fopen("/data/bb.264", "wb"); + fwrite(frame->buffer, sizeof(char), frame->buffSize, pFile); + fflush(pFile); + ssize_t bufidx = AMediaCodec_dequeueInputBuffer(in->codec, 2000); LOGP(DEBUG, "input buffer bufidx=%zd, inputFrameCount=%d", bufidx, in->inputFrameCount++); diff --git a/RtspFace/PL_BlockPredictor.cpp b/RtspFace/PL_BlockPredictor.cpp deleted file mode 100644 index 1695f7d..0000000 --- a/RtspFace/PL_BlockPredictor.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "PL_BlockPredictor.h" -#include "MaterialBuffer.h" -#include "logger.h" -#include "MediaHelper.h" - -#include <string.h> // for memcpy -#include <opencv2/core/mat.hpp> -#include <opencv2/imgproc.hpp> - -struct PL_BlockPredictor_Internal -{ - uint8_t* buffer; - size_t buffSize; - - PL_BlockPredictor_Config config; - PipeMaterial pmList[2]; - MB_Frame lastMbfBuffOrigin; - MB_Frame lastMbfBuffCopy; - - bool payError; - - PL_BlockPredictor_Internal() : - buffer(nullptr), buffSize(), config(), pmList(), - lastMbfBuffOrigin(), lastMbfBuffCopy(), - payError(true) - { - } - - ~PL_BlockPredictor_Internal() - { - reset(); - } - - void reset() - { - delete buffer; - buffer = nullptr; - buffSize = 0; - - PL_BlockPredictor_Config _config; - config = _config; - - PipeMaterial _pm; - pmList[0] = _pm; - pmList[1] = _pm; - - MB_Frame _lastMbfBuff; - lastMbfBuffOrigin = _lastMbfBuff; - lastMbfBuffCopy = _lastMbfBuff; - - payError = true; - } -}; - -PipeLineElem* create_PL_BlockPredictor() -{ - return new PL_BlockPredictor; -} - -PL_BlockPredictor::PL_BlockPredictor() : internal(new PL_BlockPredictor_Internal) -{ -} - -PL_BlockPredictor::~PL_BlockPredictor() -{ - delete (PL_BlockPredictor_Internal*)internal; - internal= nullptr; -} - -bool PL_BlockPredictor::init(void* args) -{ - PL_BlockPredictor_Internal* in = (PL_BlockPredictor_Internal*)internal; - in->reset(); - - if (args != nullptr) - { - PL_BlockPredictor_Config* config = (PL_BlockPredictor_Config*)args; - in->config = *config; - } - - return true; -} - -void PL_BlockPredictor::finit() -{ - PL_BlockPredictor_Internal* in = (PL_BlockPredictor_Internal*)internal; - -} - -bool PL_BlockPredictor::pay(const PipeMaterial& pm) -{ - PL_BlockPredictor_Internal* in = (PL_BlockPredictor_Internal*)internal; - in->payError = true; - pm.breake(PipeMaterial::PMT_PTR, MB_Frame::MBFT__FIRST, fc_pm_breaker_ptr, _ctx); - pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT__FIRST, fc_pm_breaker_frame, _ctx); - - //#todo support RGB - - return !(in->payError); -} - -bool PL_BlockPredictor::gain(PipeMaterial& pm) -{ - PL_BlockPredictor_Internal* in = (PL_BlockPredictor_Internal*)internal; - - if (in->payError) - { - pm.former = this; - return false; - } - - if (!in->config.copyData) - { - pm.type = PipeMaterial::PMT_FRAME; - pm.buffer = &(in->lastMbfBuffOrigin); - pm.buffSize = 0; - } - else - { - in->pmList[0].type = PipeMaterial::PMT_FRAME; - in->pmList[0].buffer = &(in->lastMbfBuffCopy); - in->pmList[0].buffSize = 0; - in->pmList[0].former = this; - - in->pmList[1].type = PipeMaterial::PMT_FRAME; - in->pmList[1].buffer = &(in->lastMbfBuffOrigin); - in->pmList[1].buffSize = 0; - in->pmList[1].former = this; - - pm.type = PipeMaterial::PMT_PM_LIST; - pm.buffer = in->pmList; - pm.buffSize = sizeof(in->pmList) / sizeof(PipeMaterial); - } - - pm.former = this; - return true; -} diff --git a/RtspFace/PL_BlockPredictor.h b/RtspFace/PL_BlockPredictor.h deleted file mode 100644 index b139971..0000000 --- a/RtspFace/PL_BlockPredictor.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _PL_BlockPredictor_H_ -#define _PL_BlockPredictor_H_ - -#include "PipeLine.h" - -typedef float (plbg_user_score_func_t*)(const PipeMaterial& pm); - -struct PL_BlockPredictor_Config -{ - - PL_BlockPredictor_Config() : - copyData(true) - { } -}; - -class PL_BlockPredictor : public PipeLineElem -{ -public: - PL_BlockPredictor(); - virtual ~PL_BlockPredictor(); - - virtual bool init(void* args); - virtual void finit(); - - virtual bool pay(const PipeMaterial& pm); - virtual bool gain(PipeMaterial& pm); - -private: - static bool pay_breaker_MBFT_YUV(const PipeMaterial* pm, void* args); - -private: - void* internal; -}; - -PipeLineElem* create_PL_BlockPredictor(); - -#endif diff --git a/RtspFace/PL_InterProcessJoint.h b/RtspFace/PL_InterProcessJoint.h new file mode 100644 index 0000000..79775a9 --- /dev/null +++ b/RtspFace/PL_InterProcessJoint.h @@ -0,0 +1 @@ +// split pipeline into two process via network diff --git a/RtspFace/PL_RTSPServer.cpp b/RtspFace/PL_RTSPServer.cpp index d3da325..4f140ca 100644 --- a/RtspFace/PL_RTSPServer.cpp +++ b/RtspFace/PL_RTSPServer.cpp @@ -96,9 +96,18 @@ ReleaseFrame(); return 0; } - + + //static size_t f = 0; + //static FILE *pFile = fopen("/data/bb.264", "wb"); + //fwrite(in.buffer, sizeof(char), in.buffSize, pFile); + //if (++f > 400){ + // fclose(pFile); + // exit(0); + //} + uint8_t* pBuffer = in.buffer; size_t newBufferSize = in.buffSize; + if (in.config.payWithAux) { if (newBufferSize <= 4) @@ -109,7 +118,7 @@ pBuffer += 4; newBufferSize -= 4; } - + *FrameBuffer = pBuffer; *FrameSize = newBufferSize; @@ -233,7 +242,7 @@ return false; memcpy(in->buffer, frame->buffer, frame->buffSize); in->buffSize = frame->buffSize; - + if (in->encoderStub == nullptr) return false; diff --git a/RtspFace/PL_RTSPServer.h b/RtspFace/PL_RTSPServer.h index ea9e154..89e2eca 100644 --- a/RtspFace/PL_RTSPServer.h +++ b/RtspFace/PL_RTSPServer.h @@ -1,5 +1,5 @@ #ifndef _PL_RTSPSERVER_H_ -#define _PL_PL_RTSPSERVER_H_ +#define _PL_RTSPSERVER_H_ #include "PipeLine.h" diff --git a/RtspFace/PL_SensetimeFaceFeatureEmit.h b/RtspFace/PL_SensetimeFaceFeatureEmit.h new file mode 100644 index 0000000..c312a0c --- /dev/null +++ b/RtspFace/PL_SensetimeFaceFeatureEmit.h @@ -0,0 +1,6 @@ +#ifndef _PL_SENSETIMEFACEFEATUREEMIT_H_ +#define _PL_SENSETIMEFACEFEATUREEMIT_H_ + +#include "PipeLine.h" + +#endif diff --git a/RtspFace/PL_SocketGainer.cpp b/RtspFace/PL_SocketGainer.cpp deleted file mode 100644 index 4840338..0000000 --- a/RtspFace/PL_SocketGainer.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include "PL_SocketGainer.h" -#include "MaterialBuffer.h" -#include "logger.h" - -struct PL_SocketGainer_Internal -{ - uint8_t* buffer; - size_t buffSize; - size_t buffSizeMax; - bool payError; - - PipeMaterial::PipeMaterialBufferType lastPmType; - MB_Frame lastFrame; - PL_SocketGainer_Config config; - - PL_SocketGainer_Internal() : - buffer(nullptr), buffSize(0), buffSizeMax(0), payError(true), - lastPmType(PipeMaterial::PMT_NONE), lastFrame(), config() - { - } - - ~PL_SocketGainer_Internal() - { - delete[] buffer; - buffer = nullptr; - } - - void reset() - { - buffSize = 0; - payError = true; - - lastPmType = PipeMaterial::PMT_NONE; - - MB_Frame _lastFrame; - lastFrame = _lastFrame; - - PL_SocketGainer_Config _config; - config = _config; - - if (buffer != nullptr) - { - delete[] buffer; - buffer = nullptr; - buffSizeMax = 0; - } - } -}; - -PipeLineElem* create_PL_SocketGainer() -{ - return new PL_SocketGainer; -} - -PL_SocketGainer::PL_SocketGainer() : internal(new PL_SocketGainer_Internal) -{ -} - -PL_SocketGainer::~PL_SocketGainer() -{ - delete (PL_SocketGainer_Internal*)internal; - internal= nullptr; -} - -bool PL_SocketGainer::init(void* args) -{ - PL_SocketGainer_Internal* in = (PL_SocketGainer_Internal*)internal; - in->reset(); - - if (args != nullptr) - { - PL_SocketGainer_Config* config = (PL_SocketGainer_Config*)args; - in->config = *config; - } - - if (in->config.toWidth <= 0 || in->config.toHeight <= 0) - { - LOG_ERROR << "Config toWidth and toHeight should > 0" << std::endl; - return false; - } - - return true; -} - -void PL_SocketGainer::finit() -{ - PL_SocketGainer_Internal* in = (PL_SocketGainer_Internal*)internal; - -} - -bool PL_SocketGainer::pay(const PipeMaterial& pm) -{ - PL_SocketGainer_Internal* in = (PL_SocketGainer_Internal*)internal; - - in->payError = true; - - if (pm.buffer == nullptr) - return false; - - bool ret = false; - - in->lastPmType = pm.type; - - switch(pm.type) - { - case PipeMaterial::PMT_BYTES: - { - //if (in->config.defaultBytesType <= 0 || - // in->config.defaultBytesWidth <= 0 || in->config.defaultBytesHeight <= 0) - //{ - // LOG_ERROR << "defaultBytesType/defaultBytesWidth/defaultBytesHeight not set" << std::endl; - // return false; - //} - // - //ret = image_scale(in, (uint8_t*)pm.buffer, pm.buffSize, (MB_Frame::MBFType)(in->config.defaultBytesType), - // in->config.defaultBytesWidth, in->config.defaultBytesHeight); - } - break; - case PipeMaterial::PMT_FRAME: - { - //MB_Frame* frame = (MB_Frame*)pm.buffer; - //switch(frame->type) - //{ - //case MB_Frame::MBFT_YUV420: - //case MB_Frame::MBFT_BGRA: - // in->lastFrame = *frame; - // ret = image_scale(in, (uint8_t*)frame->buffer, frame->buffSize, frame->type, - // frame->width, frame->height); - // break; - //default: - // LOG_ERROR << "Only support MBFT_YUV420 / MBFT_BGRA" << std::endl; - // return false; - //} - } - break; - default: - LOG_ERROR << "Only support PMT_BYTES / PMT_FRAME" << std::endl; - return false; - } - - in->payError = !ret; - return ret; -} - -bool PL_SocketGainer::gain(PipeMaterial& pm) -{ - PL_SocketGainer_Internal* in = (PL_SocketGainer_Internal*)internal; - - PipeMaterial newPm; - newPm.type = PipeMaterial::PMT_NONE; - newPm.former = this; - - switch(in->lastPmType) - { - case PipeMaterial::PMT_BYTES: - { - newPm.type = PipeMaterial::PMT_BYTES; - newPm.buffer = in->buffer; - newPm.buffSize = in->buffSize; - } - break; - case PipeMaterial::PMT_FRAME: - { - newPm.type = PipeMaterial::PMT_FRAME; - newPm.buffer = &(in->lastFrame); - newPm.buffSize = 0; - - in->lastFrame.buffer = in->buffer; - in->lastFrame.buffSize = in->buffSize; - in->lastFrame.width = in->config.toWidth; - in->lastFrame.height = in->config.toHeight; - } - break; - default: - LOG_ERROR << "Only support PMT_BYTES / PMT_FRAME" << std::endl; - } - - pm = newPm; - return !in->payError; -} diff --git a/RtspFace/PL_SocketGainer.h b/RtspFace/PL_SocketGainer.h deleted file mode 100644 index ecad18b..0000000 --- a/RtspFace/PL_SocketGainer.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _PL_SocketGainer_H_ -#define _PL_SocketGainer_H_ - -#include "PipeLine.h" - -struct PL_SocketGainer_Config -{ - uint16_t toWidth; - uint16_t toHeight; - int filterMode; // libyuv/scale.h/FilterMode - - // Used only pm.type==PMT_BYTES - int defaultBytesType; // MBFT_YUV420 / MBFT_BGRA - uint16_t defaultBytesWidth; - uint16_t defaultBytesHeight; - - PL_SocketGainer_Config() : - toWidth(0), toHeight(0), filterMode(0), - defaultBytesType(0), defaultBytesWidth(0), defaultBytesHeight(0) - { } -}; - -class PL_SocketGainer : public PipeLineElem -{ -public: - PL_SocketGainer(); - virtual ~PL_SocketGainer(); - - virtual bool init(void* args); - virtual void finit(); - - virtual bool pay(const PipeMaterial& pm); - virtual bool gain(PipeMaterial& pm); - -private: - void* internal; -}; - -PipeLineElem* create_PL_SocketGainer(); - -#endif diff --git a/RtspFace/PL_StaticJpegSource.cpp b/RtspFace/PL_StaticJpegSource.cpp deleted file mode 100644 index 6ad3382..0000000 --- a/RtspFace/PL_StaticJpegSource.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "PL_StaticJpegSource.h" - -extern "C" -{ - #include <libyuv.h> -} - -struct PL_StaticJpegSource_Internal -{ - uint8_t buffer[1920*1080*4]; - size_t buffSize; - size_t buffSizeMax; - - bool payError; - - PL_StaticJpegSource_Internal() : - buffSize(0), buffSizeMax(sizeof(buffer)), - payError(true) - { - } - - ~PL_StaticJpegSource_Internal() - { - } - - void reset() - { - buffSize = 0; - payError = true; - } -}; - -PipeLineElem* create_PL_StaticJpegSource() -{ - return new PL_StaticJpegSource; -} - -PL_StaticJpegSource::PL_StaticJpegSource() : internal(new PL_StaticJpegSource_Internal) -{ -} - -PL_StaticJpegSource::~PL_StaticJpegSource() -{ - delete (PL_StaticJpegSource_Internal*)internal; - internal= nullptr; -} - -bool PL_StaticJpegSource::init(void* args) -{ - PL_StaticJpegSource_Internal* in = (PL_StaticJpegSource_Internal*)internal; - in->reset(); - - return true; -} - -void PL_StaticJpegSource::finit() -{ - PL_StaticJpegSource_Internal* in = (PL_StaticJpegSource_Internal*)internal; - -} - -bool PL_StaticJpegSource::pay(const PipeMaterial& pm) -{ - PL_StaticJpegSource_Internal* in = (PL_StaticJpegSource_Internal*)internal; - - //in->buffer readly - - //static size_t f=0; - //char fname[50]; - //sprintf(fname, "%u.bgra", ++f); - //FILE * pFile = fopen (fname,"wb"); - //fwrite (in->buffer , sizeof(char), in->buffSize, pFile); - //fclose(pFile); - - return true; -} - -bool PL_StaticJpegSource::gain(PipeMaterial& pm) -{ - PL_StaticJpegSource_Internal* in = (PL_StaticJpegSource_Internal*)internal; - - pm.buffer = in->buffer; - pm.buffSize = in->buffSize; - pm.former = this; - return true; -} diff --git a/RtspFace/PL_StaticJpegSource.h b/RtspFace/PL_StaticJpegSource.h deleted file mode 100644 index 08aa5b8..0000000 --- a/RtspFace/PL_StaticJpegSource.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _PL_PL_StaticJpegSource_H_ -#define _PL_PL_StaticJpegSource_H_ - -#include "PipeLine.h" - -class PL_StaticJpegSource : public PipeLineElem -{ -public: - PL_StaticJpegSource(); - virtual ~PL_StaticJpegSource(); - - virtual bool init(void* args); - virtual void finit(); - - virtual bool pay(const PipeMaterial& pm); - virtual bool gain(PipeMaterial& pm); - -private: - void* internal; -}; - -PipeLineElem* create_PL_StaticJpegSource(); - -#endif diff --git a/RtspFace/PL_V4L2Sink.h b/RtspFace/PL_V4L2Sink.h deleted file mode 100644 index cef797d..0000000 --- a/RtspFace/PL_V4L2Sink.h +++ /dev/null @@ -1,2 +0,0 @@ -// use https://github.com/mpromonet/libv4l2cpp - diff --git a/RtspFace/PL_V4L2Source.cpp b/RtspFace/PL_V4L2Source.cpp deleted file mode 100644 index 0d91709..0000000 --- a/RtspFace/PL_V4L2Source.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "PL_V4L2Source.h" -#include "MaterialBuffer.h" -#include "logger.h" -#include "MediaHelper.h" - -#include <linux/videodev2.h> -#include <V4l2Device.h> -#include <V4l2Capture.h> -#include <V4l2Output.h> - -#include <libyuv.h> - -struct PL_V4L2Source_Internal -{ - uint8_t* buffer; - int buffSize; - size_t buffSizeMax; - bool payError; - - MB_Frame lastFrame; - PL_V4L2Source_Config config; - - V4l2Capture* videoCapture; - - PL_V4L2Source_Internal() : - buffer(nullptr), buffSize(0), buffSizeMax(0), payError(true), - lastFrame(), config(), - videoCapture(nullptr) - { - } - - ~PL_V4L2Source_Internal() - { - delete[] buffer; - buffer = nullptr; - } - - void reset() - { - buffSize = 0; - payError = true; - - MB_Frame _lastFrame; - lastFrame = _lastFrame; - - PL_V4L2Source_Config _config; - config = _config; - - if (buffer != nullptr) - { - delete[] buffer; - buffer = nullptr; - buffSizeMax = 0; - } - } -}; - -PipeLineElem* create_PL_V4L2Source() -{ - return new PL_V4L2Source; -} - -PL_V4L2Source::PL_V4L2Source() : internal(new PL_V4L2Source_Internal) -{ -} - -PL_V4L2Source::~PL_V4L2Source() -{ - PL_V4L2Source_Internal* in = (PL_V4L2Source_Internal*)internal; - delete in; -} - -bool PL_V4L2Source::init(void* args) -{ - PL_V4L2Source_Internal* in = (PL_V4L2Source_Internal*)internal; - in->reset(); - - if (args != nullptr) - { - PL_V4L2Source_Config* config = (PL_V4L2Source_Config*)args; - in->config = *config; - } - - // init V4L2 capture interface - V4L2DeviceParameters param(in->config.device.c_str(), in->config.format, in->config.width, in->config.height, in->config.fps, 1+1); - in->videoCapture = V4l2Capture::create(param, (V4l2Access::IoType)in->config.ioType); - - if (in->videoCapture != nullptr) - { - in->buffSizeMax = in->videoCapture->getBufferSize(); - in->buffer = new uint8_t[in->buffSizeMax]; - } - - return in->videoCapture != nullptr; -} - -void PL_V4L2Source::finit() -{ - PL_V4L2Source_Internal* in = (PL_V4L2Source_Internal*)internal; - - // close videoCapture - //#todo -} - -bool PL_V4L2Source::pay(const PipeMaterial& pm) -{ - return false; -} - -bool PL_V4L2Source::gain(PipeMaterial& pm) -{ - PL_V4L2Source_Internal* in = (PL_V4L2Source_Internal*)internal; - - pm.former = this; - pm.deleter = nullptr; - pm.args = nullptr; - - uint8_t tmpYUYV[in->config.width * in->config.height * 2]; - in->buffSize = in->videoCapture->read((char*)tmpYUYV, sizeof(tmpYUYV)); - if (in->buffSize <= 0 && errno != EAGAIN) - { - LOG(NOTICE) << "videoCapture stopped " << strerror(errno) << LOG_ENDL; - return false; - } - - uint8_t* dst_y = (uint8_t*)(in->buffer); - uint8_t* dst_u = (uint8_t*)(dst_y + (in->config.width * in->config.height)); - uint8_t* dst_v = (uint8_t*)(dst_u + (in->config.width * in->config.height / 4)); - - //libyuv::YUY2ToI420(tmpYUYV, in->config.width*2, - // dst_y, in->config.width, - // dst_u, MH_SUBSAMPLE1(in->config.width, 2), - // dst_v, MH_SUBSAMPLE1(in->config.width, 2), - // in->config.width, in->config.height - // ); - //in->lastFrame.type = MB_Frame::MBFT_YUV420; - - libyuv::YUY2ToNV12(tmpYUYV, in->config.width*2, - dst_y, in->config.width, - dst_u, in->config.width, - in->config.width, in->config.height - ); - in->lastFrame.type = MB_Frame::MBFT_NV12; - - in->lastFrame.buffer = in->buffer; - in->lastFrame.buffSize = in->config.width * in->config.height * 1.5; - in->lastFrame.width = in->videoCapture->getWidth(); - in->lastFrame.height = in->videoCapture->getHeight(); - in->lastFrame.pts = microseconds_to_timeval(0); - - pm.type = PipeMaterial::PMT_FRAME; - pm.buffer = &(in->lastFrame); - pm.buffSize = 0; - - return true; -} diff --git a/RtspFace/PL_V4L2Source.h b/RtspFace/PL_V4L2Source.h deleted file mode 100644 index 0d82455..0000000 --- a/RtspFace/PL_V4L2Source.h +++ /dev/null @@ -1,41 +0,0 @@ -// use https://github.com/mpromonet/libv4l2cpp - -#ifndef _PL_V4L2Source_H_ -#define _PL_V4L2Source_H_ - -#include <linux/videodev2.h> -#include "PipeLine.h" - -struct PL_V4L2Source_Config -{ - std::string device; - int ioType; // V4l2Access::IoType::IOTYPE_READWRITE=0, IOTYPE_MMAP=1 - int format; - uint16_t width; - uint16_t height; - uint16_t fps; - - PL_V4L2Source_Config() : - device("/dev/video0"), ioType(1), format(0), width(1280), height(720), fps(10)//V4L2_PIX_FMT_MJPEG - { } -}; - -class PL_V4L2Source : public PipeLineElem -{ -public: - PL_V4L2Source(); - virtual ~PL_V4L2Source(); - - virtual bool init(void* args); - virtual void finit(); - - virtual bool pay(const PipeMaterial& pm); - virtual bool gain(PipeMaterial& pm); - -private: - void* internal; -}; - -PipeLineElem* create_PL_V4L2Source(); - -#endif diff --git a/RtspFace/libv4l2cpp/LICENSE b/RtspFace/libv4l2cpp/LICENSE deleted file mode 100644 index cf1ab25..0000000 --- a/RtspFace/libv4l2cpp/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to <http://unlicense.org> diff --git a/RtspFace/libv4l2cpp/Makefile b/RtspFace/libv4l2cpp/Makefile deleted file mode 100644 index 3c7b7d8..0000000 --- a/RtspFace/libv4l2cpp/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -CFLAGS = -W -Wall -pthread -g -pipe $(CFLAGS_EXTRA) -CFLAGS += -I inc -RM = rm -rf -CC = gcc -AR = ar - -V4L2WRAPPER_CPP:=$(wildcard src/*.cpp) -V4L2WRAPPER_OBJ:=$(V4L2WRAPPER_CPP:%.cpp=%.o) - -.DEFAULT_GOAL := all - -all: libv4l2wrapper.a - -%.o: %.cpp - $(CC) -c -o $@ $< $(CFLAGS) - -libv4l2wrapper.a: $(V4L2WRAPPER_OBJ) - $(AR) rcs $@ $^ - - -clean: - -@$(RM) *.a $(V4L2WRAPPER_OBJ) diff --git a/RtspFace/libv4l2cpp/README.md b/RtspFace/libv4l2cpp/README.md deleted file mode 100644 index afced79..0000000 --- a/RtspFace/libv4l2cpp/README.md +++ /dev/null @@ -1,47 +0,0 @@ - -libv4l2cpp -==================== - -It is a C++ wrapper for V4L2 - -License ------------- -Domain public - -Dependencies ------------- - - liblog4cpp5-dev - -V4L2 Capture -------------- - - create a V4L2 Capture interface using MMAP interface: - - V4L2DeviceParameters param("/dev/video0", V4L2_PIX_FMT_*, width, height, fps, verbose); - V4l2Capture* videoCapture = V4l2Capture::create(param, V4l2Access::IOTYPE_MMAP); - - - data are available : - - timeval timeout; - bool isReadable = (videoCapture->isReadable(&timeout) == 1); - - - read data : - - size_t nb = videoCapture->read(buffer, bufferSize); - - -V4L2 Output -------------- - - - To create a V4L2 Output interface using MMAP interface: - - V4L2DeviceParameters param("/dev/video0", V4L2_PIX_FMT_*, width, height, fps, verbose); - V4l2Output* videoOutput = V4l2Output::create(param, V4l2Access::IOTYPE_MMAP); - - - data could be written : - - timeval timeout; - bool isWritable = (videoOutput->isWritable(&timeout) == 1); - - - write data : - - size_t nb = videoOutput->write(buffer, bufferSize); diff --git a/RtspFace/libv4l2cpp/inc/V4l2Access.h b/RtspFace/libv4l2cpp/inc/V4l2Access.h deleted file mode 100644 index 39ef676..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2Access.h +++ /dev/null @@ -1,50 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Access.h -** -** V4L2 wrapper -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_ACCESS -#define V4L2_ACCESS - -#include "V4l2Device.h" - -class V4l2Access -{ - public: - enum IoType - { - IOTYPE_READWRITE, - IOTYPE_MMAP, - }; - - V4l2Access(V4l2Device* device) : m_device(device) {} - virtual ~V4l2Access() { delete m_device; } - - int getFd() { return m_device->getFd(); } - int getBufferSize() { return m_device->getBufferSize(); } - int getFormat() { return m_device->getFormat(); } - int getWidth() { return m_device->getWidth(); } - int getHeight() { return m_device->getHeight(); } - void queryFormat() { m_device->queryFormat(); } - - int isReady() { return m_device->isReady(); } - int start() { return m_device->start(); } - int stop() { return m_device->stop(); } - - private: - V4l2Access(const V4l2Access&); - V4l2Access & operator=(const V4l2Access&); - - protected: - V4l2Device* m_device; -}; - - -#endif diff --git a/RtspFace/libv4l2cpp/inc/V4l2Capture.h b/RtspFace/libv4l2cpp/inc/V4l2Capture.h deleted file mode 100644 index 44b0d18..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2Capture.h +++ /dev/null @@ -1,34 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Capture.h -** -** V4L2 Capture wrapper -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_CAPTURE -#define V4L2_CAPTURE - -#include "V4l2Access.h" - -// --------------------------------- -// V4L2 Capture -// --------------------------------- -class V4l2Capture : public V4l2Access -{ - protected: - V4l2Capture(V4l2Device* device); - - public: - static V4l2Capture* create(const V4L2DeviceParameters & param, IoType iotype = V4l2Access::IOTYPE_MMAP); - - size_t read(char* buffer, size_t bufferSize); - int isReadable(timeval* tv); -}; - - -#endif diff --git a/RtspFace/libv4l2cpp/inc/V4l2Device.h b/RtspFace/libv4l2cpp/inc/V4l2Device.h deleted file mode 100644 index d6fc407..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2Device.h +++ /dev/null @@ -1,89 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Device.h -** -** V4L2 wrapper -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_DEVICE -#define V4L2_DEVICE - -#include <string> -#include <linux/videodev2.h> - -#ifndef V4L2_PIX_FMT_VP8 -#define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') -#endif -#ifndef V4L2_PIX_FMT_VP9 -#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') -#endif - -// --------------------------------- -// V4L2 Device parameters -// --------------------------------- -struct V4L2DeviceParameters -{ - V4L2DeviceParameters(const char* devname, unsigned int format, unsigned int width, unsigned int height, int fps, int verbose) : - m_devName(devname), m_format(format), m_width(width), m_height(height), m_fps(fps), m_verbose(verbose) {}; - - std::string m_devName; - unsigned int m_format; - unsigned int m_width; - unsigned int m_height; - int m_fps; - int m_verbose; -}; - -// --------------------------------- -// V4L2 Device -// --------------------------------- -class V4l2Device -{ - friend class V4l2Capture; - friend class V4l2Output; - - protected: - void close(); - - int initdevice(const char *dev_name, unsigned int mandatoryCapabilities); - int checkCapabilities(int fd, unsigned int mandatoryCapabilities); - int configureFormat(int fd); - int configureParam(int fd); - - virtual bool init(unsigned int mandatoryCapabilities); - virtual size_t writeInternal(char*, size_t) { return -1; }; - virtual size_t readInternal(char*, size_t) { return -1; }; - - public: - V4l2Device(const V4L2DeviceParameters& params, v4l2_buf_type deviceType); - virtual ~V4l2Device(); - - virtual bool isReady() { return (m_fd != -1); } - virtual bool start() { return true; } - virtual bool stop() { return true; } - - int getBufferSize() { return m_bufferSize; } - int getFormat() { return m_format; } - int getWidth() { return m_width; } - int getHeight() { return m_height; } - int getFd() { return m_fd; } - void queryFormat(); - - protected: - V4L2DeviceParameters m_params; - int m_fd; - v4l2_buf_type m_deviceType; - - int m_bufferSize; - int m_format; - int m_width; - int m_height; -}; - - -#endif diff --git a/RtspFace/libv4l2cpp/inc/V4l2MmapDevice.h b/RtspFace/libv4l2cpp/inc/V4l2MmapDevice.h deleted file mode 100644 index 313e41f..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2MmapDevice.h +++ /dev/null @@ -1,47 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2MmapDevice.h -** -** V4L2 source using mmap API -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_MMAP_DEVICE -#define V4L2_MMAP_DEVICE - -#include "V4l2Device.h" - -#define V4L2MMAP_NBBUFFER 10 - -class V4l2MmapDevice : public V4l2Device -{ - protected: - size_t writeInternal(char* buffer, size_t bufferSize); - size_t readInternal(char* buffer, size_t bufferSize); - - public: - V4l2MmapDevice(const V4L2DeviceParameters & params, v4l2_buf_type deviceType); - virtual ~V4l2MmapDevice(); - - virtual bool init(unsigned int mandatoryiCapabilities); - virtual bool isReady() { return ((m_fd != -1)&& (n_buffers != 0)); }; - virtual bool start(); - virtual bool stop(); - - protected: - unsigned int n_buffers; - - struct buffer - { - void * start; - size_t length; - }; - buffer m_buffer[V4L2MMAP_NBBUFFER]; -}; - -#endif - diff --git a/RtspFace/libv4l2cpp/inc/V4l2Output.h b/RtspFace/libv4l2cpp/inc/V4l2Output.h deleted file mode 100644 index 055c683..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2Output.h +++ /dev/null @@ -1,33 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Output.h -** -** V4L2 Output wrapper -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_OUTPUT -#define V4L2_OUTPUT - -#include "V4l2Access.h" - -// --------------------------------- -// V4L2 Output -// --------------------------------- -class V4l2Output : public V4l2Access -{ - protected: - V4l2Output(V4l2Device* device); - - public: - static V4l2Output* create(const V4L2DeviceParameters & param, IoType iotype = V4l2Access::IOTYPE_MMAP); - - size_t write(char* buffer, size_t bufferSize); - int isWritable(timeval* tv); -}; - -#endif diff --git a/RtspFace/libv4l2cpp/inc/V4l2ReadWriteDevice.h b/RtspFace/libv4l2cpp/inc/V4l2ReadWriteDevice.h deleted file mode 100644 index 59fc1ad..0000000 --- a/RtspFace/libv4l2cpp/inc/V4l2ReadWriteDevice.h +++ /dev/null @@ -1,32 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2ReadWriteDevice.h -** -** V4L2 source using read/write API -** -** -------------------------------------------------------------------------*/ - - -#ifndef V4L2_RW_DEVICE -#define V4L2_RW_DEVICE - -#include "V4l2Device.h" - - -class V4l2ReadWriteDevice : public V4l2Device -{ - protected: - virtual size_t writeInternal(char* buffer, size_t bufferSize) { return ::write(m_fd, buffer, bufferSize); }; - virtual size_t readInternal(char* buffer, size_t bufferSize) { return ::read(m_fd, buffer, bufferSize); }; - - public: - V4l2ReadWriteDevice(const V4L2DeviceParameters& params, v4l2_buf_type deviceType) : V4l2Device(params, deviceType) {}; - -}; - - -#endif - diff --git a/RtspFace/libv4l2cpp/inc/logger.h.bak b/RtspFace/libv4l2cpp/inc/logger.h.bak deleted file mode 100644 index d96116f..0000000 --- a/RtspFace/libv4l2cpp/inc/logger.h.bak +++ /dev/null @@ -1,48 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** logger.h -** -** -------------------------------------------------------------------------*/ - -#ifndef LOGGER_H -#define LOGGER_H - -#include <unistd.h> - -#include "log4cpp/Category.hh" -#include "log4cpp/FileAppender.hh" -#include "log4cpp/PatternLayout.hh" - - -#define LOG(__level) log4cpp::Category::getRoot() << log4cpp::Priority::__level << __FILE__ << ":" << __LINE__ << "\n\t" - -inline void initLogger(int verbose) -{ - // initialize log4cpp - log4cpp::Category &log = log4cpp::Category::getRoot(); - log4cpp::Appender *app = new log4cpp::FileAppender("root", fileno(stdout)); - if (app) - { - log4cpp::PatternLayout *plt = new log4cpp::PatternLayout(); - if (plt) - { - plt->setConversionPattern("%d [%-6p] - %m%n"); - app->setLayout(plt); - } - log.addAppender(app); - } - switch (verbose) - { - case 2: log.setPriority(log4cpp::Priority::DEBUG); break; - case 1: log.setPriority(log4cpp::Priority::INFO); break; - default: log.setPriority(log4cpp::Priority::NOTICE); break; - - } - LOG(INFO) << "level:" << log4cpp::Priority::getPriorityName(log.getPriority()); -} - -#endif - diff --git a/RtspFace/libv4l2cpp/src/V4l2Capture.cpp b/RtspFace/libv4l2cpp/src/V4l2Capture.cpp deleted file mode 100644 index 71b03c0..0000000 --- a/RtspFace/libv4l2cpp/src/V4l2Capture.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Capture.cpp -** -** V4L2 wrapper -** -** -------------------------------------------------------------------------*/ - - -// libv4l2 -#include <linux/videodev2.h> - -// project -#include "logger.h" -#include "V4l2Capture.h" -#include "V4l2MmapDevice.h" -#include "V4l2ReadWriteDevice.h" - - -// ----------------------------------------- -// create video capture interface -// ----------------------------------------- -V4l2Capture* V4l2Capture::create(const V4L2DeviceParameters & param, IoType iotype) -{ - V4l2Capture* videoCapture = NULL; - V4l2Device* videoDevice = NULL; - int caps = V4L2_CAP_VIDEO_CAPTURE; - switch (iotype) - { - case IOTYPE_MMAP: - videoDevice = new V4l2MmapDevice(param, V4L2_BUF_TYPE_VIDEO_CAPTURE); - caps |= V4L2_CAP_STREAMING; - break; - default: - videoDevice = new V4l2ReadWriteDevice(param, V4L2_BUF_TYPE_VIDEO_CAPTURE); - caps |= V4L2_CAP_READWRITE; - break; - } - - if (videoDevice && !videoDevice->init(caps)) - { - delete videoDevice; - videoDevice=NULL; - } - - if (videoDevice) - { - videoCapture = new V4l2Capture(videoDevice); - } - return videoCapture; -} - -// ----------------------------------------- -// constructor -// ----------------------------------------- -V4l2Capture::V4l2Capture(V4l2Device* device) : V4l2Access(device) -{ -} - -// ----------------------------------------- -// check readability -// ----------------------------------------- -int V4l2Capture::isReadable(timeval* tv) -{ - int fd = m_device->getFd(); - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(fd, &fdset); - return select(fd+1, &fdset, NULL, NULL, tv); -} - -// ----------------------------------------- -// read from V4l2Device -// ----------------------------------------- -size_t V4l2Capture::read(char* buffer, size_t bufferSize) -{ - return m_device->readInternal(buffer, bufferSize); -} - - diff --git a/RtspFace/libv4l2cpp/src/V4l2Device.cpp b/RtspFace/libv4l2cpp/src/V4l2Device.cpp deleted file mode 100644 index ba33c0a..0000000 --- a/RtspFace/libv4l2cpp/src/V4l2Device.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Device.cpp -** -** -------------------------------------------------------------------------*/ - -#include <unistd.h> -#include <errno.h> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <string.h> - -// libv4l2 -#include <linux/videodev2.h> -#include <linux/stat.h> -#include <unistd.h> -#include <fcntl.h> - -#include "logger.h" - -#include "V4l2Device.h" - -// ----------------------------------------- -// V4L2Device -// ----------------------------------------- -V4l2Device::V4l2Device(const V4L2DeviceParameters& params, v4l2_buf_type deviceType) : m_params(params), m_fd(-1), m_deviceType(deviceType), m_bufferSize(0), m_format(0) -{ -} - -V4l2Device::~V4l2Device() -{ - this->close(); -} - -void V4l2Device::close() -{ - if (m_fd != -1) - ::close(m_fd); - - m_fd = -1; -} - -// query current format -void V4l2Device::queryFormat() -{ - struct v4l2_format fmt; - memset(&fmt,0,sizeof(fmt)); - fmt.type = m_deviceType; - if (0 == ioctl(m_fd,VIDIOC_G_FMT,&fmt)) - { - m_format = fmt.fmt.pix.pixelformat; - m_width = fmt.fmt.pix.width; - m_height = fmt.fmt.pix.height; - m_bufferSize = fmt.fmt.pix.sizeimage; - } -} - -// intialize the V4L2 connection -bool V4l2Device::init(unsigned int mandatoryCapabilities) -{ - struct stat sb; - if ( (stat(m_params.m_devName.c_str(), &sb)==0) && ((sb.st_mode & S_IFMT) == S_IFCHR) ) - { - if (initdevice(m_params.m_devName.c_str(), mandatoryCapabilities) == -1) - { - LOG(ERROR) << "Cannot init device:" << m_params.m_devName << LOG_ENDL; - } - } - else - { - // open a normal file - m_fd = open(m_params.m_devName.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU); - } - return (m_fd!=-1); -} - -// intialize the V4L2 device -int V4l2Device::initdevice(const char *dev_name, unsigned int mandatoryCapabilities) -{ - m_fd = open(dev_name, O_RDWR | O_NONBLOCK); - if (m_fd < 0) - { - LOG(ERROR) << "Cannot open device:" << m_params.m_devName << " " << strerror(errno) << LOG_ENDL; - this->close(); - return -1; - } - if (checkCapabilities(m_fd,mandatoryCapabilities) !=0) - { - this->close(); - return -1; - } - if (configureFormat(m_fd) !=0) - { - this->close(); - return -1; - } - if (configureParam(m_fd) !=0) - { - this->close(); - return -1; - } - - return m_fd; -} - -// check needed V4L2 capabilities -int V4l2Device::checkCapabilities(int fd, unsigned int mandatoryCapabilities) -{ - struct v4l2_capability cap; - memset(&(cap), 0, sizeof(cap)); - if (-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap)) - { - LOG(ERROR) << "Cannot get capabilities for device:" << m_params.m_devName << " " << strerror(errno) << LOG_ENDL; - return -1; - } - LOG(NOTICE) << "driver:" << cap.driver << " " << std::hex << cap.capabilities << LOG_ENDL; - - if ((cap.capabilities & V4L2_CAP_READWRITE)) LOG(NOTICE) << m_params.m_devName << " support read/write" << LOG_ENDL; - if ((cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) LOG(NOTICE) << m_params.m_devName << " support output" << LOG_ENDL; - if ((cap.capabilities & V4L2_CAP_STREAMING)) LOG(NOTICE) << m_params.m_devName << " support streaming" << LOG_ENDL; - if ((cap.capabilities & V4L2_CAP_TIMEPERFRAME)) LOG(NOTICE) << m_params.m_devName << " support timeperframe" << LOG_ENDL; - - if ( (cap.capabilities & mandatoryCapabilities) != mandatoryCapabilities ) - { - LOG(ERROR) << "Mandatory capability not available for device:" << m_params.m_devName << LOG_ENDL; - return -1; - } - - return 0; -} - -std::string fourcc(unsigned int format) -{ - char formatArray[] = { (char)(format&0xff), (char)((format>>8)&0xff), (char)((format>>16)&0xff), (char)((format>>24)&0xff), 0 }; - return std::string(formatArray, strlen(formatArray)); -} - -// configure capture format -int V4l2Device::configureFormat(int fd) -{ - - if (m_params.m_format==0) - { - this->queryFormat(); - m_params.m_format = m_format; - m_params.m_width = m_width; - m_params.m_height = m_height; - } - - struct v4l2_format fmt; - memset(&(fmt), 0, sizeof(fmt)); - fmt.type = m_deviceType; - fmt.fmt.pix.width = m_params.m_width; - fmt.fmt.pix.height = m_params.m_height; - fmt.fmt.pix.pixelformat = m_params.m_format; - fmt.fmt.pix.field = V4L2_FIELD_ANY; - - if (ioctl(fd, VIDIOC_S_FMT, &fmt) == -1) - { - LOG(ERROR) << "Cannot set format for device:" << m_params.m_devName << " " << strerror(errno) << LOG_ENDL; - return -1; - } - if (fmt.fmt.pix.pixelformat != m_params.m_format) - { - LOG(ERROR) << "Cannot set pixelformat to:" << fourcc(m_params.m_format) << " format is:" << fourcc(fmt.fmt.pix.pixelformat) << LOG_ENDL; - return -1; - } - if ((fmt.fmt.pix.width != m_params.m_width) || (fmt.fmt.pix.height != m_params.m_height)) - { - LOG(WARN) << "Cannot set size width:" << fmt.fmt.pix.width << " height:" << fmt.fmt.pix.height << LOG_ENDL; - } - - m_format = fmt.fmt.pix.pixelformat; - m_width = fmt.fmt.pix.width; - m_height = fmt.fmt.pix.height; - m_bufferSize = fmt.fmt.pix.sizeimage; - - LOG(NOTICE) << m_params.m_devName << ":" << fourcc(m_format) << " size:" << m_params.m_width << "x" << m_params.m_height << " bufferSize:" << m_bufferSize << LOG_ENDL; - - return 0; -} - -// configure capture FPS -int V4l2Device::configureParam(int fd) -{ - if (m_params.m_fps!=0) - { - struct v4l2_streamparm param; - memset(&(param), 0, sizeof(param)); - param.type = m_deviceType; - param.parm.capture.timeperframe.numerator = 1; - param.parm.capture.timeperframe.denominator = m_params.m_fps; - - if (ioctl(fd, VIDIOC_S_PARM, ¶m) == -1) - { - LOG(WARN) << "Cannot set param for device:" << m_params.m_devName << " " << strerror(errno) << LOG_ENDL; - } - - LOG(NOTICE) << "fps:" << param.parm.capture.timeperframe.numerator << "/" << param.parm.capture.timeperframe.denominator << LOG_ENDL; - LOG(NOTICE) << "nbBuffer:" << param.parm.capture.readbuffers << LOG_ENDL; - } - - return 0; -} - - diff --git a/RtspFace/libv4l2cpp/src/V4l2MmapDevice.cpp b/RtspFace/libv4l2cpp/src/V4l2MmapDevice.cpp deleted file mode 100644 index 7018508..0000000 --- a/RtspFace/libv4l2cpp/src/V4l2MmapDevice.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2MmapDevice.cpp -** -** V4L2 source using mmap API -** -** -------------------------------------------------------------------------*/ - -#include <string.h> -#include <fcntl.h> -#include <errno.h> -#include <sys/mman.h> -#include <sys/ioctl.h> - -// libv4l2 -#include <linux/videodev2.h> - -// project -#include "logger.h" -#include "V4l2MmapDevice.h" - -V4l2MmapDevice::V4l2MmapDevice(const V4L2DeviceParameters & params, v4l2_buf_type deviceType) : V4l2Device(params, deviceType), n_buffers(0) -{ - memset(&m_buffer, 0, sizeof(m_buffer)); -} - -bool V4l2MmapDevice::init(unsigned int mandatoryCapabilities) -{ - bool ret = V4l2Device::init(mandatoryCapabilities); - if (ret) - { - this->start(); - } - return ret; -} - -V4l2MmapDevice::~V4l2MmapDevice() -{ - this->stop(); -} - - -bool V4l2MmapDevice::start() -{ - bool success = true; - struct v4l2_requestbuffers req; - memset (&req, 0, sizeof(req)); - req.count = V4L2MMAP_NBBUFFER; - req.type = m_deviceType; - req.memory = V4L2_MEMORY_MMAP; - - if (-1 == ioctl(m_fd, VIDIOC_REQBUFS, &req)) - { - if (EINVAL == errno) - { - LOG(ERROR) << "Device " << m_params.m_devName << " does not support memory mapping" << LOG_ENDL; - success = false; - } - else - { - perror("VIDIOC_REQBUFS"); - success = false; - } - } - else - { - LOG(NOTICE) << "Device " << m_params.m_devName << " nb buffer:" << req.count << LOG_ENDL; - - // allocate buffers - memset(&m_buffer,0, sizeof(m_buffer)); - for (n_buffers = 0; n_buffers < req.count; ++n_buffers) - { - struct v4l2_buffer buf; - memset (&buf, 0, sizeof(buf)); - buf.type = m_deviceType; - buf.memory = V4L2_MEMORY_MMAP; - buf.index = n_buffers; - - if (-1 == ioctl(m_fd, VIDIOC_QUERYBUF, &buf)) - { - perror("VIDIOC_QUERYBUF"); - success = false; - } - else - { - LOG(INFO) << "Device " << m_params.m_devName << " buffer idx:" << n_buffers << " size:" << buf.length << LOG_ENDL; - m_buffer[n_buffers].length = buf.length; - m_buffer[n_buffers].start = mmap ( NULL /* start anywhere */, - buf.length, - PROT_READ | PROT_WRITE /* required */, - MAP_SHARED /* recommended */, - m_fd, - buf.m.offset); - - if (MAP_FAILED == m_buffer[n_buffers].start) - { - perror("mmap"); - success = false; - } - } - } - - // queue buffers - for (unsigned int i = 0; i < n_buffers; ++i) - { - struct v4l2_buffer buf; - memset (&buf, 0, sizeof(buf)); - buf.type = m_deviceType; - buf.memory = V4L2_MEMORY_MMAP; - buf.index = i; - - if (-1 == ioctl(m_fd, VIDIOC_QBUF, &buf)) - { - perror("VIDIOC_QBUF"); - success = false; - } - } - - // start stream - int type = m_deviceType; - if (-1 == ioctl(m_fd, VIDIOC_STREAMON, &type)) - { - perror("VIDIOC_STREAMON"); - success = false; - } - } - return success; -} - -bool V4l2MmapDevice::stop() -{ - bool success = true; - - int type = m_deviceType; - if (-1 == ioctl(m_fd, VIDIOC_STREAMOFF, &type)) - { - perror("VIDIOC_STREAMOFF"); - success = false; - } - - for (unsigned int i = 0; i < n_buffers; ++i) - { - if (-1 == munmap (m_buffer[i].start, m_buffer[i].length)) - { - perror("munmap"); - success = false; - } - } - - // free buffers - struct v4l2_requestbuffers req; - memset (&req, 0, sizeof(req)); - req.count = 0; - req.type = m_deviceType; - req.memory = V4L2_MEMORY_MMAP; - if (-1 == ioctl(m_fd, VIDIOC_REQBUFS, &req)) - { - perror("VIDIOC_REQBUFS"); - success = false; - } - - n_buffers = 0; - return success; -} - -size_t V4l2MmapDevice::readInternal(char* buffer, size_t bufferSize) -{ - size_t size = 0; - if (n_buffers > 0) - { - struct v4l2_buffer buf; - memset (&buf, 0, sizeof(buf)); - buf.type = m_deviceType; - buf.memory = V4L2_MEMORY_MMAP; - - if (-1 == ioctl(m_fd, VIDIOC_DQBUF, &buf)) - { - perror("VIDIOC_DQBUF"); - size = -1; - } - else if (buf.index < n_buffers) - { - size = buf.bytesused; - if (size > bufferSize) - { - size = bufferSize; - LOG(WARN) << "Device " << m_params.m_devName << " buffer truncated available:" << bufferSize << " needed:" << buf.bytesused << LOG_ENDL; - } - memcpy(buffer, m_buffer[buf.index].start, size); - - if (-1 == ioctl(m_fd, VIDIOC_QBUF, &buf)) - { - perror("VIDIOC_QBUF"); - size = -1; - } - } - } - return size; -} - -size_t V4l2MmapDevice::writeInternal(char* buffer, size_t bufferSize) -{ - size_t size = 0; - if (n_buffers > 0) - { - struct v4l2_buffer buf; - memset (&buf, 0, sizeof(buf)); - buf.type = m_deviceType; - buf.memory = V4L2_MEMORY_MMAP; - - if (-1 == ioctl(m_fd, VIDIOC_DQBUF, &buf)) - { - perror("VIDIOC_DQBUF"); - size = -1; - } - else if (buf.index < n_buffers) - { - size = bufferSize; - if (size > buf.length) - { - size = buf.length; - LOG(WARN) << "Device " << m_params.m_devName << " buffer truncated available:" << buf.length << " needed:" << size << LOG_ENDL; - } - memcpy(m_buffer[buf.index].start, buffer, size); - buf.bytesused = size; - - if (-1 == ioctl(m_fd, VIDIOC_QBUF, &buf)) - { - perror("VIDIOC_QBUF"); - size = -1; - } - } - } - return size; -} - - - - diff --git a/RtspFace/libv4l2cpp/src/V4l2Output.cpp b/RtspFace/libv4l2cpp/src/V4l2Output.cpp deleted file mode 100644 index 99b37f4..0000000 --- a/RtspFace/libv4l2cpp/src/V4l2Output.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* --------------------------------------------------------------------------- -** This software is in the public domain, furnished "as is", without technical -** support, and with no warranty, express or implied, as to its usefulness for -** any purpose. -** -** V4l2Output.cpp -** -** V4L2 wrapper -** -** -------------------------------------------------------------------------*/ - -#include <string.h> - -// libv4l2 -#include <linux/videodev2.h> - -// project -#include "logger.h" - -#include "V4l2Output.h" -#include "V4l2MmapDevice.h" -#include "V4l2ReadWriteDevice.h" - -// ----------------------------------------- -// create video output interface -// ----------------------------------------- -V4l2Output* V4l2Output::create(const V4L2DeviceParameters & param, IoType iotype) -{ - V4l2Output* videoOutput = NULL; - V4l2Device* videoDevice = NULL; - int caps = V4L2_CAP_VIDEO_OUTPUT; - switch (iotype) - { - case IOTYPE_MMAP: - videoDevice = new V4l2MmapDevice(param, V4L2_BUF_TYPE_VIDEO_OUTPUT); - caps |= V4L2_CAP_STREAMING; - break; - default: - videoDevice = new V4l2ReadWriteDevice(param, V4L2_BUF_TYPE_VIDEO_OUTPUT); - caps |= V4L2_CAP_READWRITE; - break; - } - - if (videoDevice && !videoDevice->init(caps)) - { - delete videoDevice; - videoDevice=NULL; - } - - if (videoDevice) - { - videoOutput = new V4l2Output(videoDevice); - } - return videoOutput; -} - -// ----------------------------------------- -// constructor -// ----------------------------------------- -V4l2Output::V4l2Output(V4l2Device* device) : V4l2Access(device) -{ -} - -// ----------------------------------------- -// check writability -// ----------------------------------------- -int V4l2Output::isWritable(timeval* tv) -{ - int fd = m_device->getFd(); - fd_set fdset; - FD_ZERO(&fdset); - FD_SET(fd, &fdset); - return select(fd+1, NULL, &fdset, NULL, tv); -} - -// ----------------------------------------- -// write to V4l2Device -// ----------------------------------------- -size_t V4l2Output::write(char* buffer, size_t bufferSize) -{ - return m_device->writeInternal(buffer, bufferSize); -} diff --git a/RtspFace/main_raspicam_rtsp.cpp b/RtspFace/main_raspicam_rtsp.cpp deleted file mode 100644 index e69e912..0000000 --- a/RtspFace/main_raspicam_rtsp.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include "PipeLine.h" -#include "PL_RTSPServer.h" -#include "PL_RaspiVid.h" - -#include "logger.h" -#include <iostream> - -#include <signal.h> -#include <time.h> -#include <unistd.h> - -#include <cmdhub/client.h> - -#define CLOCKID CLOCK_REALTIME - -Logger g_logger(std::cout); - -time_t g_last_pipe_finished = 0; - -my_id_t get_my_id() -{ - return 123; -} - -std::string cmdhub_send_cmd(const std::string client_cmd) -{ - CmdhubClientSession session; - session.recv_retry = 5; - if (!cmdhub_client_init(session)) - { - LOG_ERROR << "cam_ir_timer cmdhub_client_init error" << LOG_ENDL; - return ""; - } - if (!cmdhub_client_connect(session)) - { - LOG_ERROR << "cam_ir_timer cmdhub_client_connect error" << LOG_ENDL; - return ""; - } - - std::string result; - int exit_code; - if (cmdhub_client_command(session, client_cmd, result, exit_code)) - { - LOG_INFO << "exit_code:" << exit_code << ", result:" << result.c_str(); - - cmdhub_client_destory(session); - return result; - } - - cmdhub_client_destory(session); - return ""; -} - -static void cam_ir_timer(union sigval v) -{ - LOGP(DEBUG, "checking IR %d", v.sival_int); - - if (time(nullptr) - g_last_pipe_finished < 5) - { - // camera should be closed - cmdhub_send_cmd("exec/camirlighting camera_enable"); - } - else - { - cmdhub_send_cmd("exec/camirlighting camera_disable"); - } -} - -void start_cam_ir_timer() -{ - timer_t timerid; - struct sigevent evp; - memset(&evp, 0, sizeof(struct sigevent)); - - evp.sigev_value.sival_int = 123; - evp.sigev_notify = SIGEV_THREAD; - evp.sigev_notify_function = cam_ir_timer; - - if (timer_create(CLOCKID, &evp, &timerid) == -1) - { - LOG_ERROR << "fail to timer_create" << LOG_ENDL; - exit(EXIT_FAILURE); - } - - struct itimerspec it; - it.it_interval.tv_sec = 5; - it.it_interval.tv_nsec = 0; - it.it_value.tv_sec = 5; - it.it_value.tv_nsec = 0; - - if (timer_settime(timerid, 0, &it, NULL) == -1) - { - LOG_ERROR << "fail to timer_settime" << LOG_ENDL; - exit(EXIT_FAILURE); - } -} - -int main(int argc, char** argv) -{ - g_logger.set_level(INFO); - - PipeLine pipeLine; - - PipeLine::register_global_elem_creator("PL_RaspiVid", create_PL_RaspiVid); - PipeLine::register_global_elem_creator("PL_RTSPServer", create_PL_RTSPServer); - - { - PL_RaspiVid* raspiVid = (PL_RaspiVid*)pipeLine.push_elem("PL_RaspiVid"); - PL_RaspiVid_Config config; - config.vflip = true; - //config.profile = "baseline"; - //config.level = "4"; - bool ret = raspiVid->init(&config); - if (!ret) - { - LOG_ERROR << "raspiVid.init error" << std::endl; - exit(EXIT_FAILURE); - } - } - - { - PL_RTSPServer* rtspServer = (PL_RTSPServer*)pipeLine.push_elem("PL_RTSPServer"); - bool ret = rtspServer->init(nullptr); - if (!ret) - { - LOG_ERROR << "rtspServer.init error" << std::endl; - exit(EXIT_FAILURE); - } - } - - cmdhub_send_cmd("exec/camirlighting bh1750_value"); - cmdhub_send_cmd("exec/camirlighting cam_ir_threshold 5"); - - start_cam_ir_timer(); - - while(true) - { - //LOG_ERROR << "begin pipe" << std::endl; - pipeLine.pipe(); - //LOG_ERROR << "end pipe" << std::endl; - - g_last_pipe_finished = time(nullptr); - } -} diff --git a/RtspFace/mediastreamer2/include/mediastreamer2/msjava.h b/RtspFace/mediastreamer2/include/mediastreamer2/msjava.h deleted file mode 100644 index b0f8dc0..0000000 --- a/RtspFace/mediastreamer2/include/mediastreamer2/msjava.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -mediastreamer2 library - modular sound and video processing and streaming -Copyright (C) 2010 Belledonne Communications SARL - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef msjava_h -#define msjava_h - -/* Helper routines for filters that use a jvm with upcalls to perform some processing */ - -#include <jni.h> - -#ifdef __cplusplus -extern "C"{ -#endif - -void ms_set_jvm(JavaVM *vm); - -JavaVM *ms_get_jvm(void); - -JNIEnv *ms_get_jni_env(void); - -#ifdef __ANDROID__ -int ms_get_android_sdk_version(void); -#endif - -#ifdef __cplusplus -} -#endif - - -#endif - diff --git a/RtspFace/mediastreamer2/src/android/android_mediacodec.cpp b/RtspFace/mediastreamer2/src/android/android_mediacodec.cpp deleted file mode 100644 index 7f051d0..0000000 --- a/RtspFace/mediastreamer2/src/android/android_mediacodec.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/* -mediastreamer2 android_mediacodec.cpp -Copyright (C) 2015 Belledonne Communications SARL - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -//#include "mediastreamer2/mscommon.h" -// https://github.com/BelledonneCommunications/ortp/blob/100146d7c09aea0bddcc6a10926f1ee528d42738/include/ortp/port.h -#define ms_new0(type,count) (type*)malloc(sizeof(type)*(count)) -#define ms_free(ptr) free(ptr) - -static const int TRUE = 1; -static const int FALSE = 0; - -#include "mediastreamer2/msjava.h" - -#include <media/NdkMediaCodec.h> -#include <media/NdkMediaFormat.h> -#include "android_mediacodec.h" - -#include "../../logger.h" - -//////////////////////////////////////////////////// -// // -// MEDIA CODEC // -// // -//////////////////////////////////////////////////// - -struct AMediaCodec { - jobject jcodec; - // mediaBufferInfo Class - jmethodID _init_mediaBufferInfoClass; - // MediaCodec Class - jmethodID configure; - jmethodID reset; - jmethodID start; - jmethodID release; - jmethodID flush; - jmethodID stop; - jmethodID getInputBuffer; - jmethodID getOutputBuffer; - jmethodID dequeueInputBuffer; - jmethodID queueInputBuffer; - jmethodID dequeueOutputBuffer; - jmethodID getOutputFormat; - jmethodID getOutputImageMethod; - jmethodID getInputImageMethod; - jmethodID releaseOutputBuffer; - jmethodID setParameters; - // image Class - jmethodID getFormatMethod; - jmethodID getWidthMethod; - jmethodID getHeightMethod; - jmethodID getTimestrampMethod; - jmethodID getPlanesMethod; - jmethodID getCropRectMethod; - // plane Class - jmethodID getPixelStrideMethod; - jmethodID getRowStrideMethod; - jmethodID getBufferMethod; - // Bundle Class - jmethodID _init_BundleClass; - jmethodID putIntId; - // rect Class - jfieldID bottomField; - jfieldID leftField; - jfieldID rightField; - jfieldID topField; - // mediaBufferInfo Class - jfieldID size; - jfieldID flags; - jfieldID offset; -}; - -struct AMediaFormat { - jobject jformat; - // mediaFormat Class - jmethodID setInteger; - jmethodID getInteger; - jmethodID setString; -}; - -int handle_java_exception() { - JNIEnv *env = ms_get_jni_env(); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return -1; - } - return 0; -} - -static bool _loadClass(JNIEnv *env, const char *className, jclass *_class) { - *_class = env->FindClass(className); - if(handle_java_exception() == -1 || *_class == NULL) { - LOGP(ERROR, "Could not load Java class [%s]", className); - return false; - } - return true; -} - -static bool _getMethodID(JNIEnv *env, jclass _class, const char *name, const char *sig, jmethodID *method) { - *method = env->GetMethodID(_class, name, sig); - if(handle_java_exception() == -1 || *method == NULL) { - LOGP(ERROR, "Could not get method %s[%s]", name, sig); - return false; - } - return true; -} - -static bool _getStaticMethodID(JNIEnv *env, jclass _class, const char *name, const char *sig, jmethodID *method) { - *method = env->GetStaticMethodID(_class, name, sig); - if(handle_java_exception() == -1 || *method == NULL) { - LOGP(ERROR, "Could not get static method %s[%s]", name, sig); - return false; - } - return true; -} - -static bool _getFieldID(JNIEnv *env, jclass _class, const char *name, const char *sig, jfieldID *field) { - *field = env->GetFieldID(_class, name, sig); - if(handle_java_exception() == -1 || *field == NULL) { - LOGP(ERROR, "Could not get field %s[%s]", name, sig); - return false; - } - return true; -} - -bool AMediaCodec_loadMethodID(const char *createName, AMediaCodec *codec, const char *mime_type) { - JNIEnv *env = ms_get_jni_env(); - jobject jcodec = NULL; - jclass mediaCodecClass = NULL, imageClass = NULL, planeClass = NULL, rectClass = NULL, mediaBufferInfoClass = NULL, BundleClass = NULL; - jmethodID createMethod = NULL; - jstring msg = NULL; - bool success = true; - - success &= _loadClass(env, "android/media/MediaCodec", &mediaCodecClass); - success &= _loadClass(env, "android/media/Image", &imageClass); - success &= _loadClass(env, "android/media/Image$Plane", &planeClass); - success &= _loadClass(env, "android/graphics/Rect", &rectClass); - success &= _loadClass(env, "android/media/MediaCodec$BufferInfo", &mediaBufferInfoClass); - success &= _loadClass(env, "android/os/Bundle", &BundleClass); - if (!success) { - LOGP(ERROR, "%s(): one class could not be found", __FUNCTION__); - goto error; - } - - success &= _getStaticMethodID(env, mediaCodecClass, createName, "(Ljava/lang/String;)Landroid/media/MediaCodec;", &createMethod); - success &= _getMethodID(env, mediaCodecClass, "configure", "(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V", &(codec->configure)); - success &= _getMethodID(env, mediaCodecClass, "reset", "()V", &(codec->reset)); - success &= _getMethodID(env, mediaCodecClass, "start", "()V", &(codec->start)); - success &= _getMethodID(env, mediaCodecClass, "release", "()V", &(codec->release)); - success &= _getMethodID(env, mediaCodecClass, "flush", "()V", &(codec->flush)); - success &= _getMethodID(env, mediaCodecClass, "stop", "()V", &(codec->stop)); - success &= _getMethodID(env, mediaCodecClass, "getInputBuffer", "(I)Ljava/nio/ByteBuffer;", &(codec->getInputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "getOutputBuffer","(I)Ljava/nio/ByteBuffer;", &(codec->getOutputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "dequeueInputBuffer", "(J)I", &(codec->dequeueInputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "queueInputBuffer", "(IIIJI)V", &(codec->queueInputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "dequeueOutputBuffer", "(Landroid/media/MediaCodec$BufferInfo;J)I", &(codec->dequeueOutputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "getOutputFormat", "()Landroid/media/MediaFormat;", &(codec->getOutputFormat)); - success &= _getMethodID(env, mediaCodecClass, "getInputImage", "(I)Landroid/media/Image;", &(codec->getInputImageMethod)); - success &= _getMethodID(env, mediaCodecClass, "getOutputImage", "(I)Landroid/media/Image;", &(codec->getOutputImageMethod)); - success &= _getMethodID(env, mediaCodecClass, "releaseOutputBuffer", "(IZ)V", &(codec->releaseOutputBuffer)); - success &= _getMethodID(env, mediaCodecClass, "setParameters", "(Landroid/os/Bundle;)V", &(codec->setParameters)); - success &= _getMethodID(env, imageClass, "getFormat", "()I", &(codec->getFormatMethod)); - success &= _getMethodID(env, imageClass, "getWidth", "()I", &(codec->getWidthMethod)); - success &= _getMethodID(env, imageClass, "getHeight", "()I", &(codec->getHeightMethod)); - success &= _getMethodID(env, imageClass, "getTimestamp", "()J", &(codec->getTimestrampMethod)); - success &= _getMethodID(env, imageClass, "getPlanes", "()[Landroid/media/Image$Plane;", &(codec->getPlanesMethod)); - success &= _getMethodID(env, imageClass, "getCropRect", "()Landroid/graphics/Rect;", &(codec->getCropRectMethod)); - success &= _getMethodID(env, planeClass, "getPixelStride", "()I", &(codec->getPixelStrideMethod)); - success &= _getMethodID(env, planeClass, "getRowStride", "()I", &(codec->getRowStrideMethod)); - success &= _getMethodID(env, planeClass, "getBuffer", "()Ljava/nio/ByteBuffer;", &(codec->getBufferMethod)); - success &= _getMethodID(env, mediaBufferInfoClass, "<init>", "()V", &(codec->_init_mediaBufferInfoClass)); - success &= _getMethodID(env, BundleClass,"<init>","()V", &(codec->_init_BundleClass)); - success &= _getMethodID(env, BundleClass,"putInt","(Ljava/lang/String;I)V", &(codec->putIntId)); - success &= _getFieldID(env, rectClass, "bottom", "I", &(codec->bottomField)); - success &= _getFieldID(env, rectClass, "left", "I", &(codec->leftField)); - success &= _getFieldID(env, rectClass, "right", "I", &(codec->rightField)); - success &= _getFieldID(env, rectClass, "top", "I", &(codec->topField)); - success &= _getFieldID(env, mediaBufferInfoClass, "size" , "I", &(codec->size)); - success &= _getFieldID(env, mediaBufferInfoClass, "flags" , "I", &(codec->flags)); - success &= _getFieldID(env, mediaBufferInfoClass, "offset" , "I", &(codec->offset)); - if(!success) { - LOGP(ERROR, "%s(): one method or field could not be found", __FUNCTION__); - goto error; - } - - msg = env->NewStringUTF(mime_type); - jcodec = env->CallStaticObjectMethod(mediaCodecClass, createMethod, msg); - handle_java_exception(); - if (!jcodec) { - LOGP(ERROR, "Failed to create codec !"); - goto error; - } - - codec->jcodec = env->NewGlobalRef(jcodec); - LOGP(INFO, "Codec %s successfully created.", mime_type); - - env->DeleteLocalRef(mediaCodecClass); - env->DeleteLocalRef(jcodec); - env->DeleteLocalRef(imageClass); - env->DeleteLocalRef(planeClass); - env->DeleteLocalRef(rectClass); - env->DeleteLocalRef(BundleClass); - env->DeleteLocalRef(msg); - return true; - - error: - if (mediaCodecClass) env->DeleteLocalRef(mediaCodecClass); - if (jcodec) env->DeleteLocalRef(jcodec); - if (imageClass) env->DeleteLocalRef(imageClass); - if (planeClass) env->DeleteLocalRef(planeClass); - if (rectClass) env->DeleteLocalRef(rectClass); - if (BundleClass) env->DeleteLocalRef(BundleClass); - if (msg) env->DeleteLocalRef(msg); - return false; -} - -AMediaCodec * AMediaCodec_createDecoderByType(const char *mime_type) { - AMediaCodec *codec = ms_new0(AMediaCodec, 1); - if (!AMediaCodec_loadMethodID("createDecoderByType", codec, mime_type)) { - ms_free(codec); - codec = NULL; - } - return codec; -} - -AMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type) { - AMediaCodec *codec = ms_new0(AMediaCodec, 1); - if (!AMediaCodec_loadMethodID("createEncoderByType", codec, mime_type)) { - ms_free(codec); - codec = NULL; - } - return codec; -} - -media_status_t AMediaCodec_configure(AMediaCodec *codec, const AMediaFormat* format, ANativeWindow* surface, AMediaCrypto *crypto, uint32_t flags) { - JNIEnv *env = ms_get_jni_env(); - - //env->CallVoidMethod(codec->jcodec, codec->configure, format->jformat, NULL, NULL, flags); - env->CallVoidMethod(codec->jcodec, codec->configure, format->jformat, NULL, NULL, flags); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -media_status_t AMediaCodec_delete(AMediaCodec *codec) { - JNIEnv *env = ms_get_jni_env(); - - env->CallVoidMethod(codec->jcodec, codec->release); - env->DeleteGlobalRef(codec->jcodec); - ms_free(codec); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -media_status_t AMediaCodec_start(AMediaCodec *codec) { - JNIEnv *env = ms_get_jni_env(); - - env->CallVoidMethod(codec->jcodec, codec->start); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -media_status_t AMediaCodec_flush(AMediaCodec *codec) { - JNIEnv *env = ms_get_jni_env(); - - env->CallVoidMethod(codec->jcodec, codec->flush); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -media_status_t AMediaCodec_stop(AMediaCodec *codec) { - JNIEnv *env = ms_get_jni_env(); - - env->CallVoidMethod(codec->jcodec, codec->stop); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - - -uint8_t* AMediaCodec_getInputBuffer(AMediaCodec *codec, size_t idx, size_t *out_size) { - JNIEnv *env = ms_get_jni_env(); - jobject jbuf = NULL; - uint8_t *buf = NULL; - - jbuf = env->CallObjectMethod(codec->jcodec, codec->getInputBuffer, (jint) idx); - if(jbuf != NULL){ - jlong capacity = env->GetDirectBufferCapacity(jbuf); - *out_size = (size_t) capacity; - buf = (uint8_t *) env->GetDirectBufferAddress(jbuf); - env->DeleteLocalRef(jbuf); - } else { - LOGP(ERROR, "getInputBuffer() failed !"); - env->ExceptionClear(); - } - handle_java_exception(); - return buf; -} - -uint8_t* AMediaCodec_getOutputBuffer(AMediaCodec *codec, size_t idx, size_t *out_size) { - JNIEnv *env = ms_get_jni_env(); - jobject jbuf = NULL; - uint8_t *buf = NULL; - jlong capacity; - - jbuf = env->CallObjectMethod(codec->jcodec, codec->getOutputBuffer, (jint) idx); - if (jbuf != NULL){ - buf = (uint8_t *) env->GetDirectBufferAddress(jbuf); - capacity = env->GetDirectBufferCapacity(jbuf); - *out_size = (size_t) capacity; - env->DeleteLocalRef(jbuf); - } else { - LOGP(ERROR, "getOutputBuffer() failed !"); - env->ExceptionClear(); - } - handle_java_exception(); - return buf; -} - -ssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec *codec, int64_t timeoutUs) { - JNIEnv *env = ms_get_jni_env(); - jint jindex = -1; - - jindex = env->CallIntMethod(codec->jcodec, codec->dequeueInputBuffer, timeoutUs); - - /*return value to notify the exception*/ - /*otherwise, if -1 is returned as index, it just means that no buffer are available at this time (not an error)*/ - return (handle_java_exception() == -1) ? AMEDIA_ERROR_UNKNOWN : (ssize_t) jindex; -} - -media_status_t AMediaCodec_queueInputBuffer(AMediaCodec *codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags) { - JNIEnv *env = ms_get_jni_env(); - - env->CallVoidMethod(codec->jcodec, codec->queueInputBuffer, idx, offset, size, time, flags); - - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -ssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec *codec, AMediaCodecBufferInfo *info, int64_t timeoutUs) { - JNIEnv *env = ms_get_jni_env(); - jint jindex = -1; - jobject jinfo = NULL; - jclass mediaBufferInfoClass; - - /* We can't stock jclass information due to JNIEnv difference between different threads */ - if(!_loadClass(env, "android/media/MediaCodec$BufferInfo", &mediaBufferInfoClass)) { - LOGP(ERROR, "%s(): one class could not be found", __FUNCTION__); - env->ExceptionClear(); - return AMEDIA_ERROR_UNKNOWN; - } - - jinfo = env->NewObject(mediaBufferInfoClass, codec->_init_mediaBufferInfoClass); - - jindex = env->CallIntMethod(codec->jcodec, codec->dequeueOutputBuffer , jinfo, timeoutUs); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - LOGP(ERROR, "Exception"); - jindex = AMEDIA_ERROR_UNKNOWN; /*return value to notify the exception*/ - /*otherwise, if -1 is returned as index, it just means that no buffer are available at this time (not an error)*/ - } - - if (jindex >= 0) { - info->size = env->GetIntField(jinfo, codec->size); - info->offset = env->GetIntField(jinfo, codec->offset); - info->flags = env->GetIntField(jinfo, codec->flags); - } - - env->DeleteLocalRef(mediaBufferInfoClass); - env->DeleteLocalRef(jinfo); - return (ssize_t) jindex; -} - -AMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec *codec) { - AMediaFormat *format = AMediaFormat_new(); - JNIEnv *env = ms_get_jni_env(); - jobject jformat = NULL; - - jformat = env->CallObjectMethod(codec->jcodec, codec->getOutputFormat); - handle_java_exception(); - if (!jformat) { - LOGP(ERROR, "Failed to create format !"); - return NULL; - } - - format->jformat = env->NewGlobalRef(jformat); - env->DeleteLocalRef(jformat); - return format; -} - -media_status_t AMediaCodec_releaseOutputBuffer(AMediaCodec *codec, size_t idx, bool render) { - JNIEnv *env = ms_get_jni_env(); - env->CallVoidMethod(codec->jcodec, codec->releaseOutputBuffer, (int)idx, FALSE); - return (handle_java_exception() == -1) ? AMEDIA_ERROR_BASE : AMEDIA_OK; -} - -void AMediaCodec_reset(AMediaCodec *codec) { - JNIEnv *env = ms_get_jni_env(); - env->CallVoidMethod(codec->jcodec, codec->reset); - handle_java_exception(); -} - -void AMediaCodec_setParams(AMediaCodec *codec, const char *params) { - JNIEnv *env = ms_get_jni_env(); - jobject jbundle = NULL; - jclass BundleClass = NULL; - - /* We can't stock jclass information due to JNIEnv difference between different threads */ - if (!_loadClass(env, "android/os/Bundle", &BundleClass)) { - LOGP(ERROR, "%s(): one class could not be found", __FUNCTION__); - handle_java_exception(); - return; - } - - jstring msg = env->NewStringUTF(params); - jbundle = env->NewObject(BundleClass, codec->_init_BundleClass); - env->CallVoidMethod(jbundle, codec->putIntId, msg, 0); - handle_java_exception(); - env->DeleteLocalRef(msg); - - env->CallVoidMethod(codec->jcodec, codec->setParameters, jbundle); - handle_java_exception(); - env->DeleteLocalRef(jbundle); - env->DeleteLocalRef(BundleClass); -} - -static bool _getImage(JNIEnv *env, AMediaCodec *codec, const bool isInput, int index, AMediaImage *image) { - jobject jimage = NULL, jrect = NULL; - jobjectArray jplanes = NULL; - int bottom, left, right, top; - bool success = TRUE; - - jimage = (isInput) ? - env->CallObjectMethod(codec->jcodec, codec->getInputImageMethod, index): - env->CallObjectMethod(codec->jcodec, codec->getOutputImageMethod, index); - - if(handle_java_exception() == -1 || jimage == NULL) { - LOGP(ERROR, "%s(): could not get the %s image with index [%d]", __FUNCTION__, (isInput) ? "input" : "output", index); - success = FALSE; - goto end; - } - - image->format = env->CallIntMethod(jimage, codec->getFormatMethod); - image->width = env->CallIntMethod(jimage, codec->getWidthMethod); - image->height = env->CallIntMethod(jimage, codec->getHeightMethod); - image->timestamp = env->CallLongMethod(jimage, codec->getTimestrampMethod); - - jrect = env->CallObjectMethod(jimage, codec->getCropRectMethod); - if(jrect == NULL) { - LOGP(ERROR, "%s: could not get crop rectangle", __FUNCTION__); - success = FALSE; - goto end; - } - bottom = env->GetIntField(jrect, codec->bottomField); - left = env->GetIntField(jrect, codec->leftField); - right = env->GetIntField(jrect, codec->rightField); - top = env->GetIntField(jrect, codec->topField); - image->crop_rect.x = left; - image->crop_rect.y = top; - image->crop_rect.w = right - left; - image->crop_rect.h = bottom - top; - - jplanes = reinterpret_cast<jobjectArray>(env->CallObjectMethod(jimage, codec->getPlanesMethod)); - image->nplanes = env->GetArrayLength(jplanes); - for(int i=0; i<image->nplanes; i++) { - jobject jplane = env->GetObjectArrayElement(jplanes, i); - image->pixel_strides[i] = env->CallIntMethod(jplane, codec->getPixelStrideMethod); - if(env->ExceptionCheck()) { - image->pixel_strides[i] = -1; - env->ExceptionClear(); - } - image->row_strides[i] = env->CallIntMethod(jplane, codec->getRowStrideMethod); - if(env->ExceptionCheck()) { - image->row_strides[i] = -1; - env->ExceptionClear(); - } - jobject jbuffer = env->CallObjectMethod(jplane, codec->getBufferMethod); - image->buffers[i] = (uint8_t *)env->GetDirectBufferAddress(jbuffer); - env->DeleteLocalRef(jbuffer); - env->DeleteLocalRef(jplane); - } - - image->priv_ptr = env->NewGlobalRef(jimage); - -end: - if (jimage) env->DeleteLocalRef(jimage); - if (jplanes) env->DeleteLocalRef(jplanes); - if (jrect) env->DeleteLocalRef(jrect); - return success; -} - -bool AMediaCodec_getInputImage(AMediaCodec * codec, int index, AMediaImage *image) { - JNIEnv *env = ms_get_jni_env(); - return _getImage(env, codec, TRUE, index, image); -} - -bool AMediaCodec_getOutputImage(AMediaCodec *codec, int index, AMediaImage *image) { - JNIEnv *env = ms_get_jni_env(); - return _getImage(env, codec, FALSE, index, image); -} - -void AMediaImage_close(AMediaImage *image) { - jclass imageClass = NULL; - jmethodID close; - bool_t success = TRUE; - - JNIEnv *env = ms_get_jni_env(); - jobject jimage = (jobject)image->priv_ptr; - - success = success && _loadClass(env, "android/media/Image", &imageClass); - success = success && _getMethodID(env, imageClass, "close", "()V", &close); - if (!success) { - LOGP(ERROR, "%s: could not load some class or method ID", __FUNCTION__); - } - if (imageClass) { - env->CallVoidMethod(jimage, close); - env->DeleteLocalRef(imageClass); - } - env->DeleteGlobalRef(jimage); - image->priv_ptr = NULL; -} - -bool_t AMediaImage_isAvailable(void) { - return ms_get_android_sdk_version() >= 22; -} - - -//////////////////////////////////////////////////// -// // -// MEDIA FORMAT // -// // -//////////////////////////////////////////////////// - -bool AMediaFormat_loadMethodID(AMediaFormat * format) { - JNIEnv *env = ms_get_jni_env(); - jclass mediaFormatClass = NULL; - jobject jformat = NULL; - jmethodID createID = NULL; - jstring msg = NULL; - bool success = true; - - success &= _loadClass(env, "android/media/MediaFormat", &mediaFormatClass); - if(!success) { - LOGP(ERROR, "%s(): one class could not be found", __FUNCTION__); - goto error; - } - - success &= _getStaticMethodID(env, mediaFormatClass, "createVideoFormat", "(Ljava/lang/String;II)Landroid/media/MediaFormat;", &createID); - success &= _getMethodID(env, mediaFormatClass, "setInteger", "(Ljava/lang/String;I)V", &(format->setInteger)); - success &= _getMethodID(env, mediaFormatClass, "getInteger", "(Ljava/lang/String;)I", &(format->getInteger)); - success &= _getMethodID(env, mediaFormatClass, "setString", "(Ljava/lang/String;Ljava/lang/String;)V", &(format->setString)); - if(!success) { - LOGP(ERROR, "%s(): one method or field could not be found", __FUNCTION__); - goto error; - } - - msg = env->NewStringUTF("video/avc"); - jformat = env->CallStaticObjectMethod(mediaFormatClass, createID, msg, 240, 320); - if (!jformat) { - LOGP(ERROR, "Failed to create format !"); - goto error; - } - - format->jformat = env->NewGlobalRef(jformat); - env->DeleteLocalRef(jformat); - env->DeleteLocalRef(mediaFormatClass); - env->DeleteLocalRef(msg); - return true; - - error: - if (mediaFormatClass) env->DeleteLocalRef(mediaFormatClass); - if (jformat) env->DeleteLocalRef(jformat); - if (msg) env->DeleteLocalRef(msg); - return false; -} - -//STUB -AMediaFormat *AMediaFormat_new(void) { - AMediaFormat *format = ms_new0(AMediaFormat, 1); - - if (!AMediaFormat_loadMethodID(format)) { - ms_free(format); - format = NULL; - } - return format; -} - -media_status_t AMediaFormat_delete(AMediaFormat* format) { - JNIEnv *env = ms_get_jni_env(); - - env->DeleteGlobalRef(format->jformat); - ms_free(format); - - return AMEDIA_OK; -} - -bool AMediaFormat_getInt32(AMediaFormat *format, const char *name, int32_t *out){ - JNIEnv *env = ms_get_jni_env(); - - if (!format) { - LOGP(ERROR, "Format nul"); - return false; - } - - jstring jkey = env->NewStringUTF(name); - jint jout = env->CallIntMethod(format->jformat, format->getInteger, jkey); - *out = jout; - env->DeleteLocalRef(jkey); - handle_java_exception(); - - return true; -} - -void AMediaFormat_setInt32(AMediaFormat *format, const char* name, int32_t value) { - JNIEnv *env = ms_get_jni_env(); - jstring jkey = env->NewStringUTF(name); - env->CallVoidMethod(format->jformat, format->setInteger, jkey, value); - env->DeleteLocalRef(jkey); - handle_java_exception(); -} - -void AMediaFormat_setString(AMediaFormat *format, const char* key, const char* name) { - JNIEnv *env = ms_get_jni_env(); - - jstring jkey = env->NewStringUTF(key); - jstring jvalue = env->NewStringUTF(name); - env->CallVoidMethod(format->jformat, format->setString, jkey, jvalue); - env->DeleteLocalRef(jkey); - env->DeleteLocalRef(jvalue); - handle_java_exception(); -} - -const char* AMediaFormat_toString(AMediaFormat*) -{ - return ""; -} diff --git a/RtspFace/mediastreamer2/src/android/android_mediacodec.h b/RtspFace/mediastreamer2/src/android/android_mediacodec.h deleted file mode 100644 index 7308dc1..0000000 --- a/RtspFace/mediastreamer2/src/android/android_mediacodec.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -mediastreamer2 android_mediacodec.h -Copyright (C) 2015 Belledonne Communications SARL - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#define MEDIASTREAMER2_ANDROID_MEDIACODEC - -typedef bool bool_t; - -//#include "mediastreamer2/mscommon.h" -//#include "mediastreamer2/msvideo.h" -typedef struct MSRect{ - int x,y,w,h; -} MSRect; - -#include <media/NdkMediaCodec.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - int format; - int width; - int height; - MSRect crop_rect; - uint64_t timestamp; - int nplanes; - int row_strides[4]; - int pixel_strides[4]; - uint8_t *buffers[4]; - void *priv_ptr; -} AMediaImage; - -void AMediaCodec_reset(AMediaCodec *codec); -void AMediaCodec_setParams(AMediaCodec *codec, const char *params); -bool AMediaCodec_getInputImage(AMediaCodec *codec, int index, AMediaImage *image); -bool AMediaCodec_getOutputImage(AMediaCodec *codec, int index, AMediaImage *image); -void AMediaImage_close(AMediaImage *image); -bool_t AMediaImage_isAvailable(void); - -const char* AMediaFormat_toString(AMediaFormat*); - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaCodec.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaCodec.h deleted file mode 100644 index c07f4c9..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaCodec.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_CODEC_H -#define _NDK_MEDIA_CODEC_H - -#include <android/native_window.h> - -#include "NdkMediaCrypto.h" -#include "NdkMediaError.h" -#include "NdkMediaFormat.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -struct AMediaCodec; -typedef struct AMediaCodec AMediaCodec; - -struct AMediaCodecBufferInfo { - int32_t offset; - int32_t size; - int64_t presentationTimeUs; - uint32_t flags; -}; -typedef struct AMediaCodecBufferInfo AMediaCodecBufferInfo; -typedef struct AMediaCodecCryptoInfo AMediaCodecCryptoInfo; - -enum { - AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM = 4, - AMEDIACODEC_CONFIGURE_FLAG_ENCODE = 1, - AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED = -3, - AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED = -2, - AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1 -}; - -/** - * Create codec by name. Use this if you know the exact codec you want to use. - * When configuring, you will need to specify whether to use the codec as an - * encoder or decoder. - */ -AMediaCodec* AMediaCodec_createCodecByName(const char *name); - -/** - * Create codec by mime type. Most applications will use this, specifying a - * mime type obtained from media extractor. - */ -AMediaCodec* AMediaCodec_createDecoderByType(const char *mime_type); - -/** - * Create encoder by name. - */ -AMediaCodec* AMediaCodec_createEncoderByType(const char *mime_type); - -/** - * delete the codec and free its resources - */ -media_status_t AMediaCodec_delete(AMediaCodec*); - -/** - * Configure the codec. For decoding you would typically get the format from an extractor. - */ -media_status_t AMediaCodec_configure( - AMediaCodec*, - const AMediaFormat* format, - ANativeWindow* surface, - AMediaCrypto *crypto, - uint32_t flags); - -/** - * Start the codec. A codec must be configured before it can be started, and must be started - * before buffers can be sent to it. - */ -media_status_t AMediaCodec_start(AMediaCodec*); - -/** - * Stop the codec. - */ -media_status_t AMediaCodec_stop(AMediaCodec*); - -/* - * Flush the codec's input and output. All indices previously returned from calls to - * AMediaCodec_dequeueInputBuffer and AMediaCodec_dequeueOutputBuffer become invalid. - */ -media_status_t AMediaCodec_flush(AMediaCodec*); - -/** - * Get an input buffer. The specified buffer index must have been previously obtained from - * dequeueInputBuffer, and not yet queued. - */ -uint8_t* AMediaCodec_getInputBuffer(AMediaCodec*, size_t idx, size_t *out_size); - -/** - * Get an output buffer. The specified buffer index must have been previously obtained from - * dequeueOutputBuffer, and not yet queued. - */ -uint8_t* AMediaCodec_getOutputBuffer(AMediaCodec*, size_t idx, size_t *out_size); - -/** - * Get the index of the next available input buffer. An app will typically use this with - * getInputBuffer() to get a pointer to the buffer, then copy the data to be encoded or decoded - * into the buffer before passing it to the codec. - */ -ssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs); - -/** - * Send the specified buffer to the codec for processing. - */ -media_status_t AMediaCodec_queueInputBuffer(AMediaCodec*, - size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags); - -/** - * Send the specified buffer to the codec for processing. - */ -media_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*, - size_t idx, off_t offset, AMediaCodecCryptoInfo*, uint64_t time, uint32_t flags); - -/** - * Get the index of the next available buffer of processed data. - */ -ssize_t AMediaCodec_dequeueOutputBuffer(AMediaCodec*, AMediaCodecBufferInfo *info, int64_t timeoutUs); -AMediaFormat* AMediaCodec_getOutputFormat(AMediaCodec*); - -/** - * If you are done with a buffer, use this call to return the buffer to - * the codec. If you previously specified a surface when configuring this - * video decoder you can optionally render the buffer. - */ -media_status_t AMediaCodec_releaseOutputBuffer(AMediaCodec*, size_t idx, bool render); - -/** - * If you are done with a buffer, use this call to update its surface timestamp - * and return it to the codec to render it on the output surface. If you - * have not specified an output surface when configuring this video codec, - * this call will simply return the buffer to the codec. - * - * For more details, see the Java documentation for MediaCodec.releaseOutputBuffer. - */ -media_status_t AMediaCodec_releaseOutputBufferAtTime( - AMediaCodec *mData, size_t idx, int64_t timestampNs); - - -typedef enum { - AMEDIACODECRYPTOINFO_MODE_CLEAR = 0, - AMEDIACODECRYPTOINFO_MODE_AES_CTR = 1 -} cryptoinfo_mode_t; - -/** - * Create an AMediaCodecCryptoInfo from scratch. Use this if you need to use custom - * crypto info, rather than one obtained from AMediaExtractor. - * - * AMediaCodecCryptoInfo describes the structure of an (at least - * partially) encrypted input sample. - * A buffer's data is considered to be partitioned into "subsamples", - * each subsample starts with a (potentially empty) run of plain, - * unencrypted bytes followed by a (also potentially empty) run of - * encrypted bytes. - * numBytesOfClearData can be null to indicate that all data is encrypted. - * This information encapsulates per-sample metadata as outlined in - * ISO/IEC FDIS 23001-7:2011 "Common encryption in ISO base media file format files". - */ -AMediaCodecCryptoInfo *AMediaCodecCryptoInfo_new( - int numsubsamples, - uint8_t key[16], - uint8_t iv[16], - cryptoinfo_mode_t mode, - size_t *clearbytes, - size_t *encryptedbytes); - -/** - * delete an AMediaCodecCryptoInfo created previously with AMediaCodecCryptoInfo_new, or - * obtained from AMediaExtractor - */ -media_status_t AMediaCodecCryptoInfo_delete(AMediaCodecCryptoInfo*); - -/** - * The number of subsamples that make up the buffer's contents. - */ -size_t AMediaCodecCryptoInfo_getNumSubSamples(AMediaCodecCryptoInfo*); - -/** - * A 16-byte opaque key - */ -media_status_t AMediaCodecCryptoInfo_getKey(AMediaCodecCryptoInfo*, uint8_t *dst); - -/** - * A 16-byte initialization vector - */ -media_status_t AMediaCodecCryptoInfo_getIV(AMediaCodecCryptoInfo*, uint8_t *dst); - -/** - * The type of encryption that has been applied, - * one of AMEDIACODECRYPTOINFO_MODE_CLEAR or AMEDIACODECRYPTOINFO_MODE_AES_CTR. - */ -cryptoinfo_mode_t AMediaCodecCryptoInfo_getMode(AMediaCodecCryptoInfo*); - -/** - * The number of leading unencrypted bytes in each subsample. - */ -media_status_t AMediaCodecCryptoInfo_getClearBytes(AMediaCodecCryptoInfo*, size_t *dst); - -/** - * The number of trailing encrypted bytes in each subsample. - */ -media_status_t AMediaCodecCryptoInfo_getEncryptedBytes(AMediaCodecCryptoInfo*, size_t *dst); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif //_NDK_MEDIA_CODEC_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaCrypto.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaCrypto.h deleted file mode 100644 index 90374c5..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaCrypto.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_CRYPTO_H -#define _NDK_MEDIA_CRYPTO_H - -#include <sys/types.h> -#include <stdbool.h> - -#ifdef __cplusplus -extern "C" { -#endif - -struct AMediaCrypto; -typedef struct AMediaCrypto AMediaCrypto; - -typedef uint8_t AMediaUUID[16]; - -bool AMediaCrypto_isCryptoSchemeSupported(const AMediaUUID uuid); - -bool AMediaCrypto_requiresSecureDecoderComponent(const char *mime); - -AMediaCrypto* AMediaCrypto_new(const AMediaUUID uuid, const void *initData, size_t initDataSize); - -void AMediaCrypto_delete(AMediaCrypto* crypto); - - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _NDK_MEDIA_CRYPTO_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaDrm.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaDrm.h deleted file mode 100644 index 10afdd9..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaDrm.h +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_DRM_H -#define _NDK_MEDIA_DRM_H - -#include "NdkMediaError.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <stdbool.h> - -struct AMediaDrm; -typedef struct AMediaDrm AMediaDrm; - -typedef struct { - const uint8_t *ptr; - size_t length; -} AMediaDrmByteArray; - -typedef AMediaDrmByteArray AMediaDrmSessionId; -typedef AMediaDrmByteArray AMediaDrmScope; -typedef AMediaDrmByteArray AMediaDrmKeySetId; -typedef AMediaDrmByteArray AMediaDrmSecureStop; - - -typedef enum AMediaDrmEventType { - /** - * This event type indicates that the app needs to request a certificate from - * the provisioning server. The request message data is obtained using - * AMediaDrm_getProvisionRequest. - */ - EVENT_PROVISION_REQUIRED = 1, - - /** - * This event type indicates that the app needs to request keys from a license - * server. The request message data is obtained using AMediaDrm_getKeyRequest. - */ - EVENT_KEY_REQUIRED = 2, - - /** - * This event type indicates that the licensed usage duration for keys in a session - * has expired. The keys are no longer valid. - */ - EVENT_KEY_EXPIRED = 3, - - /** - * This event may indicate some specific vendor-defined condition, see your - * DRM provider documentation for details - */ - EVENT_VENDOR_DEFINED = 4 -} AMediaDrmEventType; - -typedef void (*AMediaDrmEventListener)(AMediaDrm *, const AMediaDrmSessionId *sessionId, - AMediaDrmEventType eventType, int extra, const uint8_t *data, size_t dataSize); - - -/** - * Query if the given scheme identified by its UUID is supported on this device, and - * whether the drm plugin is able to handle the media container format specified by mimeType. - * - * uuid identifies the universal unique ID of the crypto scheme. uuid must be 16 bytes. - * mimeType is the MIME type of the media container, e.g. "video/mp4". If mimeType - * is not known or required, it can be provided as NULL. - */ -bool AMediaDrm_isCryptoSchemeSupported(const uint8_t *uuid, const char *mimeType); - -/** - * Create a MediaDrm instance from a UUID - * uuid identifies the universal unique ID of the crypto scheme. uuid must be 16 bytes. - */ -AMediaDrm* AMediaDrm_createByUUID(const uint8_t *uuid); - -/** - * Release a MediaDrm object - */ -void AMediaDrm_release(AMediaDrm *); - -/** - * Register a callback to be invoked when an event occurs - * - * listener is the callback that will be invoked on event - */ -media_status_t AMediaDrm_setOnEventListener(AMediaDrm *, AMediaDrmEventListener listener); - -/** - * Open a new session with the MediaDrm object. A session ID is returned. - * - * returns MEDIADRM_NOT_PROVISIONED_ERROR if provisioning is needed - * returns MEDIADRM_RESOURCE_BUSY_ERROR if required resources are in use - */ -media_status_t AMediaDrm_openSession(AMediaDrm *, AMediaDrmSessionId *sessionId); - -/** - * Close a session on the MediaDrm object that was previously opened - * with AMediaDrm_openSession. - */ -media_status_t AMediaDrm_closeSession(AMediaDrm *, const AMediaDrmSessionId *sessionId); - -typedef enum AMediaDrmKeyType { - /** - * This key request type species that the keys will be for online use, they will - * not be saved to the device for subsequent use when the device is not connected - * to a network. - */ - KEY_TYPE_STREAMING = 1, - - /** - * This key request type specifies that the keys will be for offline use, they - * will be saved to the device for use when the device is not connected to a network. - */ - KEY_TYPE_OFFLINE = 2, - - /** - * This key request type specifies that previously saved offline keys should be released. - */ - KEY_TYPE_RELEASE = 3 -} AMediaDrmKeyType; - -/** - * Data type containing {key, value} pair - */ -typedef struct AMediaDrmKeyValuePair { - const char *mKey; - const char *mValue; -} AMediaDrmKeyValue; - -/** - * A key request/response exchange occurs between the app and a license server - * to obtain or release keys used to decrypt encrypted content. - * AMediaDrm_getKeyRequest is used to obtain an opaque key request byte array that - * is delivered to the license server. The opaque key request byte array is - * returned in KeyRequest.data. The recommended URL to deliver the key request to - * is returned in KeyRequest.defaultUrl. - * - * After the app has received the key request response from the server, - * it should deliver to the response to the DRM engine plugin using the method - * AMediaDrm_provideKeyResponse. - * - * scope may be a sessionId or a keySetId, depending on the specified keyType. - * When the keyType is KEY_TYPE_STREAMING or KEY_TYPE_OFFLINE, scope should be set - * to the sessionId the keys will be provided to. When the keyType is - * KEY_TYPE_RELEASE, scope should be set to the keySetId of the keys being released. - * Releasing keys from a device invalidates them for all sessions. - * - * init container-specific data, its meaning is interpreted based on the mime type - * provided in the mimeType parameter. It could contain, for example, the content - * ID, key ID or other data obtained from the content metadata that is required in - * generating the key request. init may be null when keyType is KEY_TYPE_RELEASE. - * - * initSize is the number of bytes of initData - * - * mimeType identifies the mime type of the content. - * - * keyType specifes the type of the request. The request may be to acquire keys for - * streaming or offline content, or to release previously acquired keys, which are - * identified by a keySetId. - * - * optionalParameters are included in the key request message to allow a client - * application to provide additional message parameters to the server. - * - * numOptionalParameters indicates the number of optional parameters provided - * by the caller - * - * On exit: - * 1. The keyRequest pointer will reference the opaque key request data. It - * will reside in memory owned by the AMediaDrm object, and will remain - * accessible until the next call to AMediaDrm_getKeyRequest or until the - * MediaDrm object is released. - * 2. keyRequestSize will be set to the size of the request - * - * returns MEDIADRM_NOT_PROVISIONED_ERROR if reprovisioning is needed, due to a - * problem with the device certificate. -*/ -media_status_t AMediaDrm_getKeyRequest(AMediaDrm *, const AMediaDrmScope *scope, - const uint8_t *init, size_t initSize, const char *mimeType, AMediaDrmKeyType keyType, - const AMediaDrmKeyValue *optionalParameters, size_t numOptionalParameters, - const uint8_t **keyRequest, size_t *keyRequestSize); - -/** - * A key response is received from the license server by the app, then it is - * provided to the DRM engine plugin using provideKeyResponse. When the - * response is for an offline key request, a keySetId is returned that can be - * used to later restore the keys to a new session with AMediaDrm_restoreKeys. - * When the response is for a streaming or release request, a null keySetId is - * returned. - * - * scope may be a sessionId or keySetId depending on the type of the - * response. Scope should be set to the sessionId when the response is for either - * streaming or offline key requests. Scope should be set to the keySetId when - * the response is for a release request. - * - * response points to the opaque response from the server - * responseSize should be set to the size of the response in bytes - */ - -media_status_t AMediaDrm_provideKeyResponse(AMediaDrm *, const AMediaDrmScope *scope, - const uint8_t *response, size_t responseSize, AMediaDrmKeySetId *keySetId); - -/** - * Restore persisted offline keys into a new session. keySetId identifies the - * keys to load, obtained from a prior call to AMediaDrm_provideKeyResponse. - * - * sessionId is the session ID for the DRM session - * keySetId identifies the saved key set to restore - */ -media_status_t AMediaDrm_restoreKeys(AMediaDrm *, const AMediaDrmSessionId *sessionId, - const AMediaDrmKeySetId *keySetId); - -/** - * Remove the current keys from a session. - * - * keySetId identifies keys to remove - */ -media_status_t AMediaDrm_removeKeys(AMediaDrm *, const AMediaDrmSessionId *keySetId); - -/** - * Request an informative description of the key status for the session. The status is - * in the form of {key, value} pairs. Since DRM license policies vary by vendor, - * the specific status field names are determined by each DRM vendor. Refer to your - * DRM provider documentation for definitions of the field names for a particular - * DRM engine plugin. - * - * On entry, numPairs should be set by the caller to the maximum number of pairs - * that can be returned (the size of the array). On exit, numPairs will be set - * to the number of entries written to the array. If the number of {key, value} pairs - * to be returned is greater than *numPairs, MEDIADRM_SHORT_BUFFER will be returned - * and numPairs will be set to the number of pairs available. - */ -media_status_t AMediaDrm_queryKeyStatus(AMediaDrm *, const AMediaDrmSessionId *sessionId, - AMediaDrmKeyValue *keyValuePairs, size_t *numPairs); - - -/** - * A provision request/response exchange occurs between the app and a provisioning - * server to retrieve a device certificate. If provisionining is required, the - * EVENT_PROVISION_REQUIRED event will be sent to the event handler. - * getProvisionRequest is used to obtain the opaque provision request byte array that - * should be delivered to the provisioning server. - * On exit: - * 1. The provision request data will be referenced by provisionRequest, in - * memory owned by the AMediaDrm object. It will remain accessible until the - * next call to getProvisionRequest. - * 2. provisionRequestSize will be set to the size of the request data. - * 3. serverUrl will reference a NULL terminated string containing the URL - * the provisioning request should be sent to. It will remain accessible until - * the next call to getProvisionRequest. - */ -media_status_t AMediaDrm_getProvisionRequest(AMediaDrm *, const uint8_t **provisionRequest, - size_t *provisionRequestSize, const char **serverUrl); - - -/** - * After a provision response is received by the app, it is provided to the DRM - * engine plugin using this method. - * - * response is the opaque provisioning response byte array to provide to the - * DRM engine plugin. - * responseSize is the length of the provisioning response in bytes. - * - * returns MEDIADRM_DEVICE_REVOKED_ERROR if the response indicates that the - * server rejected the request - */ -media_status_t AMediaDrm_provideProvisionResponse(AMediaDrm *, - const uint8_t *response, size_t responseSize); - - -/** - * A means of enforcing limits on the number of concurrent streams per subscriber - * across devices is provided via SecureStop. This is achieved by securely - * monitoring the lifetime of sessions. - * - * Information from the server related to the current playback session is written - * to persistent storage on the device when each MediaCrypto object is created. - * - * In the normal case, playback will be completed, the session destroyed and the - * Secure Stops will be queried. The app queries secure stops and forwards the - * secure stop message to the server which verifies the signature and notifies the - * server side database that the session destruction has been confirmed. The persisted - * record on the client is only removed after positive confirmation that the server - * received the message using releaseSecureStops(). - * - * numSecureStops is set by the caller to the maximum number of secure stops to - * return. On exit, *numSecureStops will be set to the number actually returned. - * If *numSecureStops is too small for the number of secure stops available, - * MEDIADRM_SHORT_BUFFER will be returned and *numSecureStops will be set to the - * number required. - */ -media_status_t AMediaDrm_getSecureStops(AMediaDrm *, - AMediaDrmSecureStop *secureStops, size_t *numSecureStops); - -/** - * Process the SecureStop server response message ssRelease. After authenticating - * the message, remove the SecureStops identified in the response. - * - * ssRelease is the server response indicating which secure stops to release - */ -media_status_t AMediaDrm_releaseSecureStops(AMediaDrm *, - const AMediaDrmSecureStop *ssRelease); - -/** - * String property name: identifies the maker of the DRM engine plugin - */ -const char *PROPERTY_VENDOR = "vendor"; - -/** - * String property name: identifies the version of the DRM engine plugin - */ -const char *PROPERTY_VERSION = "version"; - -/** - * String property name: describes the DRM engine plugin - */ -const char *PROPERTY_DESCRIPTION = "description"; - -/** - * String property name: a comma-separated list of cipher and mac algorithms - * supported by CryptoSession. The list may be empty if the DRM engine - * plugin does not support CryptoSession operations. - */ -const char *PROPERTY_ALGORITHMS = "algorithms"; - -/** - * Read a DRM engine plugin String property value, given the property name string. - * - * propertyName identifies the property to query - * On return, propertyValue will be set to point to the property value. The - * memory that the value resides in is owned by the NDK MediaDrm API and - * will remain valid until the next call to AMediaDrm_getPropertyString. - */ -media_status_t AMediaDrm_getPropertyString(AMediaDrm *, const char *propertyName, - const char **propertyValue); - -/** - * Byte array property name: the device unique identifier is established during - * device provisioning and provides a means of uniquely identifying each device. - */ -const char *PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId"; - -/** - * Read a DRM engine plugin byte array property value, given the property name string. - * On return, *propertyValue will be set to point to the property value. The - * memory that the value resides in is owned by the NDK MediaDrm API and - * will remain valid until the next call to AMediaDrm_getPropertyByteArray. - */ -media_status_t AMediaDrm_getPropertyByteArray(AMediaDrm *, const char *propertyName, - AMediaDrmByteArray *propertyValue); - -/** - * Set a DRM engine plugin String property value. - */ -media_status_t AMediaDrm_setPropertyString(AMediaDrm *, const char *propertyName, - const char *value); - -/** - * Set a DRM engine plugin byte array property value. - */ -media_status_t AMediaDrm_setPropertyByteArray(AMediaDrm *, const char *propertyName, - const uint8_t *value, size_t valueSize); - -/** - * In addition to supporting decryption of DASH Common Encrypted Media, the - * MediaDrm APIs provide the ability to securely deliver session keys from - * an operator's session key server to a client device, based on the factory-installed - * root of trust, and then perform encrypt, decrypt, sign and verify operations - * with the session key on arbitrary user data. - * - * Operators create session key servers that receive session key requests and provide - * encrypted session keys which can be used for general purpose crypto operations. - * - * Generic encrypt/decrypt/sign/verify methods are based on the established session - * keys. These keys are exchanged using the getKeyRequest/provideKeyResponse methods. - * - * Applications of this capability include securing various types of purchased or - * private content, such as applications, books and other media, photos or media - * delivery protocols. - */ - -/* - * Encrypt the data referenced by input of length dataSize using algorithm specified - * by cipherAlgorithm, and write the encrypted result into output. The caller must - * ensure that the output buffer is large enough to accept dataSize bytes. The key - * to use is identified by the 16 byte keyId. The key must have been loaded into - * the session using provideKeyResponse. - */ -media_status_t AMediaDrm_encrypt(AMediaDrm *, const AMediaDrmSessionId *sessionId, - const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv, - const uint8_t *input, uint8_t *output, size_t dataSize); - -/* - * Decrypt the data referenced by input of length dataSize using algorithm specified - * by cipherAlgorithm, and write the decrypted result into output. The caller must - * ensure that the output buffer is large enough to accept dataSize bytes. The key - * to use is identified by the 16 byte keyId. The key must have been loaded into - * the session using provideKeyResponse. - */ -media_status_t AMediaDrm_decrypt(AMediaDrm *, const AMediaDrmSessionId *sessionId, - const char *cipherAlgorithm, uint8_t *keyId, uint8_t *iv, - const uint8_t *input, uint8_t *output, size_t dataSize); - -/* - * Generate a signature using the specified macAlgorithm over the message data - * referenced by message of size messageSize and store the signature in the - * buffer referenced signature of max size *signatureSize. If the buffer is not - * large enough to hold the signature, MEDIADRM_SHORT_BUFFER is returned and - * *signatureSize is set to the buffer size required. The key to use is identified - * by the 16 byte keyId. The key must have been loaded into the session using - * provideKeyResponse. - */ -media_status_t AMediaDrm_sign(AMediaDrm *, const AMediaDrmSessionId *sessionId, - const char *macAlgorithm, uint8_t *keyId, uint8_t *message, size_t messageSize, - uint8_t *signature, size_t *signatureSize); - -/* - * Perform a signature verification using the specified macAlgorithm over the message - * data referenced by the message parameter of size messageSize. Returns MEDIADRM_OK - * if the signature matches, otherwise MEDAIDRM_VERIFY_FAILED is returned. The key to - * use is identified by the 16 byte keyId. The key must have been loaded into the - * session using provideKeyResponse. - */ -media_status_t AMediaDrm_verify(AMediaDrm *, const AMediaDrmSessionId *sessionId, - const char *macAlgorithm, uint8_t *keyId, const uint8_t *message, size_t messageSize, - const uint8_t *signature, size_t signatureSize); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif //_NDK_MEDIA_DRM_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaError.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaError.h deleted file mode 100644 index 12613eb..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaError.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_ERROR_H -#define _NDK_MEDIA_ERROR_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - AMEDIA_OK = 0, - - AMEDIA_ERROR_BASE = -10000, - AMEDIA_ERROR_UNKNOWN = AMEDIA_ERROR_BASE, - AMEDIA_ERROR_MALFORMED = AMEDIA_ERROR_BASE - 1, - AMEDIA_ERROR_UNSUPPORTED = AMEDIA_ERROR_BASE - 2, - AMEDIA_ERROR_INVALID_OBJECT = AMEDIA_ERROR_BASE - 3, - AMEDIA_ERROR_INVALID_PARAMETER = AMEDIA_ERROR_BASE - 4, - - AMEDIA_DRM_ERROR_BASE = -20000, - AMEDIA_DRM_NOT_PROVISIONED = AMEDIA_DRM_ERROR_BASE - 1, - AMEDIA_DRM_RESOURCE_BUSY = AMEDIA_DRM_ERROR_BASE - 2, - AMEDIA_DRM_DEVICE_REVOKED = AMEDIA_DRM_ERROR_BASE - 3, - AMEDIA_DRM_SHORT_BUFFER = AMEDIA_DRM_ERROR_BASE - 4, - AMEDIA_DRM_SESSION_NOT_OPENED = AMEDIA_DRM_ERROR_BASE - 5, - AMEDIA_DRM_TAMPER_DETECTED = AMEDIA_DRM_ERROR_BASE - 6, - AMEDIA_DRM_VERIFY_FAILED = AMEDIA_DRM_ERROR_BASE - 7, - AMEDIA_DRM_NEED_KEY = AMEDIA_DRM_ERROR_BASE - 8, - AMEDIA_DRM_LICENSE_EXPIRED = AMEDIA_DRM_ERROR_BASE - 9, - -} media_status_t; - - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _NDK_MEDIA_ERROR_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaExtractor.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaExtractor.h deleted file mode 100644 index 7a4e702..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaExtractor.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_EXTRACTOR_H -#define _NDK_MEDIA_EXTRACTOR_H - -#include <sys/types.h> - -#include "NdkMediaCodec.h" -#include "NdkMediaFormat.h" -#include "NdkMediaCrypto.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct AMediaExtractor; -typedef struct AMediaExtractor AMediaExtractor; - - -/** - * Create new media extractor - */ -AMediaExtractor* AMediaExtractor_new(); - -/** - * Delete a previously created media extractor - */ -media_status_t AMediaExtractor_delete(AMediaExtractor*); - -/** - * Set the file descriptor from which the extractor will read. - */ -media_status_t AMediaExtractor_setDataSourceFd(AMediaExtractor*, int fd, off64_t offset, off64_t length); - -/** - * Set the URI from which the extractor will read. - */ -media_status_t AMediaExtractor_setDataSource(AMediaExtractor*, const char *location); // TODO support headers - -/** - * Return the number of tracks in the previously specified media file - */ -size_t AMediaExtractor_getTrackCount(AMediaExtractor*); - -/** - * Return the format of the specified track. The caller must free the returned format - */ -AMediaFormat* AMediaExtractor_getTrackFormat(AMediaExtractor*, size_t idx); - -/** - * Select the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and - * getSampleTime only retrieve information for the subset of tracks selected. - * Selecting the same track multiple times has no effect, the track is - * only selected once. - */ -media_status_t AMediaExtractor_selectTrack(AMediaExtractor*, size_t idx); - -/** - * Unselect the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and - * getSampleTime only retrieve information for the subset of tracks selected.. - */ -media_status_t AMediaExtractor_unselectTrack(AMediaExtractor*, size_t idx); - -/** - * Read the current sample. - */ -ssize_t AMediaExtractor_readSampleData(AMediaExtractor*, uint8_t *buffer, size_t capacity); - -/** - * Read the current sample's flags. - */ -uint32_t AMediaExtractor_getSampleFlags(AMediaExtractor*); // see definitions below - -/** - * Returns the track index the current sample originates from (or -1 - * if no more samples are available) - */ -int AMediaExtractor_getSampleTrackIndex(AMediaExtractor*); - -/** - * Returns the current sample's presentation time in microseconds. - * or -1 if no more samples are available. - */ -int64_t AMediaExtractor_getSampleTime(AMediaExtractor*); - -/** - * Advance to the next sample. Returns false if no more sample data - * is available (end of stream). - */ -bool AMediaExtractor_advance(AMediaExtractor*); - -typedef enum { - AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC, - AMEDIAEXTRACTOR_SEEK_NEXT_SYNC, - AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC -} SeekMode; - -/** - * - */ -media_status_t AMediaExtractor_seekTo(AMediaExtractor*, int64_t seekPosUs, SeekMode mode); - -/** - * mapping of crypto scheme uuid to the scheme specific data for that scheme - */ -typedef struct PsshEntry { - AMediaUUID uuid; - size_t datalen; - void *data; -} PsshEntry; - -/** - * list of crypto schemes and their data - */ -typedef struct PsshInfo { - size_t numentries; - PsshEntry entries[0]; -} PsshInfo; - -/** - * Get the PSSH info if present. - */ -PsshInfo* AMediaExtractor_getPsshInfo(AMediaExtractor*); - - -AMediaCodecCryptoInfo *AMediaExtractor_getSampleCryptoInfo(AMediaExtractor *); - - -enum { - AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC = 1, - AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED = 2, -}; - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _NDK_MEDIA_EXTRACTOR_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.cpp b/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.cpp deleted file mode 100644 index 794414f..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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 "NdkMediaFormat.h" -#define EXPORT - -EXPORT const char* AMEDIAFORMAT_KEY_AAC_PROFILE = "aac-profile"; -EXPORT const char* AMEDIAFORMAT_KEY_BIT_RATE = "bitrate"; -EXPORT const char* AMEDIAFORMAT_KEY_CHANNEL_COUNT = "channel-count"; -EXPORT const char* AMEDIAFORMAT_KEY_CHANNEL_MASK = "channel-mask"; -EXPORT const char* AMEDIAFORMAT_KEY_COLOR_FORMAT = "color-format"; -EXPORT const char* AMEDIAFORMAT_KEY_DURATION = "durationUs"; -EXPORT const char* AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level"; -EXPORT const char* AMEDIAFORMAT_KEY_FRAME_RATE = "frame-rate"; -EXPORT const char* AMEDIAFORMAT_KEY_HEIGHT = "height"; -EXPORT const char* AMEDIAFORMAT_KEY_IS_ADTS = "is-adts"; -EXPORT const char* AMEDIAFORMAT_KEY_IS_AUTOSELECT = "is-autoselect"; -EXPORT const char* AMEDIAFORMAT_KEY_IS_DEFAULT = "is-default"; -EXPORT const char* AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE = "is-forced-subtitle"; -EXPORT const char* AMEDIAFORMAT_KEY_I_FRAME_INTERVAL = "i-frame-interval"; -EXPORT const char* AMEDIAFORMAT_KEY_LANGUAGE = "language"; -EXPORT const char* AMEDIAFORMAT_KEY_MAX_HEIGHT = "max-height"; -EXPORT const char* AMEDIAFORMAT_KEY_MAX_INPUT_SIZE = "max-input-size"; -EXPORT const char* AMEDIAFORMAT_KEY_MAX_WIDTH = "max-width"; -EXPORT const char* AMEDIAFORMAT_KEY_MIME = "mime"; -EXPORT const char* AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP = "push-blank-buffers-on-shutdown"; -EXPORT const char* AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER = "repeat-previous-frame-after"; -EXPORT const char* AMEDIAFORMAT_KEY_SAMPLE_RATE = "sample-rate"; -EXPORT const char* AMEDIAFORMAT_KEY_WIDTH = "width"; -EXPORT const char* AMEDIAFORMAT_KEY_STRIDE = "stride"; diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.h deleted file mode 100644 index b313dd2..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaFormat.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_FORMAT_H -#define _NDK_MEDIA_FORMAT_H - -#include <sys/types.h> - -#include "NdkMediaError.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct AMediaFormat; -typedef struct AMediaFormat AMediaFormat; - -AMediaFormat *AMediaFormat_new(void); -media_status_t AMediaFormat_delete(AMediaFormat*); - -/** - * Human readable representation of the format. The returned string is owned by the format, - * and remains valid until the next call to toString, or until the format is deleted. - */ -const char* AMediaFormat_toString(AMediaFormat*); - -bool AMediaFormat_getInt32(AMediaFormat*, const char *name, int32_t *out); -bool AMediaFormat_getInt64(AMediaFormat*, const char *name, int64_t *out); -bool AMediaFormat_getFloat(AMediaFormat*, const char *name, float *out); -/** - * The returned data is owned by the format and remains valid as long as the named entry - * is part of the format. - */ -bool AMediaFormat_getBuffer(AMediaFormat*, const char *name, void** data, size_t *size); -/** - * The returned string is owned by the format, and remains valid until the next call to getString, - * or until the format is deleted. - */ -bool AMediaFormat_getString(AMediaFormat*, const char *name, const char **out); - - -void AMediaFormat_setInt32(AMediaFormat*, const char* name, int32_t value); -void AMediaFormat_setInt64(AMediaFormat*, const char* name, int64_t value); -void AMediaFormat_setFloat(AMediaFormat*, const char* name, float value); -/** - * The provided string is copied into the format. - */ -void AMediaFormat_setString(AMediaFormat*, const char* name, const char* value); -/** - * The provided data is copied into the format. - */ -void AMediaFormat_setBuffer(AMediaFormat*, const char* name, void* data, size_t size); - - - -/** - * XXX should these be ints/enums that we look up in a table as needed? - */ -extern const char* AMEDIAFORMAT_KEY_AAC_PROFILE; -extern const char* AMEDIAFORMAT_KEY_BIT_RATE; -extern const char* AMEDIAFORMAT_KEY_CHANNEL_COUNT; -extern const char* AMEDIAFORMAT_KEY_CHANNEL_MASK; -extern const char* AMEDIAFORMAT_KEY_COLOR_FORMAT; -extern const char* AMEDIAFORMAT_KEY_DURATION; -extern const char* AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL; -extern const char* AMEDIAFORMAT_KEY_FRAME_RATE; -extern const char* AMEDIAFORMAT_KEY_HEIGHT; -extern const char* AMEDIAFORMAT_KEY_IS_ADTS; -extern const char* AMEDIAFORMAT_KEY_IS_AUTOSELECT; -extern const char* AMEDIAFORMAT_KEY_IS_DEFAULT; -extern const char* AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE; -extern const char* AMEDIAFORMAT_KEY_I_FRAME_INTERVAL; -extern const char* AMEDIAFORMAT_KEY_LANGUAGE; -extern const char* AMEDIAFORMAT_KEY_MAX_HEIGHT; -extern const char* AMEDIAFORMAT_KEY_MAX_INPUT_SIZE; -extern const char* AMEDIAFORMAT_KEY_MAX_WIDTH; -extern const char* AMEDIAFORMAT_KEY_MIME; -extern const char* AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP; -extern const char* AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER; -extern const char* AMEDIAFORMAT_KEY_SAMPLE_RATE; -extern const char* AMEDIAFORMAT_KEY_WIDTH; -extern const char* AMEDIAFORMAT_KEY_STRIDE; - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _NDK_MEDIA_FORMAT_H diff --git a/RtspFace/mediastreamer2/src/android/media/NdkMediaMuxer.h b/RtspFace/mediastreamer2/src/android/media/NdkMediaMuxer.h deleted file mode 100644 index 90d946c..0000000 --- a/RtspFace/mediastreamer2/src/android/media/NdkMediaMuxer.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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. - */ - - -/* - * This file defines an NDK API. - * Do not remove methods. - * Do not change method signatures. - * Do not change the value of constants. - * Do not change the size of any of the classes defined in here. - * Do not reference types that are not part of the NDK. - * Do not #include files that aren't part of the NDK. - */ - -#ifndef _NDK_MEDIA_MUXER_H -#define _NDK_MEDIA_MUXER_H - -#include <sys/types.h> - -#include "NdkMediaCodec.h" -#include "NdkMediaError.h" -#include "NdkMediaFormat.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct AMediaMuxer; -typedef struct AMediaMuxer AMediaMuxer; - -typedef enum { - AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4 = 0, - AMEDIAMUXER_OUTPUT_FORMAT_WEBM = 1, -} OutputFormat; - -/** - * Create new media muxer - */ -AMediaMuxer* AMediaMuxer_new(int fd, OutputFormat format); - -/** - * Delete a previously created media muxer - */ -media_status_t AMediaMuxer_delete(AMediaMuxer*); - -/** - * Set and store the geodata (latitude and longitude) in the output file. - * This method should be called before AMediaMuxer_start. The geodata is stored - * in udta box if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, and is - * ignored for other output formats. - * The geodata is stored according to ISO-6709 standard. - * - * Both values are specified in degrees. - * Latitude must be in the range [-90, 90]. - * Longitude must be in the range [-180, 180]. - */ -media_status_t AMediaMuxer_setLocation(AMediaMuxer*, float latitude, float longitude); - -/** - * Sets the orientation hint for output video playback. - * This method should be called before AMediaMuxer_start. Calling this - * method will not rotate the video frame when muxer is generating the file, - * but add a composition matrix containing the rotation angle in the output - * video if the output format is AMEDIAMUXER_OUTPUT_FORMAT_MPEG_4, so that a - * video player can choose the proper orientation for playback. - * Note that some video players may choose to ignore the composition matrix - * during playback. - * The angle is specified in degrees, clockwise. - * The supported angles are 0, 90, 180, and 270 degrees. - */ -media_status_t AMediaMuxer_setOrientationHint(AMediaMuxer*, int degrees); - -/** - * Adds a track with the specified format. - * Returns the index of the new track or a negative value in case of failure, - * which can be interpreted as a media_status_t. - */ -ssize_t AMediaMuxer_addTrack(AMediaMuxer*, const AMediaFormat* format); - -/** - * Start the muxer. Should be called after AMediaMuxer_addTrack and - * before AMediaMuxer_writeSampleData. - */ -media_status_t AMediaMuxer_start(AMediaMuxer*); - -/** - * Stops the muxer. - * Once the muxer stops, it can not be restarted. - */ -media_status_t AMediaMuxer_stop(AMediaMuxer*); - -/** - * Writes an encoded sample into the muxer. - * The application needs to make sure that the samples are written into - * the right tracks. Also, it needs to make sure the samples for each track - * are written in chronological order (e.g. in the order they are provided - * by the encoder.) - */ -media_status_t AMediaMuxer_writeSampleData(AMediaMuxer *muxer, - size_t trackIdx, const uint8_t *data, const AMediaCodecBufferInfo *info); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _NDK_MEDIA_MUXER_H diff --git a/RtspFace/mediastreamer2/src/android/media/README.txt b/RtspFace/mediastreamer2/src/android/media/README.txt deleted file mode 100644 index f0030cd..0000000 --- a/RtspFace/mediastreamer2/src/android/media/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -This folder contains files header from android ndk. It's used for compile with older version of android 6 to uses mediacodec functions. - diff --git a/RtspFace/mediastreamer2/src/utils/msjava.c.cpp b/RtspFace/mediastreamer2/src/utils/msjava.c.cpp deleted file mode 100644 index d32ba66..0000000 --- a/RtspFace/mediastreamer2/src/utils/msjava.c.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* -mediastreamer2 library - modular sound and video processing and streaming -Copyright (C) 2010 Belledonne Communications SARL - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "mediastreamer2/msjava.h" -//#include "mediastreamer2/mscommon.h" -#include "../../logger.h" - -static JavaVM *ms2_vm=NULL; - -#ifndef _WIN32 -#include <pthread.h> - -static pthread_key_t jnienv_key; - -/* - * Do not forget that any log within this routine may cause re-attach of the thread to the jvm because the logs can callback the java application - * (see LinphoneCoreFactory.setLogHandler() ). -**/ -void _android_key_cleanup(void *data){ - JNIEnv *env = (JNIEnv*) data; - - if (env != NULL) { - LOGP(INFO, "Thread end, detaching jvm from current thread"); - ms2_vm->DetachCurrentThread(); - pthread_setspecific(jnienv_key,NULL); - } -} -#endif - -void ms_set_jvm_from_env(JNIEnv *env){ - env->GetJavaVM(&ms2_vm); -#ifndef _WIN32 - pthread_key_create(&jnienv_key,_android_key_cleanup); -#endif -} - -void ms_set_jvm(JavaVM *vm){ - ms2_vm=vm; -#ifndef _WIN32 - pthread_key_create(&jnienv_key,_android_key_cleanup); -#endif -} - -JavaVM *ms_get_jvm(void){ - return ms2_vm; -} - -JNIEnv *ms_get_jni_env(void){ - JNIEnv *env=NULL; - if (ms2_vm==NULL){ - LOGP(ERROR, "Calling ms_get_jni_env() while no jvm has been set using ms_set_jvm()."); - }else{ -#ifndef _WIN32 - env=(JNIEnv*)pthread_getspecific(jnienv_key); - if (env==NULL){ - if (ms2_vm->AttachCurrentThread(&env,NULL)!=0){ - LOGP(ERROR, "AttachCurrentThread() failed !"); - return NULL; - } - pthread_setspecific(jnienv_key,env); - } -#else - LOGP(ERROR, "ms_get_jni_env() not implemented on windows."); -#endif - } - return env; -} - -#ifdef __ANDROID__ - -int ms_get_android_sdk_version(void) { - static int sdk_version = 0; - if (sdk_version==0){ - /* Get Android SDK version. */ - JNIEnv *env = ms_get_jni_env(); - jclass version_class = env->FindClass("android/os/Build$VERSION"); - jfieldID fid = env->GetStaticFieldID(version_class, "SDK_INT", "I"); - sdk_version = env->GetStaticIntField(version_class, fid); - LOGP(INFO, "SDK version [%i] detected", sdk_version); - env->DeleteLocalRef(version_class); - } - return sdk_version; -} - -JNIEXPORT void JNICALL Java_org_linphone_mediastream_Log_d(JNIEnv* env, jobject thiz, jstring jmsg) { - const char* msg = jmsg ? env->GetStringUTFChars(jmsg, NULL) : NULL; - LOGP(DEBUG, "%s", msg); - if (msg) env->ReleaseStringUTFChars(jmsg, msg); -} - -JNIEXPORT void JNICALL Java_org_linphone_mediastream_Log_i(JNIEnv* env, jobject thiz, jstring jmsg) { - const char* msg = jmsg ? env->GetStringUTFChars(jmsg, NULL) : NULL; - LOGP(INFO, "%s", msg); - if (msg) env->ReleaseStringUTFChars(jmsg, msg); -} - -JNIEXPORT void JNICALL Java_org_linphone_mediastream_Log_w(JNIEnv* env, jobject thiz, jstring jmsg) { - const char* msg = jmsg ? env->GetStringUTFChars(jmsg, NULL) : NULL; - LOGP(WARNING, "%s", msg); - if (msg) env->ReleaseStringUTFChars(jmsg, msg); -} - -JNIEXPORT void JNICALL Java_org_linphone_mediastream_Log_e(JNIEnv* env, jobject thiz, jstring jmsg) { - const char* msg = jmsg ? env->GetStringUTFChars(jmsg, NULL) : NULL; - LOGP(ERROR, "%s", msg); - if (msg) env->ReleaseStringUTFChars(jmsg, msg); -} - -#endif -- Gitblit v1.8.0