From f29f269d999fc4bb8a9bfa85629f08b89971a2ef Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期二, 03 十二月 2019 16:00:49 +0800
Subject: [PATCH] Merge branch 'master' of ssh://192.168.5.5:29418/valib/goffmpeg
---
csrc/thirdparty/ffmpeg/include/libavutil/avassert.h | 2
csrc/thirdparty/ffmpeg/include/libavfilter/buffersrc.h | 2
csrc/thirdparty/ffmpeg/include/libavformat/avformat.h | 75 +
csrc/thirdparty/ffmpeg/include/libavutil/lzo.h | 66 ++
csrc/thirdparty/gb28181/include/librtsp.h | 114 +-
csrc/thirdparty/ffmpeg/include/libavutil/version.h | 2
csrc/common/gpu/info.cpp | 31 +
CMakeLists.txt | 2
csrc/common/gpu/info.h | 1
csrc/thirdparty/ffmpeg/lib/libavfilter.a | 0
csrc/thirdparty/ffmpeg/include/libavutil/frame.h | 80 ++
csrc/cffmpeg.cpp | 33
csrc/thirdparty/ffmpeg/include/libavutil/file.h | 2
csrc/thirdparty/ffmpeg/include/libavcodec/avcodec.h | 96 +++
csrc/thirdparty/ffmpeg/lib/libx264.a | 0
csrc/thirdparty/ffmpeg/include/libavutil/ffversion.h | 2
gostream.go | 26
cffmpeg.h | 13
csrc/thirdparty/ffmpeg/lib/libavcodec.a | 0
csrc/thirdparty/ffmpeg/include/libavutil/avstring.h | 6
csrc/wrapper.cpp | 152 ----
csrc/thirdparty/ffmpeg/include/libavfilter/buffersink.h | 2
csrc/ffmpeg/bridge/cvbridge.cpp | 12
csrc/thirdparty/ffmpeg/include/libswscale/version.h | 2
csrc/worker/decoder.hpp | 18
csrc/thirdparty/ffmpeg/include/libavutil/encryption_info.h | 9
csrc/thirdparty/ffmpeg/lib/libswscale.a | 0
csrc/thirdparty/ffmpeg/lib/libavutil.a | 0
.gitignore | 1
csrc/thirdparty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h | 343 +++++++++++
csrc/thirdparty/ffmpeg/include/libavutil/threadmessage.h | 8
csrc/ffmpeg/data/PicData.cpp | 2
csrc/thirdparty/ffmpeg/include/libavcodec/mediacodec.h | 13
csrc/thirdparty/gb28181/include/PsToEs.hpp | 2
csrc/ffmpeg/format/FormatIn.cpp | 49
csrc/thirdparty/ffmpeg/include/libavfilter/version.h | 3
csrc/thirdparty/ffmpeg/include/libavutil/intreadwrite.h | 15
csrc/thirdparty/ffmpeg/include/libavcodec/version.h | 5
libcffmpeg.c | 58 -
csrc/thirdparty/ffmpeg/include/libavutil/hwcontext_cuda.h | 1
gorec.go | 5
libcffmpeg.h | 28
csrc/thirdparty/ffmpeg/include/libavformat/version.h | 14
csrc/thirdparty/ffmpeg/lib/libx265.a | 0
goenc.go | 39 +
csrc/thirdparty/ffmpeg/include/libavutil/tx.h | 81 ++
csrc/thirdparty/ffmpeg/include/libavutil/opt.h | 1
csrc/thirdparty/ffmpeg/include/libavutil/mem.h | 26
csrc/thirdparty/ffmpeg/lib/libavformat.a | 0
/dev/null | 36 -
godec.go | 19
csrc/worker/rec.cpp | 16
csrc/worker/decoder.cpp | 125 ++-
csrc/wrapper.hpp | 13
goffmpeg.go | 41 +
csrc/thirdparty/ffmpeg/include/libavformat/avio.h | 6
csrc/thirdparty/ffmpeg/include/libavutil/pixfmt.h | 23
csrc/thirdparty/ffmpeg/include/libavutil/pixdesc.h | 19
58 files changed, 1,247 insertions(+), 493 deletions(-)
diff --git a/.gitignore b/.gitignore
index 8331c37..cd672bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,5 +21,6 @@
*.app
/build
+build*
.idea
.vscode
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6e1e6b5..8ce0fc4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -56,4 +56,4 @@
cuda_add_library(${BIN} SHARED ${FFMPEG_LIST} ${CUDA_LIST})
-target_link_libraries(${BIN} ${LINK_LIB} numa nppig nppicc nppc -lz pthread dl rtspclient StreamParse)
+target_link_libraries(${BIN} ${LINK_LIB} -lz pthread dl rtspclient StreamParse)
diff --git a/cffmpeg.h b/cffmpeg.h
index 687a4d9..4d7d65e 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -20,6 +20,7 @@
char * c_ffmpeg_get_gb28181_pic(const char *rtspUrl, int *retDataLen);
void c_ffmepg_use_cpu(const cffmpeg h);
/////////passive api
+void c_ffmpeg_open_recorder(const cffmpeg h);
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max);
void c_ffmpeg_build_recorder(const cffmpeg h, const char*id, const char *dir, const int64_t fid, int mind, int maxd, int audio);
void c_ffmpeg_fire_recorder(const cffmpeg h, const char*sid, const int64_t id);
@@ -27,21 +28,13 @@
void c_ffmpeg_build_decoder(const cffmpeg h);
void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
+void c_ffmpeg_close_stream(const cffmpeg h);
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key);
-//////decoder
-void* c_ffmpeg_decode(const char *file, const int gb, int *wid, int *hei);
-
// pic encoder
-void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
+void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
void c_ffmpeg_destroy_encoder(void *h);
int c_ffmpeg_encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
-
-// conv cpu
-void *c_ffmpeg_create_conv(const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag);
-void c_ffmpeg_destroy_conv(void *h);
-void *c_ffmpeg_conv(void *h, uint8_t *in);
#ifdef __cplusplus
}
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index 029816d..fc92229 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -62,6 +62,10 @@
//////passive api
+void c_ffmpeg_open_recorder(const cffmpeg h){
+ Wrapper *s = (Wrapper*)h;
+ s->OpenRecorder();
+}
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max){
Wrapper *s = (Wrapper*)h;
s->SetRecMinCacheTime(min);
@@ -104,7 +108,7 @@
void c_ffmpeg_build_decoder(const cffmpeg h){
Wrapper *s = (Wrapper*)h;
- s->BuildDecoder();
+ s->OpenDecoder();
}
void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id){
@@ -114,6 +118,11 @@
return data;
}
+void c_ffmpeg_close_stream(const cffmpeg h){
+ Wrapper *s = (Wrapper*)h;
+ s->CloseStream();
+}
+
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key){
Wrapper *s = (Wrapper*)h;
unsigned char *data = NULL;
@@ -121,14 +130,9 @@
return data;
}
-/////////////////////test
-void* c_ffmpeg_decode(const char *file, const int gb, int *wid, int *hei){
- return Decode(file, gb, wid, hei);
-}
-
// pic encoder
-void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
- return CreateEncoder(w, h, fps, br, scale_flag, gi);
+void *c_ffmpeg_create_encoder(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
+ return CreateEncoder(w, h, fps, br, pix_fmt, scale_flag, gi);
}
void c_ffmpeg_destroy_encoder(void *h){
@@ -137,17 +141,4 @@
int c_ffmpeg_encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key){
return Encode(hdl, in, w, h, out, size, key);
-}
-
-void *c_ffmpeg_create_conv(const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag){
- return CreateConvertor(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flag);
-}
-
-void *c_ffmpeg_conv(void *h, uint8_t *in){
- return Convert(h, in);
-}
-
-void c_ffmpeg_destroy_conv(void *h){
- DestoryConvertor(h);
}
diff --git a/csrc/common/gpu/info.cpp b/csrc/common/gpu/info.cpp
index d38a8ae..d19de83 100644
--- a/csrc/common/gpu/info.cpp
+++ b/csrc/common/gpu/info.cpp
@@ -369,6 +369,37 @@
return suitable_gpu;
}
+int getGPUPrior(const int need, const int reserved, const int lastChoice){
+ nvGpuInfo_t gpu_info;
+
+ int ret = get_gpu_info(&gpu_info);
+ if(!ret){
+ if (gpu_info.device_count == 0) return -1;
+
+ int suitable_gpu = -1;
+ int mem_idle = need;
+ for(int i = 0; i < gpu_info.device_count; i++){
+ if (i != lastChoice){
+ int mem_free = gpu_info.devices[i].memory_free >> 20;
+ if(mem_free > mem_idle){
+ mem_idle = mem_free;
+ suitable_gpu = i;
+ }
+ }
+ }
+ if (suitable_gpu != -1){
+ return suitable_gpu;
+ }else{
+ if (gpu_info.device_count <= lastChoice) return -1;
+ int mem_free = (gpu_info.devices[lastChoice].memory_free >> 20) - reserved;
+ if(mem_free > need){
+ return lastChoice;
+ }
+ }
+ }
+ return -1;
+}
+
int getGPU(const int need){
nvGpuInfo_t gpu_buf;
diff --git a/csrc/common/gpu/info.h b/csrc/common/gpu/info.h
index 73da8ab..614a4cb 100644
--- a/csrc/common/gpu/info.h
+++ b/csrc/common/gpu/info.h
@@ -3,6 +3,7 @@
namespace gpu{
int getGPU(const int need);
+ int getGPUPrior(const int need, const int reserved, const int lastChoice);
}
#endif
\ No newline at end of file
diff --git a/csrc/ffmpeg/bridge/cvbridge.cpp b/csrc/ffmpeg/bridge/cvbridge.cpp
index 21d09a1..0749f12 100644
--- a/csrc/ffmpeg/bridge/cvbridge.cpp
+++ b/csrc/ffmpeg/bridge/cvbridge.cpp
@@ -62,11 +62,13 @@
return NULL;
}
- if(!scale_->scaleFrame(in, pic_->getAVFrame())){
- return NULL;
- }
-
- return av_frame_clone(pic_->getAVFrame());
+ uint8_t *out = convert2Data(in);
+ AVFrame *frm = NULL;
+ if (out){
+ frm = fillFrame(out, scale_->dstW_, scale_->dstH_, scale_->dstFmt_);
+ }
+ free(out);
+ return frm;
}
/////////////////////////////////////////////////////////////////
diff --git a/csrc/ffmpeg/data/PicData.cpp b/csrc/ffmpeg/data/PicData.cpp
index 0550fa0..7e1cd20 100644
--- a/csrc/ffmpeg/data/PicData.cpp
+++ b/csrc/ffmpeg/data/PicData.cpp
@@ -46,7 +46,7 @@
bool PicData::init_AVPicture(){
data_size_ = avpicture_get_size((AVPixelFormat)pix_fmt_,
width_, height_);
- if(data_size_ < 0){
+ if(data_size_ <= 0){
logIt("avpicture_get_size error");
return false;
}
diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp
index 59f3f23..af49dbf 100644
--- a/csrc/ffmpeg/format/FormatIn.cpp
+++ b/csrc/ffmpeg/format/FormatIn.cpp
@@ -38,29 +38,24 @@
FormatIn::~FormatIn()
{
- if(ctx_){
- if (!(ctx_->flags & AVFMT_FLAG_CUSTOM_IO)){
- avformat_close_input(&ctx_);
- }else{
- avformat_free_context(ctx_);
- }
+ logIt("free format in");
+ if(dec_ctx_){
+ avcodec_close(dec_ctx_);
+ avcodec_free_context(&dec_ctx_);
+ dec_ctx_ = NULL;
+ }
+ if(ctx_){
+ avformat_close_input(&ctx_);
ctx_ = NULL;
- if(dec_ctx_){
- avcodec_close(dec_ctx_);
- dec_ctx_ = NULL;
- }
-
}
if (handle_gb28181){
delete handle_gb28181;
}
- if(read_io_buff_){
- av_free(read_io_buff_);
- read_io_buff_ = NULL;
- }
+
if(io_ctx_){
+ av_freep(&io_ctx_->buffer);
avio_context_free(&io_ctx_);
io_ctx_ = NULL;
}
@@ -89,11 +84,11 @@
ctx_->pb = io_ctx_;
- auto err = av_probe_input_buffer(ctx_->pb, &ctx_->iformat, NULL, NULL, 0, 0);
- if(err != 0){
- logIt("open with custom io prob input buffer error:%d err: %s\n", err, getAVErrorDesc(err).c_str());
- return -1;
- }
+ // auto err = av_probe_input_buffer(ctx_->pb, &ctx_->iformat, NULL, NULL, 0, 0);
+ // if(err != 0){
+ // logIt("open with custom io prob input buffer error:%d err: %s\n", err, getAVErrorDesc(err).c_str());
+ // return -1;
+ // }
return 0;
}
@@ -164,7 +159,7 @@
}else if(in->avg_frame_rate.num >=1 && in->avg_frame_rate.den >= 1){
fps_ = av_q2d(in->avg_frame_rate);
}
- logIt("in stream video fps %f, time_base: %d : %d", fps_, in->time_base.num, in->time_base.den);
+ logIt("in stream video fps %f, time_base: %d : %d, size: %dx%d", fps_, in->time_base.num, in->time_base.den, in->codecpar->width, in->codecpar->height);
}
if (type == AVMEDIA_TYPE_AUDIO){
auto in = ctx_->streams[i];
@@ -199,17 +194,17 @@
for (int i = 0; i < 2; ++i)
{
if(hw_accl_){
- idle_gpu = gpu::getGPU(100);
+ idle_gpu = gpu::getGPUPrior(300, 1024, 0);
if(idle_gpu < 0){
logIt("NO GPU RESOURCE TO DECODE");
hw_accl_ = false;
continue;
}
- if(codecpar->codec_id == AV_CODEC_ID_H264){
- dec = avcodec_find_decoder_by_name("h264_cuvid");
- }else if(codecpar->codec_id == AV_CODEC_ID_H265){
- dec = avcodec_find_decoder_by_name("hevc_cuvid");
- }
+
+ std::string codec_name(avcodec_get_name(codecpar->codec_id));
+ codec_name += "_cuvid";
+ dec = avcodec_find_decoder_by_name(codec_name.c_str());
+
if(!dec){
hw_accl_ = false;
continue;
diff --git a/csrc/thirdparty/ffmpeg/include/libavcodec/avcodec.h b/csrc/thirdparty/ffmpeg/include/libavcodec/avcodec.h
index fb0c6fa..d234271 100644
--- a/csrc/thirdparty/ffmpeg/include/libavcodec/avcodec.h
+++ b/csrc/thirdparty/ffmpeg/include/libavcodec/avcodec.h
@@ -409,6 +409,7 @@
AV_CODEC_ID_DXV,
AV_CODEC_ID_SCREENPRESSO,
AV_CODEC_ID_RSCC,
+ AV_CODEC_ID_AVS2,
AV_CODEC_ID_Y41P = 0x8000,
AV_CODEC_ID_AVRP,
@@ -446,6 +447,16 @@
AV_CODEC_ID_SVG,
AV_CODEC_ID_GDV,
AV_CODEC_ID_FITS,
+ AV_CODEC_ID_IMM4,
+ AV_CODEC_ID_PROSUMER,
+ AV_CODEC_ID_MWSC,
+ AV_CODEC_ID_WCMV,
+ AV_CODEC_ID_RASC,
+ AV_CODEC_ID_HYMT,
+ AV_CODEC_ID_ARBC,
+ AV_CODEC_ID_AGM,
+ AV_CODEC_ID_LSCR,
+ AV_CODEC_ID_VP4,
/* various PCM "codecs" */
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
@@ -485,6 +496,7 @@
AV_CODEC_ID_PCM_S64BE,
AV_CODEC_ID_PCM_F16LE,
AV_CODEC_ID_PCM_F24LE,
+ AV_CODEC_ID_PCM_VIDC,
/* various ADPCM codecs */
AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
@@ -529,6 +541,7 @@
AV_CODEC_ID_ADPCM_AICA,
AV_CODEC_ID_ADPCM_IMA_DAT4,
AV_CODEC_ID_ADPCM_MTAF,
+ AV_CODEC_ID_ADPCM_AGM,
/* AMR */
AV_CODEC_ID_AMR_NB = 0x12000,
@@ -637,6 +650,8 @@
AV_CODEC_ID_APTX,
AV_CODEC_ID_APTX_HD,
AV_CODEC_ID_SBC,
+ AV_CODEC_ID_ATRAC9,
+ AV_CODEC_ID_HCOM,
/* subtitle codecs */
AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
@@ -665,6 +680,8 @@
AV_CODEC_ID_PJS,
AV_CODEC_ID_ASS,
AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
+ AV_CODEC_ID_TTML,
+ AV_CODEC_ID_ARIB_CAPTION,
/* other specific kind of codecs (generally used for attachments) */
AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs.
@@ -843,6 +860,11 @@
* Use qpel MC.
*/
#define AV_CODEC_FLAG_QPEL (1 << 4)
+/**
+ * Don't output frames whose parameters differ from first
+ * decoded frame in stream.
+ */
+#define AV_CODEC_FLAG_DROPCHANGED (1 << 5)
/**
* Use internal 2pass ratecontrol in first pass mode.
*/
@@ -1063,6 +1085,13 @@
#define AV_CODEC_CAP_HYBRID (1 << 19)
/**
+ * This codec takes the reordered_opaque field from input AVFrames
+ * and returns it in the corresponding field in AVCodecContext after
+ * encoding.
+ */
+#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)
+
+/**
* Pan Scan area.
* This specifies the area which should be displayed.
* Note there may be multiple such areas for one frame.
@@ -1101,17 +1130,29 @@
* Maximum bitrate of the stream, in bits per second.
* Zero if unknown or unspecified.
*/
+#if FF_API_UNSANITIZED_BITRATES
int max_bitrate;
+#else
+ int64_t max_bitrate;
+#endif
/**
* Minimum bitrate of the stream, in bits per second.
* Zero if unknown or unspecified.
*/
+#if FF_API_UNSANITIZED_BITRATES
int min_bitrate;
+#else
+ int64_t min_bitrate;
+#endif
/**
* Average bitrate of the stream, in bits per second.
* Zero if unknown or unspecified.
*/
+#if FF_API_UNSANITIZED_BITRATES
int avg_bitrate;
+#else
+ int64_t avg_bitrate;
+#endif
/**
* The size of the buffer to which the ratecontrol is applied, in bits.
@@ -1312,7 +1353,7 @@
AV_PKT_DATA_METADATA_UPDATE,
/**
- * MPEGTS stream ID, this is required to pass the stream ID
+ * MPEGTS stream ID as uint8_t, this is required to pass the stream ID
* information from the demuxer to the corresponding muxer.
*/
AV_PKT_DATA_MPEGTS_STREAM_ID,
@@ -1356,6 +1397,12 @@
* The format is not part of ABI, use av_encryption_info_* methods to access.
*/
AV_PKT_DATA_ENCRYPTION_INFO,
+
+ /**
+ * Active Format Description data consisting of a single byte as specified
+ * in ETSI TS 101 154 using AVActiveFormatDescription enum.
+ */
+ AV_PKT_DATA_AFD,
/**
* The number of side data types.
@@ -1612,6 +1659,7 @@
* The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger
* than extradata_size to avoid problems if it is read with the bitstream reader.
* The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+ * Must be allocated with the av_malloc() family of functions.
* - encoding: Set/allocated/freed by libavcodec.
* - decoding: Set/allocated/freed by user.
*/
@@ -2009,15 +2057,19 @@
/**
* custom intra quantization matrix
- * - encoding: Set by user, can be NULL.
- * - decoding: Set by libavcodec.
+ * Must be allocated with the av_malloc() family of functions, and will be freed in
+ * avcodec_free_context().
+ * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
+ * - decoding: Set/allocated/freed by libavcodec.
*/
uint16_t *intra_matrix;
/**
* custom inter quantization matrix
- * - encoding: Set by user, can be NULL.
- * - decoding: Set by libavcodec.
+ * Must be allocated with the av_malloc() family of functions, and will be freed in
+ * avcodec_free_context().
+ * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
+ * - decoding: Set/allocated/freed by libavcodec.
*/
uint16_t *inter_matrix;
@@ -2661,7 +2713,10 @@
/**
* opaque 64-bit number (generally a PTS) that will be reordered and
* output in AVFrame.reordered_opaque
- * - encoding: unused
+ * - encoding: Set by libavcodec to the reordered_opaque of the input
+ * frame corresponding to the last returned packet. Only
+ * supported by encoders with the
+ * AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability.
* - decoding: Set by user.
*/
int64_t reordered_opaque;
@@ -2944,6 +2999,16 @@
#define FF_PROFILE_MJPEG_JPEG_LS 0xf7
#define FF_PROFILE_SBC_MSBC 1
+
+#define FF_PROFILE_PRORES_PROXY 0
+#define FF_PROFILE_PRORES_LT 1
+#define FF_PROFILE_PRORES_STANDARD 2
+#define FF_PROFILE_PRORES_HQ 3
+#define FF_PROFILE_PRORES_4444 4
+#define FF_PROFILE_PRORES_XQ 5
+
+#define FF_PROFILE_ARIB_PROFILE_A 0
+#define FF_PROFILE_ARIB_PROFILE_C 1
/**
* level
@@ -3297,6 +3362,14 @@
* used as reference pictures).
*/
int extra_hw_frames;
+
+ /**
+ * The percentage of damaged samples to discard a frame.
+ *
+ * - decoding: set by user
+ * - encoding: unused
+ */
+ int discard_damaged_percentage;
} AVCodecContext;
#if FF_API_CODEC_GET_SET
@@ -4349,7 +4422,7 @@
* Initialize a reference-counted packet from av_malloc()ed data.
*
* @param pkt packet to be initialized. This function will set the data, size,
- * buf and destruct fields, all others are left untouched.
+ * and buf fields, all others are left untouched.
* @param data Data allocated by av_malloc() to be used as packet data. If this
* function returns successfully, the data is owned by the underlying AVBuffer.
* The caller may not access the data through other means.
@@ -4855,6 +4928,9 @@
* AVERROR_EOF: the decoder has been fully flushed, and there will be
* no more output frames
* AVERROR(EINVAL): codec not opened, or it is an encoder
+ * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters
+ * with respect to first decoded frame. Applicable
+ * when flag AV_CODEC_FLAG_DROPCHANGED is set.
* other negative values: legitimate decoding errors
*/
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
@@ -5766,6 +5842,7 @@
int (*init)(AVBSFContext *ctx);
int (*filter)(AVBSFContext *ctx, AVPacket *pkt);
void (*close)(AVBSFContext *ctx);
+ void (*flush)(AVBSFContext *ctx);
} AVBitStreamFilter;
#if FF_API_OLD_BSF
@@ -5893,6 +5970,11 @@
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt);
/**
+ * Reset the internal bitstream filter state / flush internal buffers.
+ */
+void av_bsf_flush(AVBSFContext *ctx);
+
+/**
* Free a bitstream filter context and everything associated with it; write NULL
* into the supplied pointer.
*/
diff --git a/csrc/thirdparty/ffmpeg/include/libavcodec/mediacodec.h b/csrc/thirdparty/ffmpeg/include/libavcodec/mediacodec.h
index 5606d24..4c8545d 100644
--- a/csrc/thirdparty/ffmpeg/include/libavcodec/mediacodec.h
+++ b/csrc/thirdparty/ffmpeg/include/libavcodec/mediacodec.h
@@ -85,4 +85,17 @@
*/
int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render);
+/**
+ * Release a MediaCodec buffer and render it at the given time to the surface
+ * that is associated with the decoder. The timestamp must be within one second
+ * of the current java/lang/System#nanoTime() (which is implemented using
+ * CLOCK_MONOTONIC on Android). See the Android MediaCodec documentation
+ * of android/media/MediaCodec#releaseOutputBuffer(int,long) for more details.
+ *
+ * @param buffer the buffer to render
+ * @param time timestamp in nanoseconds of when to render the buffer
+ * @return 0 on success, < 0 otherwise
+ */
+int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time);
+
#endif /* AVCODEC_MEDIACODEC_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavcodec/version.h b/csrc/thirdparty/ffmpeg/include/libavcodec/version.h
index 6895f1a..3331d47 100644
--- a/csrc/thirdparty/ffmpeg/include/libavcodec/version.h
+++ b/csrc/thirdparty/ffmpeg/include/libavcodec/version.h
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
-#define LIBAVCODEC_VERSION_MINOR 18
+#define LIBAVCODEC_VERSION_MINOR 54
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -132,6 +132,9 @@
#ifndef FF_API_NEXT
#define FF_API_NEXT (LIBAVCODEC_VERSION_MAJOR < 59)
#endif
+#ifndef FF_API_UNSANITIZED_BITRATES
+#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
#endif /* AVCODEC_VERSION_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavfilter/buffersink.h b/csrc/thirdparty/ffmpeg/include/libavfilter/buffersink.h
index 21d6bb5..3c846bb 100644
--- a/csrc/thirdparty/ffmpeg/include/libavfilter/buffersink.h
+++ b/csrc/thirdparty/ffmpeg/include/libavfilter/buffersink.h
@@ -151,7 +151,7 @@
* the end of stream, when it can contain less than nb_samples.
*
* @return The return codes have the same meaning as for
- * av_buffersink_get_samples().
+ * av_buffersink_get_frame().
*
* @warning do not mix this function with av_buffersink_get_frame(). Use only one or
* the other with a single sink, not both.
diff --git a/csrc/thirdparty/ffmpeg/include/libavfilter/buffersrc.h b/csrc/thirdparty/ffmpeg/include/libavfilter/buffersrc.h
index 0652113..08fbd18 100644
--- a/csrc/thirdparty/ffmpeg/include/libavfilter/buffersrc.h
+++ b/csrc/thirdparty/ffmpeg/include/libavfilter/buffersrc.h
@@ -106,7 +106,7 @@
AVBufferRef *hw_frames_ctx;
/**
- * Audio only, the audio sampling rate in samples per secon.
+ * Audio only, the audio sampling rate in samples per second.
*/
int sample_rate;
diff --git a/csrc/thirdparty/ffmpeg/include/libavfilter/version.h b/csrc/thirdparty/ffmpeg/include/libavfilter/version.h
index 87468df..cc5b23b 100644
--- a/csrc/thirdparty/ffmpeg/include/libavfilter/version.h
+++ b/csrc/thirdparty/ffmpeg/include/libavfilter/version.h
@@ -30,9 +30,10 @@
#include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 7
-#define LIBAVFILTER_VERSION_MINOR 16
+#define LIBAVFILTER_VERSION_MINOR 57
#define LIBAVFILTER_VERSION_MICRO 100
+
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
LIBAVFILTER_VERSION_MICRO)
diff --git a/csrc/thirdparty/ffmpeg/include/libavformat/avformat.h b/csrc/thirdparty/ffmpeg/include/libavformat/avformat.h
index a2fe7c6..6eb329f 100644
--- a/csrc/thirdparty/ffmpeg/include/libavformat/avformat.h
+++ b/csrc/thirdparty/ffmpeg/include/libavformat/avformat.h
@@ -36,17 +36,15 @@
* into component streams, and the reverse process of muxing - writing supplied
* data in a specified container format. It also has an @ref lavf_io
* "I/O module" which supports a number of protocols for accessing the data (e.g.
- * file, tcp, http and others). Before using lavf, you need to call
- * av_register_all() to register all compiled muxers, demuxers and protocols.
+ * file, tcp, http and others).
* Unless you are absolutely sure you won't use libavformat's network
* capabilities, you should also call avformat_network_init().
*
* A supported input format is described by an AVInputFormat struct, conversely
* an output format is described by AVOutputFormat. You can iterate over all
- * registered input/output formats using the av_iformat_next() /
- * av_oformat_next() functions. The protocols layer is not part of the public
- * API, so you can only get the names of supported protocols with the
- * avio_enum_protocols() function.
+ * input/output formats using the av_demuxer_iterate / av_muxer_iterate() functions.
+ * The protocols layer is not part of the public API, so you can only get the names
+ * of supported protocols with the avio_enum_protocols() function.
*
* Main lavf structure used for both muxing and demuxing is AVFormatContext,
* which exports all information about the file being read or written. As with
@@ -177,8 +175,8 @@
* Otherwise, if AVPacket.buf is NULL, the packet data is backed by a
* static storage somewhere inside the demuxer and the packet is only valid
* until the next av_read_frame() call or closing the file. If the caller
- * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy
- * of it.
+ * requires a longer lifetime, av_packet_make_refcounted() will ensure that
+ * the data is reference counted, copying the data if necessary.
* In both cases, the packet must be freed with av_packet_unref() when it is no
* longer needed.
*
@@ -532,7 +530,16 @@
* New public fields should be added right above.
*****************************************************************
*/
- struct AVOutputFormat *next;
+ /**
+ * The ff_const59 define is not part of the public API and will
+ * be removed without further warning.
+ */
+#if FF_API_AVIOFORMAT
+#define ff_const59
+#else
+#define ff_const59 const
+#endif
+ ff_const59 struct AVOutputFormat *next;
/**
* size of private data so that it can be allocated in the wrapper
*/
@@ -646,7 +653,7 @@
/**
* Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
- * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+ * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
* AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
*/
int flags;
@@ -676,7 +683,7 @@
* New public fields should be added right above.
*****************************************************************
*/
- struct AVInputFormat *next;
+ ff_const59 struct AVInputFormat *next;
/**
* Raw demuxers store their codec ID here.
@@ -693,7 +700,7 @@
* The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
* big so you do not have to check for that unless you need more.
*/
- int (*read_probe)(AVProbeData *);
+ int (*read_probe)(const AVProbeData *);
/**
* Read the format header and initialize the AVFormatContext
@@ -846,6 +853,7 @@
#define AV_DISPOSITION_DESCRIPTIONS 0x20000
#define AV_DISPOSITION_METADATA 0x40000
#define AV_DISPOSITION_DEPENDENT 0x80000 ///< dependent audio stream (mix_type=0 in mpegts)
+#define AV_DISPOSITION_STILL_IMAGE 0x100000 ///< still images in video stream (still_picture_flag=1 in mpegts)
/**
* Options for behavior on timestamp wrap detection.
@@ -1102,6 +1110,13 @@
*/
int stream_identifier;
+ /**
+ * Details of the MPEG-TS program which created this stream.
+ */
+ int program_num;
+ int pmt_version;
+ int pmt_stream_idx;
+
int64_t interleaver_chunk_size;
int64_t interleaver_chunk_duration;
@@ -1259,6 +1274,7 @@
int program_num;
int pmt_pid;
int pcr_pid;
+ int pmt_version;
/*****************************************************************
* All fields below this line are not part of the public API. They
@@ -1337,14 +1353,14 @@
*
* Demuxing only, set by avformat_open_input().
*/
- struct AVInputFormat *iformat;
+ ff_const59 struct AVInputFormat *iformat;
/**
* The output container format.
*
* Muxing only, must be set by the caller before avformat_write_header().
*/
- struct AVOutputFormat *oformat;
+ ff_const59 struct AVOutputFormat *oformat;
/**
* Format private data. This is an AVOptions-enabled struct
@@ -1474,7 +1490,9 @@
* This flag is mainly intended for testing.
*/
#define AVFMT_FLAG_BITEXACT 0x0400
-#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Enable RTP MP4A-LATM payload
+#if FF_API_LAVF_MP4A_LATM
+#define AVFMT_FLAG_MP4A_LATM 0x8000 ///< Deprecated, does nothing.
+#endif
#define AVFMT_FLAG_SORT_DTS 0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
#define AVFMT_FLAG_PRIV_OPT 0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted)
#if FF_API_LAVF_KEEPSIDE_FLAG
@@ -1926,6 +1944,13 @@
* - decoding: set by user
*/
int max_streams;
+
+ /**
+ * Skip duration calcuation in estimate_timings_from_pts.
+ * - encoding: unused
+ * - decoding: set by user
+ */
+ int skip_estimate_duration_from_pts;
} AVFormatContext;
#if FF_API_FORMAT_GET_SET
@@ -2193,7 +2218,7 @@
* @return >= 0 in case of success, a negative AVERROR code in case of
* failure
*/
-int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
+int avformat_alloc_output_context2(AVFormatContext **ctx, ff_const59 AVOutputFormat *oformat,
const char *format_name, const char *filename);
/**
@@ -2204,7 +2229,7 @@
/**
* Find AVInputFormat based on the short name of the input format.
*/
-AVInputFormat *av_find_input_format(const char *short_name);
+ff_const59 AVInputFormat *av_find_input_format(const char *short_name);
/**
* Guess the file format.
@@ -2213,7 +2238,7 @@
* @param is_opened Whether the file is already opened; determines whether
* demuxers with or without AVFMT_NOFILE are probed.
*/
-AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened);
+ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened);
/**
* Guess the file format.
@@ -2227,7 +2252,7 @@
* If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended
* to retry with a larger probe buffer.
*/
-AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max);
+ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max);
/**
* Guess the file format.
@@ -2236,7 +2261,7 @@
* demuxers with or without AVFMT_NOFILE are probed.
* @param score_ret The score of the best detection.
*/
-AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret);
+ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened, int *score_ret);
/**
* Probe a bytestream to determine the input format. Each time a probe returns
@@ -2254,14 +2279,14 @@
* the maximal score is AVPROBE_SCORE_MAX
* AVERROR code otherwise
*/
-int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
const char *url, void *logctx,
unsigned int offset, unsigned int max_probe_size);
/**
* Like av_probe_input_buffer2() but returns 0 on success
*/
-int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
const char *url, void *logctx,
unsigned int offset, unsigned int max_probe_size);
@@ -2284,7 +2309,7 @@
*
* @note If you want to use custom IO, preallocate the format context and set its pb field.
*/
-int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
+int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);
attribute_deprecated
int av_demuxer_open(AVFormatContext *ic);
@@ -2669,14 +2694,14 @@
* @param mime_type if non-NULL checks if mime_type matches with the
* MIME type of the registered formats
*/
-AVOutputFormat *av_guess_format(const char *short_name,
+ff_const59 AVOutputFormat *av_guess_format(const char *short_name,
const char *filename,
const char *mime_type);
/**
* Guess the codec ID based upon muxer and filename.
*/
-enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
+enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name,
const char *filename, const char *mime_type,
enum AVMediaType type);
diff --git a/csrc/thirdparty/ffmpeg/include/libavformat/avio.h b/csrc/thirdparty/ffmpeg/include/libavformat/avio.h
index 75912ce..dcb8dcd 100644
--- a/csrc/thirdparty/ffmpeg/include/libavformat/avio.h
+++ b/csrc/thirdparty/ffmpeg/include/libavformat/avio.h
@@ -236,7 +236,7 @@
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
int64_t (*seek)(void *opaque, int64_t offset, int whence);
int64_t pos; /**< position in the file of the current buffer */
- int eof_reached; /**< true if eof reached */
+ int eof_reached; /**< true if was unable to read due to error or eof */
int write_flag; /**< true if open for writing */
int max_packet_size;
unsigned long checksum;
@@ -566,8 +566,8 @@
int64_t avio_size(AVIOContext *s);
/**
- * feof() equivalent for AVIOContext.
- * @return non zero if and only if end of file
+ * Similar to feof() but also returns nonzero on read errors.
+ * @return non zero if and only if at end of file or a read error happened when reading.
*/
int avio_feof(AVIOContext *s);
diff --git a/csrc/thirdparty/ffmpeg/include/libavformat/version.h b/csrc/thirdparty/ffmpeg/include/libavformat/version.h
index a0a26d5..22ed534 100644
--- a/csrc/thirdparty/ffmpeg/include/libavformat/version.h
+++ b/csrc/thirdparty/ffmpeg/include/libavformat/version.h
@@ -32,7 +32,7 @@
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
// Also please add any ticket numbers that you believe might be affected here
#define LIBAVFORMAT_VERSION_MAJOR 58
-#define LIBAVFORMAT_VERSION_MINOR 12
+#define LIBAVFORMAT_VERSION_MINOR 29
#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
@@ -70,6 +70,9 @@
#ifndef FF_API_HLS_WRAP
#define FF_API_HLS_WRAP (LIBAVFORMAT_VERSION_MAJOR < 59)
#endif
+#ifndef FF_API_HLS_USE_LOCALTIME
+#define FF_API_HLS_USE_LOCALTIME (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
#ifndef FF_API_LAVF_KEEPSIDE_FLAG
#define FF_API_LAVF_KEEPSIDE_FLAG (LIBAVFORMAT_VERSION_MAJOR < 59)
#endif
@@ -94,6 +97,15 @@
#ifndef FF_API_NEXT
#define FF_API_NEXT (LIBAVFORMAT_VERSION_MAJOR < 59)
#endif
+#ifndef FF_API_DASH_MIN_SEG_DURATION
+#define FF_API_DASH_MIN_SEG_DURATION (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_LAVF_MP4A_LATM
+#define FF_API_LAVF_MP4A_LATM (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
+#ifndef FF_API_AVIOFORMAT
+#define FF_API_AVIOFORMAT (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
#ifndef FF_API_R_FRAME_RATE
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/avassert.h b/csrc/thirdparty/ffmpeg/include/libavutil/avassert.h
index 46f3fea..9abeade 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/avassert.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/avassert.h
@@ -66,7 +66,7 @@
#endif
/**
- * Assert that floating point opperations can be executed.
+ * Assert that floating point operations can be executed.
*
* This will av_assert0() that the cpu is not in MMX state on X86
*/
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/avstring.h b/csrc/thirdparty/ffmpeg/include/libavutil/avstring.h
index 04d2695..37dd4e2 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/avstring.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/avstring.h
@@ -401,6 +401,12 @@
int av_match_list(const char *name, const char *list, char separator);
/**
+ * See libc sscanf manual for more information.
+ * Locale-independent sscanf implementation.
+ */
+int av_sscanf(const char *string, const char *format, ...);
+
+/**
* @}
*/
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/encryption_info.h b/csrc/thirdparty/ffmpeg/include/libavutil/encryption_info.h
index 47dc3a3..8fe7ebf 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/encryption_info.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/encryption_info.h
@@ -41,7 +41,7 @@
* The size of this struct is not part of the public ABI.
*/
typedef struct AVEncryptionInfo {
- /** The fourcc encryption scheme. */
+ /** The fourcc encryption scheme, in big-endian byte order. */
uint32_t scheme;
/**
@@ -115,6 +115,11 @@
*/
uint8_t* data;
uint32_t data_size;
+
+ /**
+ * An optional pointer to the next initialization info in the list.
+ */
+ struct AVEncryptionInitInfo *next;
} AVEncryptionInitInfo;
/**
@@ -124,7 +129,7 @@
*
* @param subsample_count The number of subsamples.
* @param key_id_size The number of bytes in the key ID, should be 16.
- * @param key_id_size The number of bytes in the IV, should be 16.
+ * @param iv_size The number of bytes in the IV, should be 16.
*
* @return The new AVEncryptionInfo structure, or NULL on error.
*/
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/ffversion.h b/csrc/thirdparty/ffmpeg/include/libavutil/ffversion.h
index cc6acf9..f4377b7 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/ffversion.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/ffversion.h
@@ -1,5 +1,5 @@
/* Automatically generated by version.sh, do not manually edit! */
#ifndef AVUTIL_FFVERSION_H
#define AVUTIL_FFVERSION_H
-#define FFMPEG_VERSION "4.0.2"
+#define FFMPEG_VERSION "4.2"
#endif /* AVUTIL_FFVERSION_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/file.h b/csrc/thirdparty/ffmpeg/include/libavutil/file.h
index 8666c7b..3ef4a60 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/file.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/file.h
@@ -33,6 +33,8 @@
* allocated buffer or map it with mmap() when available.
* In case of success set *bufptr to the read or mmapped buffer, and
* *size to the size in bytes of the buffer in *bufptr.
+ * Unlike mmap this function succeeds with zero sized files, in this
+ * case *bufptr will be set to NULL and *size will be set to 0.
* The returned buffer must be released with av_file_unmap().
*
* @param log_offset loglevel offset used for logging
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/frame.h b/csrc/thirdparty/ffmpeg/include/libavutil/frame.h
index 9d57d6c..5d3231e 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/frame.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/frame.h
@@ -158,6 +158,27 @@
*/
AV_FRAME_DATA_QP_TABLE_DATA,
#endif
+
+ /**
+ * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t
+ * where the first uint32_t describes how many (1-3) of the other timecodes are used.
+ * The timecode format is described in the av_timecode_get_smpte_from_framenum()
+ * function in libavutil/timecode.c.
+ */
+ AV_FRAME_DATA_S12M_TIMECODE,
+
+ /**
+ * HDR dynamic metadata associated with a video frame. The payload is
+ * an AVDynamicHDRPlus type and contains information for color
+ * volume transform - application 4 of SMPTE 2094-40:2016 standard.
+ */
+ AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
+
+ /**
+ * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of
+ * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size.
+ */
+ AV_FRAME_DATA_REGIONS_OF_INTEREST,
};
enum AVActiveFormatDescription {
@@ -184,6 +205,62 @@
AVDictionary *metadata;
AVBufferRef *buf;
} AVFrameSideData;
+
+/**
+ * Structure describing a single Region Of Interest.
+ *
+ * When multiple regions are defined in a single side-data block, they
+ * should be ordered from most to least important - some encoders are only
+ * capable of supporting a limited number of distinct regions, so will have
+ * to truncate the list.
+ *
+ * When overlapping regions are defined, the first region containing a given
+ * area of the frame applies.
+ */
+typedef struct AVRegionOfInterest {
+ /**
+ * Must be set to the size of this data structure (that is,
+ * sizeof(AVRegionOfInterest)).
+ */
+ uint32_t self_size;
+ /**
+ * Distance in pixels from the top edge of the frame to the top and
+ * bottom edges and from the left edge of the frame to the left and
+ * right edges of the rectangle defining this region of interest.
+ *
+ * The constraints on a region are encoder dependent, so the region
+ * actually affected may be slightly larger for alignment or other
+ * reasons.
+ */
+ int top;
+ int bottom;
+ int left;
+ int right;
+ /**
+ * Quantisation offset.
+ *
+ * Must be in the range -1 to +1. A value of zero indicates no quality
+ * change. A negative value asks for better quality (less quantisation),
+ * while a positive value asks for worse quality (greater quantisation).
+ *
+ * The range is calibrated so that the extreme values indicate the
+ * largest possible offset - if the rest of the frame is encoded with the
+ * worst possible quality, an offset of -1 indicates that this region
+ * should be encoded with the best possible quality anyway. Intermediate
+ * values are then interpolated in some codec-dependent way.
+ *
+ * For example, in 10-bit H.264 the quantisation parameter varies between
+ * -12 and 51. A typical qoffset value of -1/10 therefore indicates that
+ * this region should be encoded with a QP around one-tenth of the full
+ * range better than the rest of the frame. So, if most of the frame
+ * were to be encoded with a QP of around 30, this region would get a QP
+ * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3).
+ * An extreme value of -1 would indicate that this region should be
+ * encoded with the best possible quality regardless of the treatment of
+ * the rest of the frame - that is, should be encoded at a QP of -12.
+ */
+ AVRational qoffset;
+} AVRegionOfInterest;
/**
* This structure describes decoded (raw) audio or video data.
@@ -381,7 +458,6 @@
* that time,
* the decoder reorders values as needed and sets AVFrame.reordered_opaque
* to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
- * @deprecated in favor of pkt_pts
*/
int64_t reordered_opaque;
@@ -514,6 +590,8 @@
int decode_error_flags;
#define FF_DECODE_ERROR_INVALID_BITSTREAM 1
#define FF_DECODE_ERROR_MISSING_REFERENCE 2
+#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE 4
+#define FF_DECODE_ERROR_DECODE_SLICES 8
/**
* number of audio channels, only used for audio.
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h b/csrc/thirdparty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h
new file mode 100644
index 0000000..2d72de5
--- /dev/null
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/hdr_dynamic_metadata.h
@@ -0,0 +1,343 @@
+/*
+ * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H
+#define AVUTIL_HDR_DYNAMIC_METADATA_H
+
+#include "frame.h"
+#include "rational.h"
+
+/**
+ * Option for overlapping elliptical pixel selectors in an image.
+ */
+enum AVHDRPlusOverlapProcessOption {
+ AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0,
+ AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1,
+};
+
+/**
+ * Represents the percentile at a specific percentage in
+ * a distribution.
+ */
+typedef struct AVHDRPlusPercentile {
+ /**
+ * The percentage value corresponding to a specific percentile linearized
+ * RGB value in the processing window in the scene. The value shall be in
+ * the range of 0 to100, inclusive.
+ */
+ uint8_t percentage;
+
+ /**
+ * The linearized maxRGB value at a specific percentile in the processing
+ * window in the scene. The value shall be in the range of 0 to 1, inclusive
+ * and in multiples of 0.00001.
+ */
+ AVRational percentile;
+} AVHDRPlusPercentile;
+
+/**
+ * Color transform parameters at a processing window in a dynamic metadata for
+ * SMPTE 2094-40.
+ */
+typedef struct AVHDRPlusColorTransformParams {
+ /**
+ * The relative x coordinate of the top left pixel of the processing
+ * window. The value shall be in the range of 0 and 1, inclusive and
+ * in multiples of 1/(width of Picture - 1). The value 1 corresponds
+ * to the absolute coordinate of width of Picture - 1. The value for
+ * first processing window shall be 0.
+ */
+ AVRational window_upper_left_corner_x;
+
+ /**
+ * The relative y coordinate of the top left pixel of the processing
+ * window. The value shall be in the range of 0 and 1, inclusive and
+ * in multiples of 1/(height of Picture - 1). The value 1 corresponds
+ * to the absolute coordinate of height of Picture - 1. The value for
+ * first processing window shall be 0.
+ */
+ AVRational window_upper_left_corner_y;
+
+ /**
+ * The relative x coordinate of the bottom right pixel of the processing
+ * window. The value shall be in the range of 0 and 1, inclusive and
+ * in multiples of 1/(width of Picture - 1). The value 1 corresponds
+ * to the absolute coordinate of width of Picture - 1. The value for
+ * first processing window shall be 1.
+ */
+ AVRational window_lower_right_corner_x;
+
+ /**
+ * The relative y coordinate of the bottom right pixel of the processing
+ * window. The value shall be in the range of 0 and 1, inclusive and
+ * in multiples of 1/(height of Picture - 1). The value 1 corresponds
+ * to the absolute coordinate of height of Picture - 1. The value for
+ * first processing window shall be 1.
+ */
+ AVRational window_lower_right_corner_y;
+
+ /**
+ * The x coordinate of the center position of the concentric internal and
+ * external ellipses of the elliptical pixel selector in the processing
+ * window. The value shall be in the range of 0 to (width of Picture - 1),
+ * inclusive and in multiples of 1 pixel.
+ */
+ uint16_t center_of_ellipse_x;
+
+ /**
+ * The y coordinate of the center position of the concentric internal and
+ * external ellipses of the elliptical pixel selector in the processing
+ * window. The value shall be in the range of 0 to (height of Picture - 1),
+ * inclusive and in multiples of 1 pixel.
+ */
+ uint16_t center_of_ellipse_y;
+
+ /**
+ * The clockwise rotation angle in degree of arc with respect to the
+ * positive direction of the x-axis of the concentric internal and external
+ * ellipses of the elliptical pixel selector in the processing window. The
+ * value shall be in the range of 0 to 180, inclusive and in multiples of 1.
+ */
+ uint8_t rotation_angle;
+
+ /**
+ * The semi-major axis value of the internal ellipse of the elliptical pixel
+ * selector in amount of pixels in the processing window. The value shall be
+ * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
+ */
+ uint16_t semimajor_axis_internal_ellipse;
+
+ /**
+ * The semi-major axis value of the external ellipse of the elliptical pixel
+ * selector in amount of pixels in the processing window. The value
+ * shall not be less than semimajor_axis_internal_ellipse of the current
+ * processing window. The value shall be in the range of 1 to 65535,
+ * inclusive and in multiples of 1 pixel.
+ */
+ uint16_t semimajor_axis_external_ellipse;
+
+ /**
+ * The semi-minor axis value of the external ellipse of the elliptical pixel
+ * selector in amount of pixels in the processing window. The value shall be
+ * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
+ */
+ uint16_t semiminor_axis_external_ellipse;
+
+ /**
+ * Overlap process option indicates one of the two methods of combining
+ * rendered pixels in the processing window in an image with at least one
+ * elliptical pixel selector. For overlapping elliptical pixel selectors
+ * in an image, overlap_process_option shall have the same value.
+ */
+ enum AVHDRPlusOverlapProcessOption overlap_process_option;
+
+ /**
+ * The maximum of the color components of linearized RGB values in the
+ * processing window in the scene. The values should be in the range of 0 to
+ * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and
+ * maxscl[ 2 ] are corresponding to R, G, B color components respectively.
+ */
+ AVRational maxscl[3];
+
+ /**
+ * The average of linearized maxRGB values in the processing window in the
+ * scene. The value should be in the range of 0 to 1, inclusive and in
+ * multiples of 0.00001.
+ */
+ AVRational average_maxrgb;
+
+ /**
+ * The number of linearized maxRGB values at given percentiles in the
+ * processing window in the scene. The maximum value shall be 15.
+ */
+ uint8_t num_distribution_maxrgb_percentiles;
+
+ /**
+ * The linearized maxRGB values at given percentiles in the
+ * processing window in the scene.
+ */
+ AVHDRPlusPercentile distribution_maxrgb[15];
+
+ /**
+ * The fraction of selected pixels in the image that contains the brightest
+ * pixel in the scene. The value shall be in the range of 0 to 1, inclusive
+ * and in multiples of 0.001.
+ */
+ AVRational fraction_bright_pixels;
+
+ /**
+ * This flag indicates that the metadata for the tone mapping function in
+ * the processing window is present (for value of 1).
+ */
+ uint8_t tone_mapping_flag;
+
+ /**
+ * The x coordinate of the separation point between the linear part and the
+ * curved part of the tone mapping function. The value shall be in the range
+ * of 0 to 1, excluding 0 and in multiples of 1/4095.
+ */
+ AVRational knee_point_x;
+
+ /**
+ * The y coordinate of the separation point between the linear part and the
+ * curved part of the tone mapping function. The value shall be in the range
+ * of 0 to 1, excluding 0 and in multiples of 1/4095.
+ */
+ AVRational knee_point_y;
+
+ /**
+ * The number of the intermediate anchor parameters of the tone mapping
+ * function in the processing window. The maximum value shall be 15.
+ */
+ uint8_t num_bezier_curve_anchors;
+
+ /**
+ * The intermediate anchor parameters of the tone mapping function in the
+ * processing window in the scene. The values should be in the range of 0
+ * to 1, inclusive and in multiples of 1/1023.
+ */
+ AVRational bezier_curve_anchors[15];
+
+ /**
+ * This flag shall be equal to 0 in bitstreams conforming to this version of
+ * this Specification. Other values are reserved for future use.
+ */
+ uint8_t color_saturation_mapping_flag;
+
+ /**
+ * The color saturation gain in the processing window in the scene. The
+ * value shall be in the range of 0 to 63/8, inclusive and in multiples of
+ * 1/8. The default value shall be 1.
+ */
+ AVRational color_saturation_weight;
+} AVHDRPlusColorTransformParams;
+
+/**
+ * This struct represents dynamic metadata for color volume transform -
+ * application 4 of SMPTE 2094-40:2016 standard.
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with
+ * av_dynamic_hdr_plus_alloc() and its size is not a part of
+ * the public ABI.
+ */
+typedef struct AVDynamicHDRPlus {
+ /**
+ * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5.
+ */
+ uint8_t itu_t_t35_country_code;
+
+ /**
+ * Application version in the application defining document in ST-2094
+ * suite. The value shall be set to 0.
+ */
+ uint8_t application_version;
+
+ /**
+ * The number of processing windows. The value shall be in the range
+ * of 1 to 3, inclusive.
+ */
+ uint8_t num_windows;
+
+ /**
+ * The color transform parameters for every processing window.
+ */
+ AVHDRPlusColorTransformParams params[3];
+
+ /**
+ * The nominal maximum display luminance of the targeted system display,
+ * in units of 0.0001 candelas per square metre. The value shall be in
+ * the range of 0 to 10000, inclusive.
+ */
+ AVRational targeted_system_display_maximum_luminance;
+
+ /**
+ * This flag shall be equal to 0 in bit streams conforming to this version
+ * of this Specification. The value 1 is reserved for future use.
+ */
+ uint8_t targeted_system_display_actual_peak_luminance_flag;
+
+ /**
+ * The number of rows in the targeted system_display_actual_peak_luminance
+ * array. The value shall be in the range of 2 to 25, inclusive.
+ */
+ uint8_t num_rows_targeted_system_display_actual_peak_luminance;
+
+ /**
+ * The number of columns in the
+ * targeted_system_display_actual_peak_luminance array. The value shall be
+ * in the range of 2 to 25, inclusive.
+ */
+ uint8_t num_cols_targeted_system_display_actual_peak_luminance;
+
+ /**
+ * The normalized actual peak luminance of the targeted system display. The
+ * values should be in the range of 0 to 1, inclusive and in multiples of
+ * 1/15.
+ */
+ AVRational targeted_system_display_actual_peak_luminance[25][25];
+
+ /**
+ * This flag shall be equal to 0 in bitstreams conforming to this version of
+ * this Specification. The value 1 is reserved for future use.
+ */
+ uint8_t mastering_display_actual_peak_luminance_flag;
+
+ /**
+ * The number of rows in the mastering_display_actual_peak_luminance array.
+ * The value shall be in the range of 2 to 25, inclusive.
+ */
+ uint8_t num_rows_mastering_display_actual_peak_luminance;
+
+ /**
+ * The number of columns in the mastering_display_actual_peak_luminance
+ * array. The value shall be in the range of 2 to 25, inclusive.
+ */
+ uint8_t num_cols_mastering_display_actual_peak_luminance;
+
+ /**
+ * The normalized actual peak luminance of the mastering display used for
+ * mastering the image essence. The values should be in the range of 0 to 1,
+ * inclusive and in multiples of 1/15.
+ */
+ AVRational mastering_display_actual_peak_luminance[25][25];
+} AVDynamicHDRPlus;
+
+/**
+ * Allocate an AVDynamicHDRPlus structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVDynamicHDRPlus filled with default values or NULL
+ * on failure.
+ */
+AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size);
+
+/**
+ * Allocate a complete AVDynamicHDRPlus and add it to the frame.
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVDynamicHDRPlus structure to be filled by caller or NULL
+ * on failure.
+ */
+AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame);
+
+#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/hwcontext_cuda.h b/csrc/thirdparty/ffmpeg/include/libavutil/hwcontext_cuda.h
index 12dae84..81a0552 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/hwcontext_cuda.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/hwcontext_cuda.h
@@ -41,6 +41,7 @@
*/
typedef struct AVCUDADeviceContext {
CUcontext cuda_ctx;
+ CUstream stream;
AVCUDADeviceContextInternal *internal;
} AVCUDADeviceContext;
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/intreadwrite.h b/csrc/thirdparty/ffmpeg/include/libavutil/intreadwrite.h
index 67c763b..4c8413a 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/intreadwrite.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/intreadwrite.h
@@ -542,6 +542,21 @@
# define AV_WN64A(p, v) AV_WNA(64, p, v)
#endif
+#if AV_HAVE_BIGENDIAN
+# define AV_RLA(s, p) av_bswap##s(AV_RN##s##A(p))
+# define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v))
+#else
+# define AV_RLA(s, p) AV_RN##s##A(p)
+# define AV_WLA(s, p, v) AV_WN##s##A(p, v)
+#endif
+
+#ifndef AV_RL64A
+# define AV_RL64A(p) AV_RLA(64, p)
+#endif
+#ifndef AV_WL64A
+# define AV_WL64A(p, v) AV_WLA(64, p, v)
+#endif
+
/*
* The AV_COPYxxU macros are suitable for copying data to/from unaligned
* memory locations.
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/lzo.h b/csrc/thirdparty/ffmpeg/include/libavutil/lzo.h
new file mode 100644
index 0000000..c034039
--- /dev/null
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/lzo.h
@@ -0,0 +1,66 @@
+/*
+ * LZO 1x decompression
+ * copyright (c) 2006 Reimar Doeffinger
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_LZO_H
+#define AVUTIL_LZO_H
+
+/**
+ * @defgroup lavu_lzo LZO
+ * @ingroup lavu_crypto
+ *
+ * @{
+ */
+
+#include <stdint.h>
+
+/** @name Error flags returned by av_lzo1x_decode
+ * @{ */
+/// end of the input buffer reached before decoding finished
+#define AV_LZO_INPUT_DEPLETED 1
+/// decoded data did not fit into output buffer
+#define AV_LZO_OUTPUT_FULL 2
+/// a reference to previously decoded data was wrong
+#define AV_LZO_INVALID_BACKPTR 4
+/// a non-specific error in the compressed bitstream
+#define AV_LZO_ERROR 8
+/** @} */
+
+#define AV_LZO_INPUT_PADDING 8
+#define AV_LZO_OUTPUT_PADDING 12
+
+/**
+ * @brief Decodes LZO 1x compressed data.
+ * @param out output buffer
+ * @param outlen size of output buffer, number of bytes left are returned here
+ * @param in input buffer
+ * @param inlen size of input buffer, number of bytes left are returned here
+ * @return 0 on success, otherwise a combination of the error flags above
+ *
+ * Make sure all buffers are appropriately padded, in must provide
+ * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.
+ */
+int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
+
+/**
+ * @}
+ */
+
+#endif /* AVUTIL_LZO_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/mem.h b/csrc/thirdparty/ffmpeg/include/libavutil/mem.h
index 7e0b12a..5fb1a02 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/mem.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/mem.h
@@ -339,7 +339,7 @@
* @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
* correctly aligned.
*/
-av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
+int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
/**
* Reallocate the given buffer if it is not large enough, otherwise do nothing.
@@ -363,10 +363,10 @@
* @endcode
*
* @param[in,out] ptr Already allocated buffer, or `NULL`
- * @param[in,out] size Pointer to current size of buffer `ptr`. `*size` is
- * changed to `min_size` in case of success or 0 in
- * case of failure
- * @param[in] min_size New size of buffer `ptr`
+ * @param[in,out] size Pointer to the size of buffer `ptr`. `*size` is
+ * updated to the new allocated size, in particular 0
+ * in case of failure.
+ * @param[in] min_size Desired minimal size of buffer `ptr`
* @return `ptr` if the buffer is large enough, a pointer to newly reallocated
* buffer if the buffer was not large enough, or `NULL` in case of
* error
@@ -397,10 +397,10 @@
* @param[in,out] ptr Pointer to pointer to an already allocated buffer.
* `*ptr` will be overwritten with pointer to new
* buffer on success or `NULL` on failure
- * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is
- * changed to `min_size` in case of success or 0 in
- * case of failure
- * @param[in] min_size New size of buffer `*ptr`
+ * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is
+ * updated to the new allocated size, in particular 0
+ * in case of failure.
+ * @param[in] min_size Desired minimal size of buffer `*ptr`
* @see av_realloc()
* @see av_fast_mallocz()
*/
@@ -418,10 +418,10 @@
* @param[in,out] ptr Pointer to pointer to an already allocated buffer.
* `*ptr` will be overwritten with pointer to new
* buffer on success or `NULL` on failure
- * @param[in,out] size Pointer to current size of buffer `*ptr`. `*size` is
- * changed to `min_size` in case of success or 0 in
- * case of failure
- * @param[in] min_size New size of buffer `*ptr`
+ * @param[in,out] size Pointer to the size of buffer `*ptr`. `*size` is
+ * updated to the new allocated size, in particular 0
+ * in case of failure.
+ * @param[in] min_size Desired minimal size of buffer `*ptr`
* @see av_fast_malloc()
*/
void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size);
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/opt.h b/csrc/thirdparty/ffmpeg/include/libavutil/opt.h
index 07da68e..39f4a8d 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/opt.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/opt.h
@@ -289,6 +289,7 @@
#define AV_OPT_FLAG_READONLY 128
#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering
#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering
+#define AV_OPT_FLAG_DEPRECATED (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information
//FIXME think about enc-audio, ... style flags
/**
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/pixdesc.h b/csrc/thirdparty/ffmpeg/include/libavutil/pixdesc.h
index 1ab3727..c055810 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/pixdesc.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/pixdesc.h
@@ -167,12 +167,8 @@
/**
* The pixel format has an alpha channel. This is set on all formats that
- * support alpha in some way. The exception is AV_PIX_FMT_PAL8, which can
- * carry alpha as part of the palette. Details are explained in the
- * AVPixelFormat enum, and are also encoded in the corresponding
- * AVPixFmtDescriptor.
- *
- * The alpha is always straight, never pre-multiplied.
+ * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always
+ * straight, never pre-multiplied.
*
* If a codec or a filter does not support alpha, it should set all alpha to
* opaque, or use the equivalent pixel formats without alpha component, e.g.
@@ -347,7 +343,13 @@
* format writes the values corresponding to the palette
* component c in data[1] to dst, rather than the palette indexes in
* data[0]. The behavior is undefined if the format is not paletted.
+ * @param dst_element_size size of elements in dst array (2 or 4 byte)
*/
+void av_read_image_line2(void *dst, const uint8_t *data[4],
+ const int linesize[4], const AVPixFmtDescriptor *desc,
+ int x, int y, int c, int w, int read_pal_component,
+ int dst_element_size);
+
void av_read_image_line(uint16_t *dst, const uint8_t *data[4],
const int linesize[4], const AVPixFmtDescriptor *desc,
int x, int y, int c, int w, int read_pal_component);
@@ -365,7 +367,12 @@
* @param y the vertical coordinate of the first pixel to write
* @param w the width of the line to write, that is the number of
* values to write to the image line
+ * @param src_element_size size of elements in src array (2 or 4 byte)
*/
+void av_write_image_line2(const void *src, uint8_t *data[4],
+ const int linesize[4], const AVPixFmtDescriptor *desc,
+ int x, int y, int c, int w, int src_element_size);
+
void av_write_image_line(const uint16_t *src, uint8_t *data[4],
const int linesize[4], const AVPixFmtDescriptor *desc,
int x, int y, int c, int w);
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/pixfmt.h b/csrc/thirdparty/ffmpeg/include/libavutil/pixfmt.h
index e184a56..8b54c94 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/pixfmt.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/pixfmt.h
@@ -42,6 +42,10 @@
* This is stored as BGRA on little-endian CPU architectures and ARGB on
* big-endian CPUs.
*
+ * @note
+ * If the resolution is not a multiple of the chroma subsampling factor
+ * then the chroma plane resolution must be rounded up.
+ *
* @par
* When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized
* image data is stored in AVFrame.data[0]. The palette is transported in
@@ -330,6 +334,20 @@
*/
AV_PIX_FMT_OPENCL,
+ AV_PIX_FMT_GRAY14BE, ///< Y , 14bpp, big-endian
+ AV_PIX_FMT_GRAY14LE, ///< Y , 14bpp, little-endian
+
+ AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian
+ AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian
+
+ AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian
+ AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian
+ AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian
+ AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian
+
+ AV_PIX_FMT_NV24, ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+ AV_PIX_FMT_NV42, ///< as above, but U and V bytes are swapped
+
AV_PIX_FMT_NB ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
};
@@ -349,6 +367,7 @@
#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE)
#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE)
#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE)
+#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE)
#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)
#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE)
#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE)
@@ -397,12 +416,16 @@
#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE)
#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE)
+#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE)
+
#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE)
#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE)
#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE)
#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)
#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)
#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)
+#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE)
+#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE)
#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)
#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)
#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/threadmessage.h b/csrc/thirdparty/ffmpeg/include/libavutil/threadmessage.h
index 8480a0a..42ce655 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/threadmessage.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/threadmessage.h
@@ -96,6 +96,14 @@
void (*free_func)(void *msg));
/**
+ * Return the current number of messages in the queue.
+ *
+ * @return the current number of messages or AVERROR(ENOSYS) if lavu was built
+ * without thread support
+ */
+int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq);
+
+/**
* Flush the message queue
*
* This function is mostly equivalent to reading and free-ing every message
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/tx.h b/csrc/thirdparty/ffmpeg/include/libavutil/tx.h
new file mode 100644
index 0000000..b1f2d96
--- /dev/null
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/tx.h
@@ -0,0 +1,81 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TX_H
+#define AVUTIL_TX_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+typedef struct AVTXContext AVTXContext;
+
+typedef struct AVComplexFloat {
+ float re, im;
+} AVComplexFloat;
+
+enum AVTXType {
+ /**
+ * Standard complex to complex FFT with sample data type AVComplexFloat.
+ * Scaling currently unsupported
+ */
+ AV_TX_FLOAT_FFT = 0,
+ /**
+ * Standard MDCT with sample data type of float and a scale type of
+ * float. Length is the frame size, not the window size (which is 2x frame)
+ */
+ AV_TX_FLOAT_MDCT = 1,
+};
+
+/**
+ * Function pointer to a function to perform the transform.
+ *
+ * @note Using a different context than the one allocated during av_tx_init()
+ * is not allowed.
+ *
+ * @param s the transform context
+ * @param out the output array
+ * @param in the input array
+ * @param stride the input or output stride (depending on transform direction)
+ * in bytes, currently implemented for all MDCT transforms
+ */
+typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride);
+
+/**
+ * Initialize a transform context with the given configuration
+ * Currently power of two lengths from 4 to 131072 are supported, along with
+ * any length decomposable to a power of two and either 3, 5 or 15.
+ *
+ * @param ctx the context to allocate, will be NULL on error
+ * @param tx pointer to the transform function pointer to set
+ * @param type type the type of transform
+ * @param inv whether to do an inverse or a forward transform
+ * @param len the size of the transform in samples
+ * @param scale pointer to the value to scale the output if supported by type
+ * @param flags currently unused
+ *
+ * @return 0 on success, negative error code on failure
+ */
+int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type,
+ int inv, int len, const void *scale, uint64_t flags);
+
+/**
+ * Frees a context and sets ctx to NULL, does nothing when ctx == NULL
+ */
+void av_tx_uninit(AVTXContext **ctx);
+
+#endif /* AVUTIL_TX_H */
diff --git a/csrc/thirdparty/ffmpeg/include/libavutil/version.h b/csrc/thirdparty/ffmpeg/include/libavutil/version.h
index 3a63e63..24ca8ab 100644
--- a/csrc/thirdparty/ffmpeg/include/libavutil/version.h
+++ b/csrc/thirdparty/ffmpeg/include/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
-#define LIBAVUTIL_VERSION_MINOR 14
+#define LIBAVUTIL_VERSION_MINOR 31
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/csrc/thirdparty/ffmpeg/include/libswscale/version.h b/csrc/thirdparty/ffmpeg/include/libswscale/version.h
index 6d80527..acb289d 100644
--- a/csrc/thirdparty/ffmpeg/include/libswscale/version.h
+++ b/csrc/thirdparty/ffmpeg/include/libswscale/version.h
@@ -27,7 +27,7 @@
#include "libavutil/version.h"
#define LIBSWSCALE_VERSION_MAJOR 5
-#define LIBSWSCALE_VERSION_MINOR 1
+#define LIBSWSCALE_VERSION_MINOR 5
#define LIBSWSCALE_VERSION_MICRO 100
#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
diff --git a/csrc/thirdparty/ffmpeg/lib/libavcodec.a b/csrc/thirdparty/ffmpeg/lib/libavcodec.a
index a48e21a..05f35ec 100644
--- a/csrc/thirdparty/ffmpeg/lib/libavcodec.a
+++ b/csrc/thirdparty/ffmpeg/lib/libavcodec.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libavfilter.a b/csrc/thirdparty/ffmpeg/lib/libavfilter.a
index 2e0e93f..d1b7d7e 100644
--- a/csrc/thirdparty/ffmpeg/lib/libavfilter.a
+++ b/csrc/thirdparty/ffmpeg/lib/libavfilter.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libavformat.a b/csrc/thirdparty/ffmpeg/lib/libavformat.a
index d658302..ef6f946 100644
--- a/csrc/thirdparty/ffmpeg/lib/libavformat.a
+++ b/csrc/thirdparty/ffmpeg/lib/libavformat.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libavutil.a b/csrc/thirdparty/ffmpeg/lib/libavutil.a
index ed21be1..81936d7 100644
--- a/csrc/thirdparty/ffmpeg/lib/libavutil.a
+++ b/csrc/thirdparty/ffmpeg/lib/libavutil.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libswscale.a b/csrc/thirdparty/ffmpeg/lib/libswscale.a
index 1d605df..60881be 100644
--- a/csrc/thirdparty/ffmpeg/lib/libswscale.a
+++ b/csrc/thirdparty/ffmpeg/lib/libswscale.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libx264.a b/csrc/thirdparty/ffmpeg/lib/libx264.a
index dd0c1b7..31f3237 100644
--- a/csrc/thirdparty/ffmpeg/lib/libx264.a
+++ b/csrc/thirdparty/ffmpeg/lib/libx264.a
Binary files differ
diff --git a/csrc/thirdparty/ffmpeg/lib/libx265.a b/csrc/thirdparty/ffmpeg/lib/libx265.a
index 673d66c..d4c3dce 100644
--- a/csrc/thirdparty/ffmpeg/lib/libx265.a
+++ b/csrc/thirdparty/ffmpeg/lib/libx265.a
Binary files differ
diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 3073a45..7fd8229 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -43,7 +43,7 @@
pthread_mutex_lock(&mtx);
if (q.empty()) {
gettimeofday(&now, NULL);
- t.tv_sec = now.tv_sec + 5;
+ t.tv_sec = now.tv_sec + 3;
t.tv_nsec = now.tv_usec * 1000;
// pthread_cond_wait(&cond, &mtx);
pthread_cond_timedwait(&cond, &mtx, &t);
diff --git a/csrc/thirdparty/gb28181/include/librtsp.h b/csrc/thirdparty/gb28181/include/librtsp.h
index a2d5286..b9bdefd 100644
--- a/csrc/thirdparty/gb28181/include/librtsp.h
+++ b/csrc/thirdparty/gb28181/include/librtsp.h
@@ -2,43 +2,43 @@
#define __LIB_RTSP_H__
-#define RTSP_ERR_OK 0 //成功
-//错误码
-#define RTSP_ERR_PARAM -1001 //参数错误
-#define RTSP_ERR_TIMEOUT -1002 //超时
-#define RTSP_ERR_OPTIONS -1003 //options 请求失败
-#define RTSP_ERR_DESCRIBE -1004 //describe请求失败
-#define RTSP_ERR_SETUP -1005 //setup请求失败
-#define RTSP_ERR_PLAY -1006 //play请求失败
-#define RTSP_ERR_PAUSE -1007 //pause请求失败
-#define RTSP_ERR_TEARDOWN -1008 //teardown请求失败
-#define RTSP_ERR_NO_MEMORY -1009 //申请内存失败
-#define RTSP_ERR_CONNECT -1010 //connect失败
-#define RTSP_ERR_INITPORT -1011 //初始化端口失败
+#define RTSP_ERR_OK 0 //鎴愬姛
+//閿欒鐮�
+#define RTSP_ERR_PARAM -1001 //鍙傛暟閿欒
+#define RTSP_ERR_TIMEOUT -1002 //瓒呮椂
+#define RTSP_ERR_OPTIONS -1003 //options 璇锋眰澶辫触
+#define RTSP_ERR_DESCRIBE -1004 //describe璇锋眰澶辫触
+#define RTSP_ERR_SETUP -1005 //setup璇锋眰澶辫触
+#define RTSP_ERR_PLAY -1006 //play璇锋眰澶辫触
+#define RTSP_ERR_PAUSE -1007 //pause璇锋眰澶辫触
+#define RTSP_ERR_TEARDOWN -1008 //teardown璇锋眰澶辫触
+#define RTSP_ERR_NO_MEMORY -1009 //鐢宠鍐呭瓨澶辫触
+#define RTSP_ERR_CONNECT -1010 //connect澶辫触
+#define RTSP_ERR_INITPORT -1011 //鍒濆鍖栫鍙eけ璐�
-//码流传输方式
+//鐮佹祦浼犺緭鏂瑰紡
typedef enum
{
- E_STREAM_TRANS_UDP = 1, //UDP传输码流
- E_STREAM_TRANS_TCPACTIVE = 2, //GB28181 TCP主动 码流传输方式 TcpClient
- E_STREAM_TRANS_TCPPASSIVE = 3, //GB28181 TCP被动 码流传输方式 TcpServer
+ E_STREAM_TRANS_UDP = 1, //UDP浼犺緭鐮佹祦
+ E_STREAM_TRANS_TCPACTIVE = 2, //GB28181 TCP涓诲姩 鐮佹祦浼犺緭鏂瑰紡 TcpClient
+ E_STREAM_TRANS_TCPPASSIVE = 3, //GB28181 TCP琚姩 鐮佹祦浼犺緭鏂瑰紡 TcpServer
}StreamTransType_E;
-//视频请求类型
+//瑙嗛璇锋眰绫诲瀷
typedef enum
{
- E_VIDEO_REQUEST_REALPLAY = 1, //请求实时视频
- E_VIDEO_REQUEST_PLAYBACK = 2, //请求历史视频
- E_VIDEO_REQUEST_DOWNLOAD = 3, //历史视频下载
+ E_VIDEO_REQUEST_REALPLAY = 1, //璇锋眰瀹炴椂瑙嗛
+ E_VIDEO_REQUEST_PLAYBACK = 2, //璇锋眰鍘嗗彶瑙嗛
+ E_VIDEO_REQUEST_DOWNLOAD = 3, //鍘嗗彶瑙嗛涓嬭浇
}VideoRequestType_E;
-#define HIS_VIDEO_CTRL_PLAY 1 //点播播放控制
-#define HIS_VIDEO_CTRL_FAST 2 //点播快放控制 参数范围:1-32倍
-#define HIS_VIDEO_CTRL_SLOW 3 //点播慢放控制 参数范围:1-32倍
-#define HIS_VIDEO_CTRL_PAUSE 4 //点播暂停控制
-#define HIS_VIDEO_CTRL_JUMP 5 //点播跳转控制 参数范围:从开始计算跳转的时间 (时间单位:秒)
+#define HIS_VIDEO_CTRL_PLAY 1 //鐐规挱鎾斁鎺у埗
+#define HIS_VIDEO_CTRL_FAST 2 //鐐规挱蹇斁鎺у埗 鍙傛暟鑼冨洿:1-32鍊�
+#define HIS_VIDEO_CTRL_SLOW 3 //鐐规挱鎱㈡斁鎺у埗 鍙傛暟鑼冨洿:1-32鍊�
+#define HIS_VIDEO_CTRL_PAUSE 4 //鐐规挱鏆傚仠鎺у埗
+#define HIS_VIDEO_CTRL_JUMP 5 //鐐规挱璺宠浆鎺у埗 鍙傛暟鑼冨洿:浠庡紑濮嬭绠楄烦杞殑鏃堕棿 (鏃堕棿鍗曚綅:绉�)
-// 码流回调的数据类型
+// 鐮佹祦鍥炶皟鐨勬暟鎹被鍨�
#define GB_VIDEO_STREAM_H264 0
#define GB_VIDEO_STREAM_MPEG2 1 // MPEG4
#define GB_VIDEO_STREAM_MPEG4 2 // MPEG4
@@ -46,20 +46,20 @@
#define GB_VIDEO_STREAM_3GP 4 // 3GP
#define GB_VIDEO_STREAM_H265 5 //H265
-// 码流回调帧数据类型 I帧 P帧 目前只判断是否为I帧
+// 鐮佹祦鍥炶皟甯ф暟鎹被鍨� I甯� P甯� 鐩墠鍙垽鏂槸鍚︿负I甯�
#define GB_VIDEO_FRAME_I 1
#define GB_VIDEO_FRAME_P 2
////////////////////////////////////////////////////////////////////////////////
-// 函数名:码流回调函数
-// 描述:
-// 参数:datatype:码流格式数据类型(H264 H265等) frametype:帧类型(I帧 P帧)
-// datalen:长度 data:码流数据 userdata:用户指针
+// 鍑芥暟鍚嶏細鐮佹祦鍥炶皟鍑芥暟
+// 鎻忚堪锛�
+// 鍙傛暟锛歞atatype:鐮佹祦鏍煎紡鏁版嵁绫诲瀷(H264 H265绛�) frametype:甯х被鍨�(I甯� P甯�)
+// datalen锛氶暱搴� data锛氱爜娴佹暟鎹� userdata锛氱敤鎴锋寚閽�
//
-// 返回值:会话句柄
-// 。
-// 说明:
-// 保留原模块接口。
+// 杩斿洖鍊硷細浼氳瘽鍙ユ焺
+// 銆�
+// 璇存槑锛�
+// 淇濈暀鍘熸ā鍧楁帴鍙c��
////////////////////////////////////////////////////////////////////////////////
typedef void (*PlayCallBack2)(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata);
@@ -68,41 +68,41 @@
#endif
////////////////////////////////////////////////////////////////////////////////
-// 函数名:RTSPSTREAM_Open
-// 描述:设置回调函数。
-// 参数:rtsp地址、 码流回调函数、用户指针
+// 鍑芥暟鍚嶏細RTSPSTREAM_Open
+// 鎻忚堪锛氳缃洖璋冨嚱鏁般��
+// 鍙傛暟锛歳tsp鍦板潃銆� 鐮佹祦鍥炶皟鍑芥暟銆佺敤鎴锋寚閽�
//
//
-// 返回值:会话句柄
-// 。
-// 说明:
-// 保留原模块接口。
+// 杩斿洖鍊硷細浼氳瘽鍙ユ焺
+// 銆�
+// 璇存槑锛�
+// 淇濈暀鍘熸ā鍧楁帴鍙c��
////////////////////////////////////////////////////////////////////////////////
long RTSPSTREAM_Open(const char *rtspurl, PlayCallBack2 streamcallback, long userdata);
////////////////////////////////////////////////////////////////////////////////
-// 函数名:RTSPSTREAM_Contrl
-// 描述:设置回调函数。
-// 参数:会话句柄, 控制类型, 控制参数
+// 鍑芥暟鍚嶏細RTSPSTREAM_Contrl
+// 鎻忚堪锛氳缃洖璋冨嚱鏁般��
+// 鍙傛暟锛氫細璇濆彞鏌勶紝 鎺у埗绫诲瀷锛� 鎺у埗鍙傛暟
//
//
-// 返回值:
-// 。
-// 说明:
-// 保留原模块接口。
+// 杩斿洖鍊硷細
+// 銆�
+// 璇存槑锛�
+// 淇濈暀鍘熸ā鍧楁帴鍙c��
////////////////////////////////////////////////////////////////////////////////
long RTSPSTREAM_Contrl(long handle, int ctrltype, double ctrlparam);
////////////////////////////////////////////////////////////////////////////////
-// 函数名:RTSPSTREAM_Close
-// 描述:设置回调函数。
-// 参数:会话句柄
+// 鍑芥暟鍚嶏細RTSPSTREAM_Close
+// 鎻忚堪锛氳缃洖璋冨嚱鏁般��
+// 鍙傛暟锛氫細璇濆彞鏌�
//
//
-// 返回值:
-// 。
-// 说明:
-// 保留原模块接口。
+// 杩斿洖鍊硷細
+// 銆�
+// 璇存槑锛�
+// 淇濈暀鍘熸ā鍧楁帴鍙c��
////////////////////////////////////////////////////////////////////////////////
long RTSPSTREAM_Close(long handle);
diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp
index 558d871..0dd8b69 100644
--- a/csrc/worker/decoder.cpp
+++ b/csrc/worker/decoder.cpp
@@ -20,15 +20,13 @@
{
decoder::decoder(ffwrapper::FormatIn *dec)
:decRef_(dec)
+ ,next_idx_(-1)
{}
decoder::~decoder(){
-
- std::lock_guard<std::mutex> l(mutex_frm_);
- for(auto i : list_frm_){
- free(i.data);
- }
- list_frm_.clear();
+
+ std::lock_guard<std::mutex> l(mutex_pkt_);
+ list_pkt_.clear();
}
int decoder::initDecoder(){
@@ -47,27 +45,6 @@
return 0;
}
- int decoder::saveFrame(AVFrame *frame, const int64_t &id){
- FRM frm;
- frm.width = frame->width;
- frm.height = frame->height;
- frm.format = frame->format;
- frm.id = id;
- frm.data = cvbridge::extractFrame(frame, &frm.length);
-
- std::lock_guard<std::mutex> l(mutex_frm_);
- while(list_frm_.size() > 50){
- for(int i = 0; i < 12; i++){
- auto t = list_frm_.front();
- free(t.data);
- list_frm_.pop_front();
- }
- }
- if (!frm.data) return 0;
- list_frm_.push_back(frm);
- return list_frm_.size();
- }
-
int decoder::SetFrame(const CPacket &pkt){
auto data = pkt.data;
@@ -78,36 +55,82 @@
if (initDecoder() != 0) return -30;
}
- AVFrame *frame = av_frame_alloc();
- AVPacket np(data->getAVPacket());
- av_copy_packet(&np, &data->getAVPacket());
- auto ret = decRef_->decode(frame, &np);
- av_packet_unref(&np);
-
- if (ret == 0){
- saveFrame(frame, pkt.v_id);
+ std::lock_guard<std::mutex> l(mutex_pkt_);
+ if (data->getAVPacket().flags & AV_PKT_FLAG_KEY){
+ list_pkt_.clear();
}
- av_frame_free(&frame);
- return ret;
+ list_pkt_.push_back(pkt);
+
+ return list_pkt_.size();
}
void decoder::GetFrame(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
- std::lock_guard<std::mutex> l(mutex_frm_);
- if(list_frm_.empty()){
- *data = NULL;
- *w = *h = 0;
- *id = -1;
- return;
+ AVFrame *frame = NULL;
+
+ {
+ std::lock_guard<std::mutex> l(mutex_pkt_);
+ if (list_pkt_.empty()) return;
+ auto check = list_pkt_.front();
+ if (check.id > next_idx_){
+ next_idx_ = -1;
+ logIt("decoder new list cpacket");
+ }
+
+ for (auto &i : list_pkt_){
+ if (i.id < next_idx_){
+ continue;
+ }
+
+ *id = i.v_id;
+ auto data = i.data;
+
+ AVFrame *frm = av_frame_alloc();
+ AVPacket np(data->getAVPacket());
+ av_copy_packet(&np, &data->getAVPacket());
+ auto ret = decRef_->decode(frm, &np);
+ av_packet_unref(&np);
+ if (ret == 0){
+ next_idx_ = i.id + 1;
+ if (frame) {av_frame_free(&frame); frame = NULL;}
+ frame = frm;
+ }
+ }
}
- auto p = list_frm_.front();
- list_frm_.pop_front();
- *data = p.data;
- *id = p.id;
- *w = p.width;
- *h = p.height;
- *format = p.format;
- *length = p.length;
+ if (!frame) return;
+
+ int pix_fmt = frame->format;
+ int width = frame->width;
+ int height = frame->height;
+ int len = 0;
+
+ uint8_t *origin = cvbridge::extractFrame(frame, &len);
+ av_frame_free(&frame);
+ if (!origin) return;
+
+ uint8_t *finale = NULL;
+ if (pix_fmt != AV_PIX_FMT_NV12){
+ finale = (uint8_t*)malloc(len);
+
+ unsigned char* SrcU = origin + width * height;
+ unsigned char* SrcV = SrcU + width * height / 4 ;
+ unsigned char* DstU = finale + width * height;
+ memcpy(finale, origin, width * height);
+ int i = 0;
+ for( i = 0 ; i < width * height / 4 ; i++ ){
+ *(DstU++) = *(SrcU++);
+ *(DstU++) = *(SrcV++);
+ }
+ free(origin);
+ }else{
+ finale = origin;
+ }
+
+ *data = finale;
+ *w = width;
+ *h = height;
+ *format = pix_fmt;
+ *length = len;
}
} // namespace cffmpeg_wrap
diff --git a/csrc/worker/decoder.hpp b/csrc/worker/decoder.hpp
index a1946bd..7f87180 100644
--- a/csrc/worker/decoder.hpp
+++ b/csrc/worker/decoder.hpp
@@ -22,27 +22,19 @@
namespace cffmpeg_wrap
{
- typedef struct _frm{
- uint8_t *data;
- int length;
- int width;
- int height;
- int format;
- int64_t id;
- }FRM;
-
class decoder
{
private:
ffwrapper::FormatIn *decRef_;
-
- std::list<FRM> list_frm_;
- std::mutex mutex_frm_;
+ std::list<CPacket> list_pkt_;
+ std::mutex mutex_pkt_;
+
+ int64_t next_idx_;
+
private:
int initDecoder();
- int saveFrame(AVFrame *frame, const int64_t &id);
public:
void Start();
int SetFrame(const CPacket &pkt);
diff --git a/csrc/worker/rec.cpp b/csrc/worker/rec.cpp
index 9c5ae1e..9a306b2 100644
--- a/csrc/worker/rec.cpp
+++ b/csrc/worker/rec.cpp
@@ -16,7 +16,7 @@
using namespace ffwrapper;
using namespace cffmpeg_wrap::buz;
-static const int cache_time = 6 * 60;
+static const int cache_time = 3 * 60 + 30;
namespace cffmpeg_wrap
{
@@ -255,16 +255,18 @@
void rec::SetRecMinCacheTime(const int min){
// 鐢变簬鏁翠釜娴佺▼鑰楁椂,琛ュ伩time_offset_
- int fps = 25;
- if (recRef_){
- fps = recRef_->getFPS();
- }
- min_cache_len_ += min * fps;
+ // int fps = 25;
+ // if (recRef_){
+ // fps = recRef_->getFPS();
+ // }
+ // if (min_cache_len_ > (cache_time+min) * fps){
+ // return;
+ // }
+ // min_cache_len_ += min * fps;
}
int rec::shrinkCache(){
//瓒呰繃鏈�澶х紦瀛�,涓㈠純gop
-
while (list_pkt_.size() > min_cache_len_) {
list_pkt_.pop_front();
while(!list_pkt_.empty()){
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index a8e8f6c..1798683 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -46,6 +46,8 @@
,gb_(0)
,cpu_(0)
,run_dec_(false)
+ ,run_stream_(true)
+ ,run_rec_(false)
,thread_(nullptr)
,stop_stream_(false)
,stream_(nullptr)
@@ -63,6 +65,8 @@
,gb_(0)
,cpu_(0)
,run_dec_(false)
+ ,run_stream_(true)
+ ,run_rec_(false)
,thread_(nullptr)
,stop_stream_(false)
,stream_(nullptr)
@@ -166,9 +170,9 @@
p.pts = p.dts = AV_NOPTS_VALUE;
}
int flag = 0;
- if (stream_) stream_->SetPacket(pkt);
- if (decoder_ && run_dec_) flag = decoder_->SetFrame(pkt);
- if (rec_->Loaded()) rec_->SetPacket(pkt);
+ if (run_stream_ && stream_) stream_->SetPacket(pkt);
+ if (run_dec_ && decoder_) flag = decoder_->SetFrame(pkt);
+ if (run_rec_ && rec_->Loaded()) rec_->SetPacket(pkt);
return flag;
}
@@ -202,7 +206,7 @@
int64_t v_id = id;
int64_t a_id = id;
- bool exist = access(input_url_.c_str(), 0) == 0 ? true : false;
+ bool exist = access(input_url_.c_str(), 0) == 0;
while(!stop_stream_.load()){
auto data(std::make_shared<CodedData>());
@@ -241,11 +245,16 @@
}
deinit_worker();
+ if (exist) break;
}
}
void Wrapper::SetRecMinCacheTime(const int mind){
rec_->SetRecMinCacheTime(mind);
+ }
+
+ void Wrapper::OpenRecorder(){
+ run_rec_ = true;
}
void Wrapper::BuildRecorder(const char* id, const char *output, const int64_t &fid, const int mindur, const int maxdur, const bool audio){
@@ -260,7 +269,6 @@
[=]{rec_->NewRec(rid.c_str(), dir.c_str(), fid, mindur, maxdur, a);};
}
}
-
int Wrapper::FireRecorder(const char* sid,const int64_t &id){
if (rec_->Loaded()){
rec_->FireRecSignal(sid, id);
@@ -273,7 +281,7 @@
}
}
////////decoder
- void Wrapper::BuildDecoder(){
+ void Wrapper::OpenDecoder(){
run_dec_ = true;
}
@@ -283,6 +291,10 @@
}
}
+ void Wrapper::CloseStream(){
+ run_stream_ = false;
+ }
+
void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
if (stream_){
stream_->GetPacket(pktData, size, key);
@@ -298,69 +310,6 @@
// return val: -1 open error; -2, find stream error; -3, converter create
namespace cffmpeg_wrap{ // start test functions
- uint8_t* Decode(const char *file, const int gb, int *w, int *h){
- VideoProp prop;
- prop.url_ = file;
- prop.gpu_acc_ = false;
-
- std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
- int flag = -1;
- if (gb){
- flag = in->openGb28181(file, NULL);
- }else{
- flag = in->open(file, NULL);
- }
-
- std::unique_ptr<cvbridge> bridge_(nullptr);
-
- if(flag == 0){
- if(!in->findStreamInfo(NULL)){
- logIt("yolo can't find video stream\n");
- *w = *h = -2;
- return NULL;
- }
- auto flag = in->openCodec(NULL);
- if(flag){
- auto dec_ctx = in->getCodecContext();
-
- AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24;
- bridge_.reset(new cvbridge(
- dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
- dec_ctx->width, dec_ctx->height, pix_fmt, SWS_BICUBIC));
-
- }else{
- logIt("FormatIn openCodec Failed!");
- *w = *h = -3;
- return NULL;
- }
- }else{
- logIt("open %s error", file);
- *w = *h = -1;
- return NULL;
- }
-
- uint8_t *pic = NULL;
- *w = *h = 0;
-
- int tryTime = 0;
- while (tryTime++ < 100){
-
- auto data(std::make_shared<CodedData>());
- if (in->readPacket(&data->getAVPacket()) == 0){
-
- auto frame(std::make_shared<FrameData>());
- AVFrame *frm = frame->getAVFrame();
- if(in->decode(frm, &data->getAVPacket()) == 0){
- *w = frm->width;
- *h = frm->height;
- pic = bridge_->convert2Data(frm);
- break;
- }
- }
- }
-
- return pic;
- }
/////// for encoder
typedef struct _PicEncoder{
FormatOut *enc;
@@ -369,11 +318,13 @@
int fps;
int br;
int gi;
+ int pix_fmt;
int flag;
cvbridge *bridge;
} PicEncoder;
- void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
+ void *CreateEncoder(const int w, const int h, const int fps, const int br,
+ const int pix_fmt, const int scale_flag, const int gi){
PicEncoder *e = (PicEncoder*)malloc(sizeof(PicEncoder));
e->enc = NULL;
@@ -382,6 +333,7 @@
e->fps = fps;
e->br = br;
e->gi = gi;
+ e->pix_fmt = pix_fmt;
e->flag = scale_flag;
e->bridge = NULL;
@@ -415,14 +367,16 @@
PicEncoder *e = (PicEncoder*)hdl;
auto ctx = e->enc->getCodecContext();
- AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24;
if (e->bridge == NULL){
e->bridge = new cvbridge(
- w, h, AV_PIX_FMT_BGR24,
+ w, h, e->pix_fmt,
e->w, e->h, ctx->pix_fmt, e->flag);
}
- AVFrame *frame = cvbridge::fillFrame(in, w, h, pix_fmt);
+ AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, e->pix_fmt);
+ AVFrame *frame = e->bridge->convert2Frame(bgr_frame);
+ av_frame_free(&bgr_frame);
+
AVPacket *pkt = av_packet_alloc();
auto flag = e->enc->encode(pkt, frame);
@@ -450,57 +404,6 @@
return flag;
}
-///////////////////////////////////////////////////////////
- typedef struct _conv
- {
- int srcW;
- int srcH;
- int srcF;
- int dstW;
- int dstH;
- cvbridge *b;
- }Conv;
-
- void *CreateConvertor(const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag){
-
- auto bridge = new cvbridge(
- srcW, srcH, srcFormat,
- dstW, dstH, dstFormat, flag);
- if (!bridge) return NULL;
-
- Conv *c = (Conv*)malloc(sizeof(Conv));
- c->b = bridge;
- c->dstW = dstW;
- c->dstH = dstH;
- c->srcW = srcW;
- c->srcH = srcH;
- c->srcF = srcFormat;
-
- return c;
- }
-
- uint8_t *Convert(void *h, uint8_t *src){
- Conv *c = (Conv*)h;
-
- auto b = c->b;
-
- AVFrame *tmp_frm = cvbridge::fillFrame(src, c->srcW, c->srcH, c->srcF);
- if (!tmp_frm) return NULL;
-
- unsigned char *picData = b->convert2Data(tmp_frm);
-
- av_frame_free(&tmp_frm);
-
- return picData;
- }
-
- void DestoryConvertor(void *h){
- Conv *c = (Conv*)h;
- delete c->b;
- free(c);
- }
-
int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){
int ret = 0;
std::string fn = rtspUrl;
@@ -521,6 +424,5 @@
handle_gb28181->deleteCamera();
return ret;
}
-
}
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index 4d51708..662f87d 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -53,16 +53,21 @@
int GetFPS(){return fps_;}
public: //decoder
- void BuildDecoder();
+ void OpenDecoder();
void GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id);
public: // push stream
+ void CloseStream();
void GetPacket(unsigned char **pktData, int *size, int *key);
+ public: // recorder
+ void OpenRecorder();
private:
// stream 鍙傛暟
std::string input_url_;
bool audio_;
int gb_, cpu_;
bool run_dec_;
+ bool run_stream_;
+ bool run_rec_;
// decoder 鍙傛暟
std::unique_ptr<std::thread> thread_;
std::atomic_bool stop_stream_;
@@ -84,12 +89,6 @@
void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
void DestroyEncoder(void *h);
int Encode(void *hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
-
- void *CreateConvertor(const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag);
- uint8_t *Convert(void *h, uint8_t *src);
- void DestoryConvertor(void *h);
-
int GetGb28181Pic(const char *filename, char *retData, int *retDataLen);
}
diff --git a/goconv.go b/goconv.go
deleted file mode 100644
index 06dba30..0000000
--- a/goconv.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package goffmpeg
-
-/*
-#include <stdlib.h>
-#include "libcffmpeg.h"
-*/
-import "C"
-import "unsafe"
-
-const (
- // ScaleNone self add no scale raw frame data
- ScaleNone = 0
- // ScaleFastBilinear SWS_FAST_BILINEAR
- ScaleFastBilinear = 1
- // ScaleBilinear SWS_BILINEAR
- ScaleBilinear = 2
- // ScaleBicubic SWS_BICUBIC
- ScaleBicubic = 4
- // ScaleX SWS_X
- ScaleX = 8
- // ScalePoint SWS_POINT
- ScalePoint = 0x10
- // ScaleArea SWS_AREA
- ScaleArea = 0x20
- // ScaleBicublin SWS_BICUBLIN
- ScaleBicublin = 0x40
- // ScaleGauss SWS_GAUSS
- ScaleGauss = 0x80
- // ScaleSinc SWS_SINC
- ScaleSinc = 0x100
- // ScaleLancZos SWS_LANCZOS
- ScaleLancZos = 0x200
- // ScaleSpline SWS_SPLINE
- ScaleSpline = 0x400
-)
-
-// SrcFormat format
-const SrcFormat = 23
-
-// DstFormat format
-const DstFormat = 3
-
-// GoConv conv
-type GoConv struct {
- SrcW int
- SrcH int
- DstW int
- DstH int
-
- conv C.cconv
-}
-
-// NewConv new conv
-func NewConv(srcW, srcH, dstW, dstH, scaleFlag int) *GoConv {
- c := C.wrap_fn_create_conv(unsafe.Pointer(libcffmpeg), C.int(srcW), C.int(srcH), C.int(SrcFormat),
- C.int(dstW), C.int(dstH), C.int(DstFormat), C.int(scaleFlag))
-
- if c == nil {
- return nil
- }
-
- return &GoConv{
- srcW,
- srcH,
- dstW,
- dstH,
- c,
- }
-}
-
-// NewResizer resize
-func NewResizer(srcW, srcH, format, dstW, dstH, scaleFlag int) *GoConv {
- c := C.wrap_fn_create_conv(unsafe.Pointer(libcffmpeg), C.int(srcW), C.int(srcH), C.int(format),
- C.int(dstW), C.int(dstH), C.int(format), C.int(scaleFlag))
-
- if c == nil {
- return nil
- }
-
- return &GoConv{
- srcW,
- srcH,
- dstW,
- dstH,
- c,
- }
-}
-
-// Free free
-func (c *GoConv) Free() {
- if c.conv != nil {
- C.wrap_fn_destroy_conv(unsafe.Pointer(libcffmpeg), c.conv)
- }
-}
-
-// ConvToPicture conv to pic
-func (c *GoConv) ConvToPicture(src []byte) []byte {
- if c.conv == nil {
- return nil
- }
-
- cin := C.CBytes(src)
- defer C.free(cin)
-
- bgr := C.wrap_fn_conv(unsafe.Pointer(libcffmpeg), c.conv, (*C.uchar)(cin))
- defer C.free(unsafe.Pointer(bgr))
-
- if bgr != nil {
- return C.GoBytes(bgr, C.int(c.DstW*c.DstH*3))
- }
-
- return nil
-}
-
-// Resize resize
-func (c *GoConv) Resize(src []byte) []byte {
- if c.SrcW == c.DstW && c.SrcH == c.DstH {
- return src
- }
- return c.ConvToPicture(src)
-}
-
-/////////////// for conv
diff --git a/godec.go b/godec.go
index aab8c7a..25baa88 100644
--- a/godec.go
+++ b/godec.go
@@ -19,10 +19,27 @@
var srcW, srcH, srcF C.int
p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
- if srcW == 0 || srcH == 0 {
+ if p == nil || length == 0 || srcW == 0 || srcH == 0 {
return nil, 0, 0, 0
}
defer C.free(unsafe.Pointer(p))
return C.GoBytes(p, length), int(srcW), int(srcH), int64(fid)
}
+
+// GetYUV2 get yuv data
+func (h *GoFFMPEG) GetYUV2() (unsafe.Pointer, []byte, int, int, int64) {
+ var fid C.long
+ var length C.int
+ var srcW, srcH, srcF C.int
+
+ p := C.wrap_fn_decoder_pic(unsafe.Pointer(libcffmpeg), h.ffmpeg, &srcW, &srcH, &srcF, &length, &fid)
+ if p == nil || length == 0 || srcW == 0 || srcH == 0 {
+ return nil, nil, 0, 0, 0
+ }
+ const maxLen = 0x7fffffff
+ size := int(length)
+ data := (*[maxLen]byte)(unsafe.Pointer(p))[:size:size]
+
+ return unsafe.Pointer(p), data, int(srcW), int(srcH), int64(fid)
+}
diff --git a/godecjpeg.go b/godecjpeg.go
deleted file mode 100644
index 6cef6af..0000000
--- a/godecjpeg.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package goffmpeg
-
-/*
-#include <stdlib.h>
-#include "libcffmpeg.h"
-*/
-import "C"
-
-import "unsafe"
-
-/////////////// for decoder
-
-// Decode decode jpeg file
-// return val: -1 open error; -2, find stream error; -3, converter create error
-func Decode(input string, gb bool) ([]byte, int, int) {
- in := C.CString(input)
- defer C.free(unsafe.Pointer(in))
-
- withGB := 0
- if gb {
- withGB = 1
- }
-
- var width C.int
- var height C.int
- p := C.wrap_fn_decode(unsafe.Pointer(libcffmpeg), in, C.int(withGB), &width, &height)
- defer C.free(p)
-
- if width > 0 && height > 0 {
- data := C.GoBytes(p, width*height*3)
- wid := int(width)
- hei := int(height)
- return data, wid, hei
- }
- return nil, int(width), int(height)
-}
diff --git a/goenc.go b/goenc.go
index d7a6b43..69aa3e4 100644
--- a/goenc.go
+++ b/goenc.go
@@ -21,7 +21,18 @@
}
return &GoEncoder{
- enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(sFlag), C.int(gi)),
+ enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(DstFormat), C.int(sFlag), C.int(gi)),
+ }
+}
+
+// NewEncoderWithPixFmt origin pix_fmt
+func NewEncoderWithPixFmt(w, h, fps, br, pixFmt, sFlag, gi int) *GoEncoder {
+ if w <= 0 || h <= 0 {
+ return nil
+ }
+
+ return &GoEncoder{
+ enc: C.wrap_fn_create_encoder(unsafe.Pointer(libcffmpeg), C.int(w), C.int(h), C.int(fps), C.int(br), C.int(pixFmt), C.int(sFlag), C.int(gi)),
}
}
@@ -37,10 +48,8 @@
var size C.int
var key C.int
- cin := C.CBytes(in)
- defer C.free(cin)
- p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, cin, C.int(w), C.int(h), &size, &key)
+ p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, unsafe.Pointer(&in[0]), C.int(w), C.int(h), &size, &key)
defer C.free(p)
if p != nil && size > 0 {
b := C.GoBytes(p, size)
@@ -53,3 +62,25 @@
}
return nil, 0, false
}
+
+// Encode2 pic
+func (e *GoEncoder) Encode2(in []byte, w, h int) (unsafe.Pointer, []byte, int, bool) {
+
+ var size C.int
+ var key C.int
+
+ p := C.wrap_fn_encode(unsafe.Pointer(libcffmpeg), e.enc, unsafe.Pointer(&in[0]), C.int(w), C.int(h), &size, &key)
+ if p != nil && size > 0 {
+
+ isKey := false
+ if key > 0 {
+ isKey = true
+ }
+ const maxLen = 0x7fffffff
+ length := int(size)
+ data := (*[maxLen]byte)(unsafe.Pointer(p))[:length:length]
+
+ return p, data, length, isKey
+ }
+ return nil, nil, 0, false
+}
diff --git a/goffmpeg.go b/goffmpeg.go
index a2f46bc..1844a22 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -12,6 +12,39 @@
"unsafe"
)
+const (
+ // ScaleNone self add no scale raw frame data
+ ScaleNone = 0
+ // ScaleFastBilinear SWS_FAST_BILINEAR
+ ScaleFastBilinear = 1
+ // ScaleBilinear SWS_BILINEAR
+ ScaleBilinear = 2
+ // ScaleBicubic SWS_BICUBIC
+ ScaleBicubic = 4
+ // ScaleX SWS_X
+ ScaleX = 8
+ // ScalePoint SWS_POINT
+ ScalePoint = 0x10
+ // ScaleArea SWS_AREA
+ ScaleArea = 0x20
+ // ScaleBicublin SWS_BICUBLIN
+ ScaleBicublin = 0x40
+ // ScaleGauss SWS_GAUSS
+ ScaleGauss = 0x80
+ // ScaleSinc SWS_SINC
+ ScaleSinc = 0x100
+ // ScaleLancZos SWS_LANCZOS
+ ScaleLancZos = 0x200
+ // ScaleSpline SWS_SPLINE
+ ScaleSpline = 0x400
+)
+
+// SrcFormat format NV
+const SrcFormat = 23
+
+// DstFormat format
+const DstFormat = 3
+
var libcffmpeg C.libcffmpeg
// InitFFmpeg init ffmepg
@@ -100,6 +133,14 @@
return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg))
}
+// ReleaseC release c memory
+func ReleaseC(p unsafe.Pointer) {
+ if p == nil {
+ return
+ }
+ C.free(unsafe.Pointer(p))
+}
+
// GetGBJpg Get GB28181 Jpg
func GetGBJpg(rtspUrl string) []byte {
rtsp := C.CString(rtspUrl)
diff --git a/gorec.go b/gorec.go
index eb44575..2f17b20 100644
--- a/gorec.go
+++ b/gorec.go
@@ -8,6 +8,11 @@
import "unsafe"
+// OpenRecorder rec func open
+func (h *GoFFMPEG) OpenRecorder() {
+ C.wrap_fn_open_rec(unsafe.Pointer(libcffmpeg), h.ffmpeg)
+}
+
// FireRecorder fire recorder
func (h *GoFFMPEG) FireRecorder(sid string, id int64) {
csid := C.CString(sid)
diff --git a/gostream.go b/gostream.go
index dc94166..a0af494 100644
--- a/gostream.go
+++ b/gostream.go
@@ -8,19 +8,43 @@
import "unsafe"
+// CloseStream close stream
+func (h *GoFFMPEG) CloseStream() {
+ C.wrap_fn_close_stream(unsafe.Pointer(libcffmpeg), h.ffmpeg)
+}
+
//GetAVPacket get AVPacket
func (h *GoFFMPEG) GetAVPacket() ([]byte, int, int) {
var key C.int
var size C.int
p := C.wrap_fn_get_avpacket(unsafe.Pointer(libcffmpeg), h.ffmpeg, &size, &key)
+ defer C.free(unsafe.Pointer(p))
if size <= 0 {
return nil, 0, -1
}
- defer C.free(unsafe.Pointer(p))
d := C.GoBytes(p, size)
s := int(size)
k := int(key)
return d, s, k
}
+
+//GetAVPacket2 get AVPacket
+func (h *GoFFMPEG) GetAVPacket2() (unsafe.Pointer, []byte, int, int) {
+ var key C.int
+ var size C.int
+
+ p := C.wrap_fn_get_avpacket(unsafe.Pointer(libcffmpeg), h.ffmpeg, &size, &key)
+ if size <= 0 {
+ return nil, nil, 0, -1
+ }
+
+ const maxLen = 0x7fffffff
+ length := int(size)
+ data := (*[maxLen]byte)(unsafe.Pointer(p))[:length:length]
+
+ k := int(key)
+
+ return p, data, length, k
+}
diff --git a/libcffmpeg.c b/libcffmpeg.c
index c6d05f8..616c046 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -95,6 +95,14 @@
fn_cpu(h);
}
+void wrap_fn_open_rec(void *lib, const cffmpeg h){
+ if (!fn_open_recorder){
+ fn_open_recorder = (lib_cffmpeg_open_recorder)dlsym(lib, "c_ffmpeg_open_recorder");
+ if (!fn_open_recorder) return;
+ }
+ fn_open_recorder(h);
+}
+
void wrap_fn_recorder(void *lib, const cffmpeg h, const char* id, const char* dir, const int64_t fid, int mind, int maxd, int audio){
if (!fn_recorder){
fn_recorder = (lib_cffmpeg_recorder)dlsym(lib, "c_ffmpeg_build_recorder");
@@ -143,6 +151,14 @@
return fn_decoder_pic(h, wid, hei, format, length, id);
}
+void wrap_fn_close_stream(void *lib, const cffmpeg h){
+ if (!fn_close_stream){
+ fn_close_stream = (lib_cffmpeg_close_stream)dlsym(lib, "c_ffmpeg_close_stream");
+ if (!fn_close_stream) return;
+ }
+ fn_close_stream(h);
+}
+
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key){
if(!fn_get_avpacket){
fn_get_avpacket = (lib_cffmpeg_avpacket)dlsym(lib, "c_ffmpeg_get_avpacket");
@@ -151,22 +167,13 @@
return fn_get_avpacket(h, size, key);
}
-// return val: -1 open error; -2, find stream error; -3, converter create error
-void* wrap_fn_decode(void *lib, const char* file, const int gb, int* wid, int* hei){
- if (!fn_decode){
- fn_decode = (lib_cffmpeg_decode)dlsym(lib, "c_ffmpeg_decode");
- release_if_err(fn_decode, lib);
- }
- return fn_decode(file, gb, wid, hei);
-}
-
// for encoder
-cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){
+cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi){
if (!fn_create_encoder){
fn_create_encoder = (lib_cffmpeg_create_encoder)dlsym(lib, "c_ffmpeg_create_encoder");
release_if_err(fn_create_encoder, lib);
}
- return fn_create_encoder(w, h, fps, br, scale_flag, gi);
+ return fn_create_encoder(w, h, fps, br, pix_fmt, scale_flag, gi);
}
void wrap_fn_destroy_encoder(void *lib, const cencoder h){
@@ -185,37 +192,10 @@
uint8_t *out = NULL;
const int flag = fn_encode(hdl, (uint8_t*)in, w, h, &out, out_size, key);
- if (flag > 0 && out != NULL) {
+ if (flag == 0 && out != NULL) {
return out;
}
*out_size = 0;
*key = 0;
return NULL;
-}
-
-// for conv
-cconv wrap_fn_create_conv(void *lib, const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag){
- if (!fn_create_conv){
- fn_create_conv = (lib_cffmpeg_create_conv)dlsym(lib, "c_ffmpeg_create_conv");
- release_if_err(fn_create_conv, lib);
- }
- return fn_create_conv(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flag);
-}
-
-void wrap_fn_destroy_conv(void *lib, const cconv h){
- if (!fn_destroy_conv){
- fn_destroy_conv = (lib_cffmpeg_destroy_conv)dlsym(lib, "c_ffmpeg_destroy_conv");
- if(!fn_destroy_conv) return;
- }
- fn_destroy_conv(h);
-}
-
-void* wrap_fn_conv(void *lib, const cconv h, uint8_t *in){
- if (!fn_conv){
- fn_conv = (lib_cffmpeg_conv)dlsym(lib, "c_ffmpeg_conv");
- release_if_err(fn_conv, lib);
- }
-
- return fn_conv(h, in);
}
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 59e6572..4ab0cea 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -18,14 +18,15 @@
typedef void (*lib_cffmpeg_gb28181)(const cffmpeg);
typedef char * (*lib_cffmpeg_get_gb28181_pic)(const char *rtspUrl, int *retDataLen);
typedef void (*lib_cffmpeg_cpu)(const cffmpeg);
+typedef void (*lib_cffmpeg_open_recorder)(const cffmpeg);
typedef void (*lib_cffmpeg_rec_duration)(const cffmpeg, const int, const int);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, const int64_t, int, int, int);
typedef void (*lib_cffmpeg_fire_recorder)(const cffmpeg, const char*, const int64_t);
typedef void (*lib_cffmpeg_info_recorder)(const cffmpeg, int*, char**, int*, char**, int*);
typedef void (*lib_cffmpeg_decoder)(const cffmpeg);
typedef void*(*lib_cffmpeg_pic)(const cffmpeg, int*, int*, int*, int*, int64_t*);
+typedef void (*lib_cffmpeg_close_stream)(const cffmpeg);
typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*);
-typedef void*(*lib_cffmpeg_decode)(const char*, const int, int*, int*);
static lib_cffmpeg_create fn_create = NULL;
static lib_cffmpeg_create2 fn_create2 = NULL;
@@ -35,14 +36,15 @@
static lib_cffmpeg_gb28181 fn_gb28181 = NULL;
static lib_cffmpeg_get_gb28181_pic fn_get_gb28181_pic = NULL;
static lib_cffmpeg_cpu fn_cpu = NULL;
+static lib_cffmpeg_open_recorder fn_open_recorder = NULL;
static lib_cffmpeg_rec_duration fn_rec_duration = NULL;
static lib_cffmpeg_recorder fn_recorder = NULL;
static lib_cffmpeg_fire_recorder fn_fire_recorder = NULL;
static lib_cffmpeg_info_recorder fn_info_recorder = NULL;
static lib_cffmpeg_decoder fn_decoder = NULL;
static lib_cffmpeg_pic fn_decoder_pic = NULL;
+static lib_cffmpeg_close_stream fn_close_stream = NULL;
static lib_cffmpeg_avpacket fn_get_avpacket = NULL;
-static lib_cffmpeg_decode fn_decode = NULL;
typedef void* libcffmpeg;
libcffmpeg init_libcffmpeg(const char *so_file);
@@ -56,17 +58,18 @@
void wrap_fn_run_gb28181(void *lib, const cffmpeg h);
char * wrap_fn_get_gb28181_pic(void *lib, const char *rtspUrl, int *retDataLen);
void wrap_fn_use_cpu(void *lib, const cffmpeg h);
+void wrap_fn_open_rec(void *lib, const cffmpeg h);
void wrap_fn_rec_duration(void *lib, const cffmpeg h, const int min, const int max);
void wrap_fn_recorder(void *lib, const cffmpeg h, const char* id, const char* dir, const int64_t fid, int mind, int maxd, int audio);
void wrap_fn_fire_recorder(void *lib, const cffmpeg h, const char *sid, const int64_t id);
void wrap_fn_info_recorder(void *lib, const cffmpeg, int* index, char** recid, int* recidLen, char** fpath, int* pathLen);
void wrap_fn_decoder(void *lib, const cffmpeg h);
void* wrap_fn_decoder_pic(void *lib, const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
+void wrap_fn_close_stream(void *lib, const cffmpeg h);
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key);
-void* wrap_fn_decode(void *lib, const char* file, const int gb, int* wid, int* hei);
// for encoder
typedef void* cencoder;
-typedef cencoder (*lib_cffmpeg_create_encoder)(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
+typedef cencoder (*lib_cffmpeg_create_encoder)(const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
typedef void (*lib_cffmpeg_destroy_encoder)(cencoder h);
typedef int (*lib_cffmpeg_encode)(cencoder hdl, uint8_t *in, const int w, const int h, uint8_t **out, int *size, int *key);
@@ -74,25 +77,10 @@
static lib_cffmpeg_destroy_encoder fn_destroy_encoder = NULL;
static lib_cffmpeg_encode fn_encode = NULL;
-cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int scale_flag, const int gi);
+cencoder wrap_fn_create_encoder(void *lib, const int w, const int h, const int fps, const int br, const int pix_fmt, const int scale_flag, const int gi);
void wrap_fn_destroy_encoder(void *lib, const cencoder h);
void* wrap_fn_encode(void *lib, cencoder hdl, void *in, const int w, const int h, int *out_size, int *key);
-
-// for conv
-typedef void *cconv;
-typedef cconv (*lib_cffmpeg_create_conv)(const int, const int, const int, const int, const int, const int, const int);
-typedef void* (*lib_cffmpeg_conv)(const cconv, uint8_t *in);
-typedef void (*lib_cffmpeg_destroy_conv)(const cconv);
-
-static lib_cffmpeg_create_conv fn_create_conv = NULL;
-static lib_cffmpeg_destroy_conv fn_destroy_conv = NULL;
-static lib_cffmpeg_conv fn_conv = NULL;
-
-cconv wrap_fn_create_conv(void *lib, const int srcW, const int srcH, const int srcFormat,
- const int dstW, const int dstH, const int dstFormat, const int flag);
-void wrap_fn_destroy_conv(void *lib, const cconv h);
-void* wrap_fn_conv(void *lib, const cconv h, uint8_t *in);
#ifdef __cplusplus
}
--
Gitblit v1.8.0