From ad4293b0704a418b96af278e18f5a27ca4ad7e02 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Thu, 12 May 2022 17:11:00 +0800 Subject: [PATCH 01/23] Add coding parameters and advanced functions --- package/encode_app/encode_app.mk | 1 + package/encode_app/src/main.cpp | 342 +++++++++++++++++++++- package/encode_app/src/roi_1920x1080.conf | 14 + package/venc_lib/src/enc_interface.h | 109 ++++--- package/venc_lib/src/libvenc.so | Bin 348496 -> 381872 bytes 5 files changed, 419 insertions(+), 47 deletions(-) create mode 100644 package/encode_app/src/roi_1920x1080.conf mode change 100644 => 100755 package/venc_lib/src/libvenc.so diff --git a/package/encode_app/encode_app.mk b/package/encode_app/encode_app.mk index 118c526..721850f 100644 --- a/package/encode_app/encode_app.mk +++ b/package/encode_app/encode_app.mk @@ -22,6 +22,7 @@ define ENCODE_APP_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/video_sample.conf $(TARGET_DIR)/app/encode_app/video_sample.conf $(INSTALL) -D -m 0755 $(@D)/imx219_0.conf $(TARGET_DIR)/app/encode_app/imx219_0.conf $(INSTALL) -D -m 0755 $(@D)/imx219_1.conf $(TARGET_DIR)/app/encode_app/imx219_1.conf + $(INSTALL) -D -m 0755 $(@D)/roi_1920x1080.conf $(TARGET_DIR)/app/encode_app/roi_1920x1080.conf endef $(eval $(generic-package)) diff --git a/package/encode_app/src/main.cpp b/package/encode_app/src/main.cpp index 4f9d0b4..6e42d5a 100644 --- a/package/encode_app/src/main.cpp +++ b/package/encode_app/src/main.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +using namespace std; #include "cJSON.h" #include "types.h" @@ -57,6 +59,8 @@ #define MIN(a,b) ((a) > (b) ? (b) : (a)) static int received_sigterm = 0; +typedef std::vector ENC_ROI_CFG_ARRAY; + struct share_memory_alloc_align_args { unsigned int size; @@ -139,6 +143,9 @@ typedef struct char *conf_filename; struct video_info dev_info[2]; IRtspServerEX **pRtspServer; + char **roi_filename; + ENC_ROI_CFG_ARRAY* aryEncRoiCfg; + int* nLTRFreq;//Specifies the Long Term reference picture refresh frequency in number of frames EncSettings *Cfg; int *ch_en; char **infilename; @@ -629,6 +636,21 @@ static void *encode_ch(void *arg) droped = 0; } } + + //set LTR + if (pCtx->Cfg[channel].bEnableLTR && pCtx->nLTRFreq[channel] > 0) + { + if (0 == (pCtx->out_pic[channel] % pCtx->nLTRFreq[channel])) + { + VideoEncoder_SetLongTerm(pCtx->hEnc[channel]); + } + //next frame use ltr + else if (0 == ((pCtx->out_pic[channel]-1) % pCtx->nLTRFreq[channel])) + { + VideoEncoder_UseLongTerm(pCtx->hEnc[channel]); + //printf("==========VideoEncoder_UseLongTerm\n"); + } + } VideoEncoder_EncodeOneFrame(pCtx->hEnc[channel], &input); @@ -663,7 +685,7 @@ static void *encode_ch(void *arg) { if(pCtx->repeat[channel]) { - if(repeated < pCtx->drop[channel]) + if(repeated < pCtx->repeat[channel]) { repeated++; } @@ -783,6 +805,9 @@ int free_context(void *arg) free(pCtx->v4l2_thread ); free(pCtx->encode_thread ); free(pCtx->pRtspServer ); + free(pCtx->roi_filename ); + free(pCtx->aryEncRoiCfg ); + free(pCtx->nLTRFreq ); free(pCtx->Cfg ); free(pCtx->ch_en ); free(pCtx->infilename ); @@ -1428,6 +1453,121 @@ static void *audio_process(void *arg) return 0; } +static int roi_parse_conf(const char* filename,ENC_ROI_CFG_ARRAY&aryEncRoiCfg, ROICtrlMode& nRoiCtrMode) +{ + FILE *fp = NULL; + int len = 0; + char* data = NULL; + char* out = NULL; + int roiCtrlTmp = 0; + cJSON *root; + cJSON *jsonCtrlMode; + cJSON *jsonRoiRegion; + cJSON*jsonRoiRegionArray; + cJSON*jsonRoiRect; + cJSON*jsonRoiRegionEnable; + + fp=fopen(filename,"rb"); + if(NULL == fp) + { + printf("read %s:file %s no exist!\n",__func__,filename); + return -1; + } + fseek(fp,0,SEEK_END); + len=ftell(fp); + fseek(fp,0,SEEK_SET); + data=(char*)malloc(len+1); + fread(data,1,len,fp); + fclose(fp); + + + root=cJSON_Parse(data); + if (!root) + { + printf("cJSON_Parse Error:%s [%s]\n",filename,cJSON_GetErrorPtr()); + return -1; + } + else + { + + jsonCtrlMode = cJSON_GetObjectItem(root,"roiCtrMode"); + if(NULL == jsonCtrlMode) + { + printf("not find roiCtrMode node\n"); + return -1; + } + if(jsonCtrlMode->type==cJSON_Number) + { + roiCtrlTmp = jsonCtrlMode->valueint; + if (roiCtrlTmp != ROI_QP_TABLE_RELATIVE && roiCtrlTmp != ROI_QP_TABLE_ABSOLUTE) + { + printf("roiCtrMode type invalid\n"); + return -1; + } + } + else + { + return -1; + } + + jsonRoiRegionArray = cJSON_GetObjectItem(root,"roiRegion"); + if(NULL == jsonRoiRegionArray) + { + printf("not find roiRegion node\n"); + return -1; + } + int nSize = cJSON_GetArraySize(jsonRoiRegionArray); + if (nSize <= 0) + { + printf("roiRegion array is empty\n"); + return -1; + } + + EncROICfg encRoiCfg; + int nIndex = 0; + for (int i = 0;i < nSize;i ++) + { + jsonRoiRegion = cJSON_GetArrayItem(jsonRoiRegionArray,i); + jsonRoiRegionEnable = cJSON_GetObjectItem(jsonRoiRegion,"enable"); + //filter unenable item + if (NULL != jsonRoiRegionEnable) + { + if(jsonRoiRegionEnable->type==cJSON_Number) + { + if (0 == jsonRoiRegionEnable->valueint) + { + printf("roi_parse_conf pass an iterm\n"); + continue; + } + } + } + + encRoiCfg.uIndex = nIndex++; + encRoiCfg.bEnable = true; + encRoiCfg.uQpValue = cJSON_GetObjectItem(jsonRoiRegion,"qpValue")->valueint; + jsonRoiRect = cJSON_GetObjectItem(jsonRoiRegion,"qpRegion"); + + encRoiCfg.stRect.s32X = cJSON_GetObjectItem(jsonRoiRect,"left")->valueint; + encRoiCfg.stRect.s32Y = cJSON_GetObjectItem(jsonRoiRect,"top")->valueint; + encRoiCfg.stRect.u32Width = cJSON_GetObjectItem(jsonRoiRect,"width")->valueint; + encRoiCfg.stRect.u32Height = cJSON_GetObjectItem(jsonRoiRect,"heigth")->valueint; + + printf("roi cfg info: index:%d,qpvalue:%d,rect(%d,%d,%d,%d)\n", + encRoiCfg.uIndex,encRoiCfg.uQpValue,encRoiCfg.stRect.s32X, + encRoiCfg.stRect.s32Y,encRoiCfg.stRect.u32Width,encRoiCfg.stRect.u32Height); + + aryEncRoiCfg.push_back(encRoiCfg); + } + + + } + cJSON_Delete(root); + nRoiCtrMode = (ROICtrlMode)roiCtrlTmp ; + + return 0; +} + + int parse_conf() { printf("%s\n", __FUNCTION__); @@ -1535,6 +1675,14 @@ int parse_conf() return 0; } +static void DoEncRoi(EncoderHandle *hEnc,const ENC_ROI_CFG_ARRAY& aryEncRoiCfg) +{ + for(int i =0;i < aryEncRoiCfg.size();i ++) + { + VideoEncoder_SetRoiCfg(hEnc,&aryEncRoiCfg[i]); + } +} + int alloc_context(void *arg) { MainContext *pCtx = (MainContext *)arg; @@ -1593,6 +1741,9 @@ int alloc_context(void *arg) pCtx->v4l2_thread = (pthread_t*)malloc(sizeof(pthread_t) * pCtx->ch_cnt); pCtx->encode_thread = (pthread_t*)malloc(sizeof(pthread_t) * pCtx->ch_cnt); pCtx->pRtspServer = (IRtspServerEX**)malloc(sizeof(IRtspServerEX*) * pCtx->ch_cnt); + pCtx->roi_filename = (char**)malloc(sizeof(char*) * pCtx->ch_cnt); + pCtx->aryEncRoiCfg = (ENC_ROI_CFG_ARRAY*)malloc(sizeof(ENC_ROI_CFG_ARRAY) * pCtx->ch_cnt); + pCtx->nLTRFreq = (int*)malloc(sizeof(int) * pCtx->ch_cnt); pCtx->Cfg = (EncSettings*)malloc(sizeof(EncSettings) * pCtx->ch_cnt); pCtx->ch_en = (int*)malloc(sizeof(int) * pCtx->ch_cnt); pCtx->infilename = (char**)malloc(sizeof(char*) * pCtx->ch_cnt); @@ -1632,7 +1783,19 @@ int parse_cmd(int argc, char *argv[]) printf("-r: encoder output framrate\n"); printf("-inframes: input frames for input file\n"); printf("-outframes: output frames for output file\n"); - printf("-bitrate: bitrate\n"); + printf("-gop: gop length in frames including the I picture,use in IDR\n"); + printf("-rcmode: 0:CONST_QP 1:CBR 2:VBR 3:jpg\n"); + printf("-bitrate: bitrate(Kb)\n"); + printf("-maxbitrate: max bitrate(Kb),use in vbr\n"); + printf("-profile: 0: base 1:main 2:high\n"); + printf("-level: from 10 to 42\n"); + printf("-sliceqp: auto:-1,from 0 to 51 for AVC,from 1 to 100 for JPEG\n"); + printf("-minqp: from 0 to sliceqp\n"); + printf("-maxqp: from sliceqp to 51\n"); + printf("-enableGDR: enbale intra refresh and specifies intra refresh peroid\n"); + printf("-GDRMode: GDR mode 0:GDR_VERTICAL 1:GDR_HORIZONTAL\n"); + printf("-enableLTR: enbale long term reference picture and specifies LTR refresh frequency in number of frames,0 to disable use refresh frequency\n"); + printf("-roi: roi config file\n"); printf("-conf: v4l2 config file\n"); /* audio */ printf("-alsa: enable audio\n"); @@ -1658,6 +1821,7 @@ int parse_cmd(int argc, char *argv[]) } pCtx->ch_en[cur_ch] = 1; printf("-ch%d: %d\n", cur_ch, pCtx->ch_en[cur_ch]); + memset(&pCtx->Cfg[cur_ch],0,sizeof(EncSettings)); } else if(strcmp(argv[i], "-i") == 0) { @@ -1713,7 +1877,7 @@ int parse_cmd(int argc, char *argv[]) return -1; } pCtx->outfilename[cur_ch] = argv[i+1]; - +#if 0 char *ptr=strchr(pCtx->outfilename[cur_ch], '.'); if(strcmp(ptr, ".jpg") == 0 || strcmp(ptr, ".mjpeg") == 0) { @@ -1721,6 +1885,7 @@ int parse_cmd(int argc, char *argv[]) pCtx->Cfg[cur_ch].rcMode = CONST_QP; printf("JPEG encode\n"); } +#endif } } else if(strcmp(argv[i], "-w") == 0) @@ -1774,12 +1939,122 @@ int parse_cmd(int argc, char *argv[]) pCtx->output_frames[cur_ch] = atoi(argv[i+1]); printf("output_frames %d\n", pCtx->output_frames[cur_ch]); } + else if(strcmp(argv[i], "-gop") == 0) + { + pCtx->Cfg[cur_ch].gopLen = atoi(argv[i+1]); + if (pCtx->Cfg[cur_ch].gopLen <= 0) + { + printf("gop len error\n"); + return -1; + } + pCtx->Cfg[cur_ch].FreqIDR = pCtx->Cfg[cur_ch].gopLen; + printf("gop length %d\n", pCtx->Cfg[cur_ch].gopLen); + } else if(strcmp(argv[i], "-bitrate") == 0) { - pCtx->Cfg[cur_ch].BitRate = atoi(argv[i+1]); - pCtx->Cfg[cur_ch].MaxBitRate = atoi(argv[i+1]); + pCtx->Cfg[cur_ch].BitRate = atoi(argv[i+1])*1000; printf("bitrate %d\n", pCtx->Cfg[cur_ch].BitRate); } + else if (strcmp(argv[i],"-maxbitrate") == 0 ) + { + pCtx->Cfg[cur_ch].MaxBitRate = atoi(argv[i+1])*1000; + printf("maxbitrate %d\n", pCtx->Cfg[cur_ch].MaxBitRate); + } + else if (strcmp(argv[i],"-profile") == 0 ) + { + int nProfile = atoi(argv[i+1]); + if (nProfile > 2 || nProfile < 0) + { + printf("profile:%d error\n",nProfile); + return -1; + } + pCtx->Cfg[cur_ch].profile = (AVC_Profile)nProfile; + printf("profile %d\n", pCtx->Cfg[cur_ch].profile); + } + else if (strcmp(argv[i],"-level") == 0 ) + { + int nLevel = atoi(argv[i+1]); + if (nLevel < 10 || nLevel > 42) + { + printf("level:%d error\n",nLevel); + return -1; + } + pCtx->Cfg[cur_ch].level = nLevel; + printf("level:%d\n",nLevel); + } + else if (strcmp(argv[i],"-sliceqp") == 0 ) + { + int nqp = atoi(argv[i+1]); + pCtx->Cfg[cur_ch].SliceQP = nqp; + printf("sliceqp %d\n", nqp); + } + else if (strcmp(argv[i],"-minqp") == 0 ) + { + int nqp = atoi(argv[i+1]); + pCtx->Cfg[cur_ch].MinQP = nqp; + printf("minqp %d\n", nqp); + } + else if (strcmp(argv[i],"-maxqp") == 0 ) + { + int nqp = atoi(argv[i+1]); + pCtx->Cfg[cur_ch].MaxQP = nqp; + printf("maxqp %d\n", nqp); + } + else if (strcmp(argv[i],"-rcmode") == 0) + { + int nRcMode = atoi(argv[i+1]); + if (nRcMode > 2 || nRcMode < 0) + { + printf("rcmode error,must be 0-2\n"); + return -1; + } + pCtx->Cfg[cur_ch].rcMode = (RateCtrlMode)nRcMode; + printf("rcmode %d(0:CONST_QP 1:CBR 2:VBR)\n", pCtx->Cfg[cur_ch].rcMode); + } + else if(strcmp(argv[i], "-enableGDR") == 0) + { + pCtx->Cfg[cur_ch].bEnableGDR = true; + pCtx->Cfg[cur_ch].FreqIDR = atoi(argv[i+1]); + if (pCtx->Cfg[cur_ch].FreqIDR <= 0) + { + printf("gdr fresh period error\n"); + return -1; + } + + printf("enable gdr and fresh peroid %d\n", pCtx->Cfg[cur_ch].FreqIDR); + } + else if (strcmp(argv[i], "-GDRMode") == 0) + { + int nGdrMode = atoi(argv[i+1]); + if (nGdrMode < 0 || nGdrMode >= GDR_CTRLMAX) + { + printf("gdr mode set error\n"); + return -1; + } + pCtx->Cfg[cur_ch].gdrMode = (GDRCtrlMode)nGdrMode; + } + else if(strcmp(argv[i], "-enableLTR") == 0) + { + pCtx->Cfg[cur_ch].bEnableLTR = true; + pCtx->nLTRFreq[cur_ch] = atoi(argv[i+1]); + printf("enable LTR and refresh frequency %d\n", pCtx->nLTRFreq[cur_ch]); + } + else if (strcmp(argv[i], "-roi") == 0) + { + pCtx->roi_filename[cur_ch] = (char*)malloc(strlen(argv[i+1])+1); + memcpy(pCtx->roi_filename[cur_ch], argv[i+1], strlen(argv[i+1])+1); + printf("roi_filename %s\n",pCtx->roi_filename[cur_ch]); + if (0 != roi_parse_conf(pCtx->roi_filename[cur_ch],pCtx->aryEncRoiCfg[cur_ch],pCtx->Cfg[cur_ch].roiCtrlMode)) + { + printf("roi_parse_conf failed\n"); + //endof_encode(); + return -1; + } + else + { + printf("roi_parse_conf ok\n"); + } + } else if(strcmp(argv[i], "-conf") == 0) { pCtx->conf_filename = (char*)malloc(strlen(argv[i+1])+1); @@ -1819,8 +2094,7 @@ int parse_cmd(int argc, char *argv[]) printf("Error :Invalid arguments %s\n", argv[i]); return -1; } - } - + } return 0; } @@ -1883,21 +2157,73 @@ int main(int argc, char *argv[]) if(!pCtx->Cfg[i].FreqIDR) pCtx->Cfg[i].FreqIDR = 25; if(!pCtx->Cfg[i].gopLen) pCtx->Cfg[i].gopLen = 25; if(!pCtx->Cfg[i].AspectRatio) pCtx->Cfg[i].AspectRatio = ASPECT_RATIO_AUTO; + if(!pCtx->Cfg[i].MinQP) pCtx->Cfg[i].MinQP = 0;//from 0 to SliceQP + if(!pCtx->Cfg[i].MaxQP) pCtx->Cfg[i].MaxQP = 51;//from SliceQP to 51 + if(!pCtx->Cfg[i].roiCtrlMode) pCtx->Cfg[i].roiCtrlMode = ROI_QP_TABLE_NONE; + + } + + for(int i =0;i < pCtx->ch_cnt; i++) + { + if (pCtx->outfilename[i] != NULL) + { + char *ptr=strchr(pCtx->outfilename[i], '.'); + if(strcmp(ptr, ".jpg") == 0 || strcmp(ptr, ".mjpeg") == 0) + { + pCtx->Cfg[i].profile = JPEG; + pCtx->Cfg[i].rcMode = CONST_QP; + printf("JPEG encode\n"); + } + } + + if(CBR == pCtx->Cfg[i].rcMode) + { + if (pCtx->Cfg[i].MaxBitRate != pCtx->Cfg[i].BitRate) + { + pCtx->Cfg[i].MaxBitRate = pCtx->Cfg[i].BitRate; + printf("modify MaxBitRate to BitRate:%d in cbr mode\n",pCtx->Cfg[i].BitRate); + } + } + + if (JPEG == pCtx->Cfg[i].profile) + { + if (pCtx->Cfg[i].SliceQP < 1 || pCtx->Cfg[i].SliceQP > 100) + { + printf("slice qp error\n"); + return -1; + } + } + else + { + if (pCtx->Cfg[i].SliceQP < -1 || pCtx->Cfg[i].SliceQP > 51) + { + printf("slice qp error\n"); + return -1; + } + } } for(i = 0; i < pCtx->ch_cnt; i++) { printf("ch%d: enable_isp %d, enable_v4l2 %d, enable_rtsp %d\n", i, pCtx->enable_isp[i], pCtx->enable_v4l2[i], pCtx->enable_rtsp[i]); + printf("cur_ch:%d,roiCtrlMode:%d(0:NONE,1:RELATIVE,2:ABSOLUTE),sliceqp:%d,minqp:%d,maxqp:%d,rcMode:%d(0:CONST_QP, 1:CBR, 2:VBR),bitrate:%dkbps,maxbitrate:%dkbps,profile:%d,gop:%d,gdr:%d(freq:%d,mode:%d(0:VERTICAL 1:HORIZONTAL)),LTR:%d(%d)\n", + i,pCtx->Cfg[i].roiCtrlMode,pCtx->Cfg[i].SliceQP,pCtx->Cfg[i].MinQP,pCtx->Cfg[i].MaxQP,pCtx->Cfg[i].rcMode,pCtx->Cfg[i].BitRate/1000,pCtx->Cfg[i].MaxBitRate/1000,pCtx->Cfg[i].profile, + pCtx->Cfg[i].gopLen,pCtx->Cfg[i].bEnableGDR,pCtx->Cfg[i].FreqIDR,pCtx->Cfg[i].gdrMode,pCtx->Cfg[i].bEnableLTR,pCtx->nLTRFreq[i]); } for(i = 0; i < pCtx->ch_cnt; i++) { if(pCtx->ch_en[i]) { - pCtx->Cfg[i].FrameRate = pCtx->out_framerate[i]; + pCtx->Cfg[i].FrameRate = pCtx->out_framerate[i]; printf("ch%d-Cfg.Framerate: %d\n", i, pCtx->Cfg[i].FrameRate); pCtx->hEnc[i] = VideoEncoder_Create(&pCtx->Cfg[i]); + if (ROI_QP_TABLE_NONE != pCtx->Cfg[i].roiCtrlMode) + { + DoEncRoi(pCtx->hEnc[i],pCtx->aryEncRoiCfg[i]); + } + if((pCtx->out_framerate[i] % pCtx->framerate[i] == 0) || (pCtx->framerate[i] % pCtx->out_framerate[i] == 0)) { if(pCtx->out_framerate[i] > pCtx->framerate[i]) diff --git a/package/encode_app/src/roi_1920x1080.conf b/package/encode_app/src/roi_1920x1080.conf new file mode 100644 index 0000000..ce14f80 --- /dev/null +++ b/package/encode_app/src/roi_1920x1080.conf @@ -0,0 +1,14 @@ +{ + "roiCtrMode": 1, + "roiRegion": [ + { + "qpValue": -15, + "qpRegion": { + "left": 0, + "top": 0, + "width": 640, + "heigth": 1080 + } + } + ] +} diff --git a/package/venc_lib/src/enc_interface.h b/package/venc_lib/src/enc_interface.h index 57894c7..73adebf 100644 --- a/package/venc_lib/src/enc_interface.h +++ b/package/venc_lib/src/enc_interface.h @@ -1,28 +1,8 @@ -/* Copyright (c) 2022, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ /****************************************************************************** + + Copyright (C), 2021, Canaan Tech. Co., Ltd. + + ****************************************************************************** File Name : enc_interface.h Version : Initial Draft Author : @@ -37,12 +17,13 @@ #pragma once #include +#include #ifdef __cplusplus extern "C" { #endif -#define VENC_MAX_CHANNELS (8) +#define VENC_MAX_CHANNELS (8) typedef void* EncoderHandle; @@ -60,6 +41,7 @@ typedef enum IDR_SLICE }EncSliceType; + typedef enum { CONST_QP, @@ -83,6 +65,36 @@ typedef enum ASPECT_RATIO_NONE } AVC_AspectRatio; +typedef struct +{ + unsigned int s32X; + unsigned int s32Y; + unsigned int u32Width; + unsigned int u32Height; +}RECT_S; + +typedef struct +{ + unsigned int uIndex;//index[0-7] + bool bEnable; + int uQpValue; + RECT_S stRect; +}EncROICfg; + +typedef enum +{ + ROI_QP_TABLE_NONE, + ROI_QP_TABLE_RELATIVE,//[-32,31],6 LSBs effective + ROI_QP_TABLE_ABSOLUTE,//[0,51],6 LSBs effective +} ROICtrlMode; + +typedef enum +{ + GDR_VERTICAL = 0, + GDR_HORIZONTAL , + GDR_CTRLMAX, +}GDRCtrlMode; + typedef enum { SECTION_SEI_PREFIX_FLAG = 0x80000000, /*< this section data is from a SEI prefix */ @@ -95,20 +107,27 @@ typedef enum typedef struct { - int channel; //encode channel number - unsigned short width; - unsigned short height; - unsigned char FrameRate; - RateCtrlMode rcMode; - unsigned int BitRate; - unsigned int MaxBitRate; - int SliceQP; //auto: -1, or from 0 to 51 - AVC_Profile profile; - unsigned int level; //1 .. 51, 51 is 5.1 - AVC_AspectRatio AspectRatio; - int FreqIDR; //default value : -1 - unsigned int gopLen; -}EncSettings; + int channel; //encode channel number + unsigned short width; + unsigned short height; + unsigned char FrameRate; + RateCtrlMode rcMode; + unsigned int BitRate; + unsigned int MaxBitRate; + int SliceQP; //auto: -1, or from 0 to 51 + int MinQP;//from 0 to SliceQP + int MaxQP;//from SliceQP to 51 + AVC_Profile profile; + unsigned int level; //1 .. 51, 51 is 5.1 + AVC_AspectRatio AspectRatio; + int FreqIDR; //default value : -1,IDR:number of frames between two IDR pictures;GDR:refresh period + unsigned int gopLen; + bool bEnableGDR;//gdr + GDRCtrlMode gdrMode; + bool bEnableLTR;//Long Term reference + + ROICtrlMode roiCtrlMode; +}EncSettings; typedef struct { @@ -125,11 +144,18 @@ typedef struct SectionFlags uFlags; /*!< Flags associated with the section; see macro SectionFlags*/ }StreamSection; +typedef enum +{ + EM_VIDEO_PACKET_UNKOWN = 0, + EM_VIDEO_PACKET_IDR, + EM_VIDEO_PACKET_P, +}EncVideoPacketType; typedef struct { unsigned char *bufAddr; unsigned int bufSize; + EncVideoPacketType packetType; }EncOutputStream; typedef struct @@ -141,6 +167,11 @@ typedef struct }EncOutputStreamSection; EncoderHandle* VideoEncoder_Create(EncSettings *pCfg); +EncStatus VideoEncoder_SetRoiCfg(EncoderHandle *hEnc,const EncROICfg*pEncRoiCfg); + +EncStatus VideoEncoder_SetLongTerm(EncoderHandle *hEnc); +EncStatus VideoEncoder_UseLongTerm(EncoderHandle *hEnc); + EncStatus VideoEncoder_Destroy(EncoderHandle *hEnc); diff --git a/package/venc_lib/src/libvenc.so b/package/venc_lib/src/libvenc.so old mode 100644 new mode 100755 index d2043801acba38f60dc4453df781609e5e73dc21..caf858ae6cbf305a9c5479361d33b85f70688265 GIT binary patch delta 166827 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 TXOHRI@T#O=VJ6PAkN$rE)A#*m delta 132225 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 z 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


KEeIPMNj$r)n9{))-X3`+TN;k&moAzjGme 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 jDO`jcvRvCS{Tmi#Oc!?@vfS9AZXC}RZW4 Date: Thu, 12 May 2022 19:32:42 +0800 Subject: [PATCH 02/23] tcperror --- package/encode_app/src/main.cpp | 26 ++++++++++++++++++ package/venc_lib/src/enc_interface.h | 41 +++++++++++++++++----------- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/package/encode_app/src/main.cpp b/package/encode_app/src/main.cpp index 6e42d5a..5aa088d 100644 --- a/package/encode_app/src/main.cpp +++ b/package/encode_app/src/main.cpp @@ -1,3 +1,29 @@ +/* Copyright (c) 2022, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #include #include #include diff --git a/package/venc_lib/src/enc_interface.h b/package/venc_lib/src/enc_interface.h index 73adebf..a0b0fe4 100644 --- a/package/venc_lib/src/enc_interface.h +++ b/package/venc_lib/src/enc_interface.h @@ -1,19 +1,28 @@ -/****************************************************************************** - - Copyright (C), 2021, Canaan Tech. Co., Ltd. - - ****************************************************************************** - File Name : enc_interface.h - Version : Initial Draft - Author : - Created : - Description : - History : - 1.Date : - Author : - Modification: Created file - -******************************************************************************/ +/* Copyright (c) 2022, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #pragma once #include From 73d897c65c94aaeb3bab4b99018c80f8fefd3ce3 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Thu, 12 May 2022 19:45:56 +0800 Subject: [PATCH 03/23] Network transmission data error --- .../linux/0004-tcperror-canaan-20220512.patch | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 package/patches/linux/0004-tcperror-canaan-20220512.patch diff --git a/package/patches/linux/0004-tcperror-canaan-20220512.patch b/package/patches/linux/0004-tcperror-canaan-20220512.patch new file mode 100644 index 0000000..3180131 --- /dev/null +++ b/package/patches/linux/0004-tcperror-canaan-20220512.patch @@ -0,0 +1,54 @@ +From 55671e75f460505e0131e821ac8d3eb70535d970 Mon Sep 17 00:00:00 2001 +From: gh-sxp +Date: Thu, 12 May 2022 19:43:02 +0800 +Subject: [PATCH] tcperror + +--- + drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index 745ec600..58cd91c1 100755 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -1464,9 +1464,16 @@ static unsigned int macb_tx_map(struct macb *bp, + size = hdrlen; + + offset = 0; ++ volatile u8 reg_data = 0; ++ + while (len) { + entry = macb_tx_ring_wrap(bp, tx_head); + tx_skb = &queue->tx_skb[entry]; ++ for(i = 0;i < size;i ++) ++ { ++ reg_data =*(u8*)(skb->data + offset + i); ++ } ++ + + mapping = dma_map_single(&bp->pdev->dev, + skb->data + offset, +@@ -1498,6 +1505,12 @@ static unsigned int macb_tx_map(struct macb *bp, + size = min(len, bp->max_tx_length); + entry = macb_tx_ring_wrap(bp, tx_head); + tx_skb = &queue->tx_skb[entry]; ++#if 0 ++ for(i =0;i < size;i ++) ++ { ++ reg_data = *(u8*)(lowmem_page_address(skb_frag_page(frag))+ frag->page_offset+offset + i); ++ } ++#endif + + mapping = skb_frag_dma_map(&bp->pdev->dev, frag, + offset, size, DMA_TO_DEVICE); +@@ -1731,6 +1744,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) + /* Map socket buffer for DMA transfer */ + if (!macb_tx_map(bp, queue, skb, hdrlen)) { + dev_kfree_skb_any(skb); ++ printk("=========macb_tx_map errorz\n"); + goto unlock; + } + +-- +2.35.1 + From b2f2935a42f1a665cd5f37b9fa330a32d5f34ada Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Thu, 12 May 2022 20:52:20 +0800 Subject: [PATCH 04/23] Modify the network card driver cache --- package/patches/linux/0004-tcperror-canaan-20220512.patch | 2 -- 1 file changed, 2 deletions(-) diff --git a/package/patches/linux/0004-tcperror-canaan-20220512.patch b/package/patches/linux/0004-tcperror-canaan-20220512.patch index 3180131..b83d9c1 100644 --- a/package/patches/linux/0004-tcperror-canaan-20220512.patch +++ b/package/patches/linux/0004-tcperror-canaan-20220512.patch @@ -32,12 +32,10 @@ index 745ec600..58cd91c1 100755 size = min(len, bp->max_tx_length); entry = macb_tx_ring_wrap(bp, tx_head); tx_skb = &queue->tx_skb[entry]; -+#if 0 + for(i =0;i < size;i ++) + { + reg_data = *(u8*)(lowmem_page_address(skb_frag_page(frag))+ frag->page_offset+offset + i); + } -+#endif mapping = skb_frag_dma_map(&bp->pdev->dev, frag, offset, size, DMA_TO_DEVICE); From 7d736d3bc303c668132c6a24c5ce6ba023a7a0cb Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Fri, 13 May 2022 11:08:08 +0800 Subject: [PATCH 05/23] tcp error --- .../linux/0004-tcperror-canaan-20220512.patch | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 package/patches/linux/0004-tcperror-canaan-20220512.patch diff --git a/package/patches/linux/0004-tcperror-canaan-20220512.patch b/package/patches/linux/0004-tcperror-canaan-20220512.patch deleted file mode 100644 index b83d9c1..0000000 --- a/package/patches/linux/0004-tcperror-canaan-20220512.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 55671e75f460505e0131e821ac8d3eb70535d970 Mon Sep 17 00:00:00 2001 -From: gh-sxp -Date: Thu, 12 May 2022 19:43:02 +0800 -Subject: [PATCH] tcperror - ---- - drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c -index 745ec600..58cd91c1 100755 ---- a/drivers/net/ethernet/cadence/macb_main.c -+++ b/drivers/net/ethernet/cadence/macb_main.c -@@ -1464,9 +1464,16 @@ static unsigned int macb_tx_map(struct macb *bp, - size = hdrlen; - - offset = 0; -+ volatile u8 reg_data = 0; -+ - while (len) { - entry = macb_tx_ring_wrap(bp, tx_head); - tx_skb = &queue->tx_skb[entry]; -+ for(i = 0;i < size;i ++) -+ { -+ reg_data =*(u8*)(skb->data + offset + i); -+ } -+ - - mapping = dma_map_single(&bp->pdev->dev, - skb->data + offset, -@@ -1498,6 +1505,12 @@ static unsigned int macb_tx_map(struct macb *bp, - size = min(len, bp->max_tx_length); - entry = macb_tx_ring_wrap(bp, tx_head); - tx_skb = &queue->tx_skb[entry]; -+ for(i =0;i < size;i ++) -+ { -+ reg_data = *(u8*)(lowmem_page_address(skb_frag_page(frag))+ frag->page_offset+offset + i); -+ } - - mapping = skb_frag_dma_map(&bp->pdev->dev, frag, - offset, size, DMA_TO_DEVICE); -@@ -1731,6 +1744,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) - /* Map socket buffer for DMA transfer */ - if (!macb_tx_map(bp, queue, skb, hdrlen)) { - dev_kfree_skb_any(skb); -+ printk("=========macb_tx_map errorz\n"); - goto unlock; - } - --- -2.35.1 - From b3dcf3c269296d6a662ae314f18db381435ab0ae Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Fri, 13 May 2022 11:12:19 +0800 Subject: [PATCH 06/23] tcp error --- .../linux/0004-tcperror-canaan-20220513.patch | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 package/patches/linux/0004-tcperror-canaan-20220513.patch diff --git a/package/patches/linux/0004-tcperror-canaan-20220513.patch b/package/patches/linux/0004-tcperror-canaan-20220513.patch new file mode 100644 index 0000000..b83d9c1 --- /dev/null +++ b/package/patches/linux/0004-tcperror-canaan-20220513.patch @@ -0,0 +1,52 @@ +From 55671e75f460505e0131e821ac8d3eb70535d970 Mon Sep 17 00:00:00 2001 +From: gh-sxp +Date: Thu, 12 May 2022 19:43:02 +0800 +Subject: [PATCH] tcperror + +--- + drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index 745ec600..58cd91c1 100755 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -1464,9 +1464,16 @@ static unsigned int macb_tx_map(struct macb *bp, + size = hdrlen; + + offset = 0; ++ volatile u8 reg_data = 0; ++ + while (len) { + entry = macb_tx_ring_wrap(bp, tx_head); + tx_skb = &queue->tx_skb[entry]; ++ for(i = 0;i < size;i ++) ++ { ++ reg_data =*(u8*)(skb->data + offset + i); ++ } ++ + + mapping = dma_map_single(&bp->pdev->dev, + skb->data + offset, +@@ -1498,6 +1505,12 @@ static unsigned int macb_tx_map(struct macb *bp, + size = min(len, bp->max_tx_length); + entry = macb_tx_ring_wrap(bp, tx_head); + tx_skb = &queue->tx_skb[entry]; ++ for(i =0;i < size;i ++) ++ { ++ reg_data = *(u8*)(lowmem_page_address(skb_frag_page(frag))+ frag->page_offset+offset + i); ++ } + + mapping = skb_frag_dma_map(&bp->pdev->dev, frag, + offset, size, DMA_TO_DEVICE); +@@ -1731,6 +1744,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) + /* Map socket buffer for DMA transfer */ + if (!macb_tx_map(bp, queue, skb, hdrlen)) { + dev_kfree_skb_any(skb); ++ printk("=========macb_tx_map errorz\n"); + goto unlock; + } + +-- +2.35.1 + From 94505689c228d5d331d477d2f3de65f8568d34d0 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Fri, 13 May 2022 15:16:28 +0800 Subject: [PATCH 07/23] tcp error --- .../linux/0004-tcperror-canaan-20220513.patch | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package/patches/linux/0004-tcperror-canaan-20220513.patch b/package/patches/linux/0004-tcperror-canaan-20220513.patch index b83d9c1..f8f6ef1 100644 --- a/package/patches/linux/0004-tcperror-canaan-20220513.patch +++ b/package/patches/linux/0004-tcperror-canaan-20220513.patch @@ -1,14 +1,14 @@ -From 55671e75f460505e0131e821ac8d3eb70535d970 Mon Sep 17 00:00:00 2001 +From 449cc7a7b62f5b4a185caec570f4f4729123c541 Mon Sep 17 00:00:00 2001 From: gh-sxp -Date: Thu, 12 May 2022 19:43:02 +0800 -Subject: [PATCH] tcperror +Date: Fri, 13 May 2022 15:09:16 +0800 +Subject: [PATCH] tcp-error --- - drivers/net/ethernet/cadence/macb_main.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) + drivers/net/ethernet/cadence/macb_main.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c -index 745ec600..58cd91c1 100755 +index 745ec600..7e44a85a 100755 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -1464,9 +1464,16 @@ static unsigned int macb_tx_map(struct macb *bp, @@ -28,7 +28,7 @@ index 745ec600..58cd91c1 100755 mapping = dma_map_single(&bp->pdev->dev, skb->data + offset, -@@ -1498,6 +1505,12 @@ static unsigned int macb_tx_map(struct macb *bp, +@@ -1498,6 +1505,10 @@ static unsigned int macb_tx_map(struct macb *bp, size = min(len, bp->max_tx_length); entry = macb_tx_ring_wrap(bp, tx_head); tx_skb = &queue->tx_skb[entry]; @@ -39,7 +39,7 @@ index 745ec600..58cd91c1 100755 mapping = skb_frag_dma_map(&bp->pdev->dev, frag, offset, size, DMA_TO_DEVICE); -@@ -1731,6 +1744,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) +@@ -1731,6 +1742,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) /* Map socket buffer for DMA transfer */ if (!macb_tx_map(bp, queue, skb, hdrlen)) { dev_kfree_skb_any(skb); From 05904409677c28045173ee401514a895d7abdfdb Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sat, 14 May 2022 22:16:51 +0800 Subject: [PATCH 08/23] add function: ffmpeg push RTMP stream --- Config.in | 1 + .../ffmpeg_canaan/0019-buildroot-ffmpeg.patch | 16 +++++ package/ffmpeg_canaan/ffmpeg.mk | 3 + package/librtmp/0001-buildroot-librtmp.patch | 51 +++++++++++++++ package/librtmp/Config.in | 5 ++ package/librtmp/librtmp.hash | 3 + package/librtmp/librtmp.mk | 64 +++++++++++++++++++ patches/0001-buildroot-libopenssl.patch | 17 +++++ 8 files changed, 160 insertions(+) create mode 100644 package/ffmpeg_canaan/0019-buildroot-ffmpeg.patch create mode 100644 package/librtmp/0001-buildroot-librtmp.patch create mode 100644 package/librtmp/Config.in create mode 100644 package/librtmp/librtmp.hash create mode 100644 package/librtmp/librtmp.mk create mode 100644 patches/0001-buildroot-libopenssl.patch diff --git a/Config.in b/Config.in index dd18197..f2c9088 100644 --- a/Config.in +++ b/Config.in @@ -20,6 +20,7 @@ source "$BR2_EXTERNAL_K510_PATH/package/mediactl_lib/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/mailbox_demo/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/dsp_scheduler/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/live555_canaan/Config.in" +source "$BR2_EXTERNAL_K510_PATH/package/librtmp/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/ai/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/client/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/server/Config.in" diff --git a/package/ffmpeg_canaan/0019-buildroot-ffmpeg.patch b/package/ffmpeg_canaan/0019-buildroot-ffmpeg.patch new file mode 100644 index 0000000..bde8f73 --- /dev/null +++ b/package/ffmpeg_canaan/0019-buildroot-ffmpeg.patch @@ -0,0 +1,16 @@ +Index: b/configure +=================================================================== +--- a/configure ++++ b/configure +@@ -6432,7 +6432,10 @@ enabled librabbitmq && require_pkg + enabled librav1e && require_pkg_config librav1e "rav1e >= 0.4.0" rav1e.h rav1e_context_new + enabled librist && require_pkg_config librist "librist >= 0.2" librist/librist.h rist_receiver_create + enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo +-enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket ++# enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket ++# enabled librtmp && { add_extralibs -lrtmp -lssl -lcrypto -lz; } ++enabled librtmp && { add_extralibs -lrtmp -lssl -lcrypto -lz || ++ die "ERROR: librtmp not found";} + enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++" + enabled libshine && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer + enabled libsmbclient && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init || diff --git a/package/ffmpeg_canaan/ffmpeg.mk b/package/ffmpeg_canaan/ffmpeg.mk index feade58..c7ff6af 100644 --- a/package/ffmpeg_canaan/ffmpeg.mk +++ b/package/ffmpeg_canaan/ffmpeg.mk @@ -23,6 +23,8 @@ FFMPEG_CANAAN_DEPENDENCIES += alsa-lib FFMPEG_CANAAN_DEPENDENCIES += audio3a_lib FFMPEG_CANAAN_DEPENDENCIES += mediactl_lib FFMPEG_CANAAN_DEPENDENCIES += dsp_scheduler +FFMPEG_CANAAN_DEPENDENCIES += libzlib +FFMPEG_CANAAN_DEPENDENCIES += libopenssl FFMPEG_CANAAN_CONF_ENV += CFLAGS="$(FFMPEG_CANAAN_CFLAGS)" FFMPEG_CANAAN_CONF_OPTS += $(call qstrip,$(BR2_PACKAGE_FFMPEG_CANAAN_EXTRACONF)) @@ -53,6 +55,7 @@ define FFMPEG_CANAAN_CONFIGURE_CMDS --disable-doc \ --enable-audio3a \ --enable-indev=v4l2 \ + --enable-librtmp \ ) endef diff --git a/package/librtmp/0001-buildroot-librtmp.patch b/package/librtmp/0001-buildroot-librtmp.patch new file mode 100644 index 0000000..c51dc39 --- /dev/null +++ b/package/librtmp/0001-buildroot-librtmp.patch @@ -0,0 +1,51 @@ +Index: b/librtmp/dh.h +=================================================================== +--- a/librtmp/dh.h ++++ b/librtmp/dh.h +@@ -166,6 +166,8 @@ static int MDH_compute_key(uint8_t *secr + #else /* USE_OPENSSL */ + #include + #include ++#include ++#include + + typedef BIGNUM * MP_t; + #define MP_new(m) m = BN_new() +Index: b/librtmp/handshake.h +=================================================================== +--- a/librtmp/handshake.h ++++ b/librtmp/handshake.h +@@ -66,12 +66,13 @@ typedef struct arcfour_ctx* RC4_handle; + #include + #include + #include ++#include + #if OPENSSL_VERSION_NUMBER < 0x0090800 || !defined(SHA256_DIGEST_LENGTH) + #error Your OpenSSL is too old, need 0.9.8 or newer with SHA256 + #endif +-#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0) ++#define HMAC_setup(ctx, key, len) HMAC_CTX_reset(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0) + #define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, buf, len) +-#define HMAC_finish(ctx, dig, dlen) HMAC_Final(&ctx, dig, &dlen); HMAC_CTX_cleanup(&ctx) ++#define HMAC_finish(ctx, dig, dlen) HMAC_Final(&ctx, dig, &dlen); HMAC_CTX_free(&ctx) + + typedef RC4_KEY * RC4_handle; + #define RC4_alloc(h) *h = malloc(sizeof(RC4_KEY)) +Index: b/librtmp/hashswf.c +=================================================================== +--- a/librtmp/hashswf.c ++++ b/librtmp/hashswf.c +@@ -57,10 +57,11 @@ + #include + #include + #include +-#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, (unsigned char *)key, len, EVP_sha256(), 0) ++#include ++#define HMAC_setup(ctx, key, len) HMAC_CTX_reset(&ctx); HMAC_Init_ex(&ctx, (unsigned char *)key, len, EVP_sha256(), 0) + #define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, (unsigned char *)buf, len) + #define HMAC_finish(ctx, dig, dlen) HMAC_Final(&ctx, (unsigned char *)dig, &dlen); +-#define HMAC_close(ctx) HMAC_CTX_cleanup(&ctx) ++#define HMAC_close(ctx) HMAC_CTX_free(&ctx) + #endif + + extern void RTMP_TLS_Init(); diff --git a/package/librtmp/Config.in b/package/librtmp/Config.in new file mode 100644 index 0000000..500be3e --- /dev/null +++ b/package/librtmp/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_LIBRTMP + bool "librtmp" + depends on BR2_riscv + help + librtmp diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash new file mode 100644 index 0000000..ad28a54 --- /dev/null +++ b/package/librtmp/librtmp.hash @@ -0,0 +1,3 @@ +# Locally generated +md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz +sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz diff --git a/package/librtmp/librtmp.mk b/package/librtmp/librtmp.mk new file mode 100644 index 0000000..de52f13 --- /dev/null +++ b/package/librtmp/librtmp.mk @@ -0,0 +1,64 @@ +################################################################################ +# +# librtmp +# +################################################################################ + +# LIBRTMP_VERSION = 2.3 +# LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION).tgz +# LIBRTMP_SITE = http://rtmpdump.mplayerhq.hu/download +# LIBRTMP_INSTALL_STAGING = YES + +LIBRTMP_VERSION_FULL = f1b83c10d8beb43fcc70a6e88cf4325499f25857 +LIBRTMP_VERSION_HEAD = f1b83c1 +LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION_HEAD).tar.gz +LIBRTMP_SITE = https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/$(LIBRTMP_VERSION_FULL).tar.gz +LIBRTMP_INSTALL_STAGING = YES + +LIBRTMP_LICENSE = GPLv2 + +LIBRTMP_CONF_ENV += CFLAGS="$(LIBRTMP_CFLAGS)" +LIBRTMP_CONF_OPTS += $(call qstrip,$(BR2_PACKAGE_LIBRTMP_EXTRACONF)) + +LIBRTMP_DEPENDENCIES += libopenssl + +LIBRTMP_MAKE_ENV = $(TOPDIR)/../toolchain/nds64le-linux-glibc-v5d/bin:$(BUILD_DIR)/hostt/bin:$(BUILD_DIR)/host/sbin +LIBRTMP_MAKE = $(BUILD_DIR)/linux-custom/tools/perf/tests/make + +define LIBRTMP_BUILD_CMDS + # # $(TARGET_MAKE_ENV) $(MAKE) CROSS_COMPILE=riscv64-linux- INC+=-I../../toolchain/nds64le-linux-glibc-v5d/include DESTDIR=$(TARGET_DIR) PREFIX= -C $(@D) install + # # $(TARGET_MAKE_ENV) $(MAKE) INC+=-I../../toolchain/nds64le-linux-glibc-v5d/include DESTDIR=$(TARGET_DIR) PREFIX= -C $(@D) install + # $(TARGET_MAKE_ENV) $(MAKE) INC+=-I../../toolchain/nds64le-linux-glibc-v5d/include DESTDIR=$(@) PREFIX= -C $(@D) install + # # $(TARGET_MAKE_ENV) $(MAKE) INC=-I$(BR2_TOOLCHAIN_EXTERNAL_PATH)/include DESTDIR=$(TARGET_DIR) PREFIX=/usr/local -C $(@D) install + # $(TARGET_MAKE_ENV) $(MAKE) CROSS_COMPILE=riscv64-unknown-linux- INC+=-I$(BR2_TOOLCHAIN_EXTERNAL_PATH)/include INC+=-I$(HOST_DIR)/include DESTDIR=$(@) PREFIX= -C $(@D) install + # $(TARGET_MAKE_ENV) $(MAKE) PATH=$(PATH):$(TOPDIR)/../toolchain/nds64le-linux-glibc-v5d/bin CROSS_COMPILE=riscv64-unknown-linux- INC+=-I$(TOPDIR)/../toolchain/nds64le-linux-glibc-v5d/include INC+=-I$(STAGING_DIR)/usr/include DESTDIR=$(STAGING_DIR) XDEF=-DNO_SSL PREFIX= -C $(@D) install + $(TARGET_MAKE_ENV) $(MAKE) CROSS_COMPILE=riscv64-linux- INC+=-I$(TOPDIR)/../toolchain/nds64le-linux-glibc-v5d/include INC+=-I$(STAGING_DIR)/usr/include DESTDIR=$(STAGING_DIR) XDEF=-DNO_SSL PREFIX= -C $(@D) install +endef + + +define LIBRTMP_INSTALL_TARGET_CMDS + # $(INSTALL) -D -m 0755 $(@D)/librtmp/librtmp.a $(TARGET_DIR)/librtmp/librtmp.a + # $(INSTALL) -D -m 0755 $(@D)/librtmp/librtmp.so $(TARGET_DIR)/librtmp/librtmp.so + # $(INSTALL) -D -m 0755 $(@D)/librtmp/librtmp.so.1 $(TARGET_DIR)/librtmp/librtmp.so.1 + # $(INSTALL) -D -m 0755 $(@D)/*.h $(TARGET_DIR)/usr/include/librtmp + # $(INSTALL) -D -m 0755 $(@D)/librtmp/*.h $(TARGET_DIR)/usr/include/librtmp/librtmp + +endef + +define LIBRTMP_INSTALL_STAGING_CMDS + cp -rf $(@D)/librtmp/librtmp.a $(STAGING_DIR)/lib64/lp64d/librtmp.a + cp -rf $(@D)/librtmp/librtmp.so $(STAGING_DIR)/lib64/lp64d/librtmp.so + cp -rf $(@D)/librtmp/librtmp.so.1 $(STAGING_DIR)/lib64/lp64d/librtmp.so.0 + rm -rf $(STAGING_DIR)/usr/include/librtmp + mkdir $(STAGING_DIR)/usr/include/librtmp + mkdir $(STAGING_DIR)/usr/include/librtmp/librtmp + cp -rf $(@D)/*.h $(STAGING_DIR)/usr/include/librtmp + cp -rf $(@D)/librtmp/*.h $(STAGING_DIR)/usr/include/librtmp/librtmp +endef + +# define LIBRTMP_CONFIGURE_CMDS + +# endef + +# $(eval $(autotools-package)) +$(eval $(generic-package)) diff --git a/patches/0001-buildroot-libopenssl.patch b/patches/0001-buildroot-libopenssl.patch new file mode 100644 index 0000000..855b5a2 --- /dev/null +++ b/patches/0001-buildroot-libopenssl.patch @@ -0,0 +1,17 @@ +Index: buildroot-2020.02.11/package/libopenssl/libopenssl.mk +=================================================================== +--- buildroot-2020.02.11.orig/package/libopenssl/libopenssl.mk ++++ buildroot-2020.02.11/package/libopenssl/libopenssl.mk +@@ -103,6 +103,12 @@ endef + + define LIBOPENSSL_INSTALL_STAGING_CMDS + $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) DESTDIR=$(STAGING_DIR) install ++ cp -rf $(@D)/crypto/hmac/hmac_local.h $(STAGING_DIR)/usr/include/openssl ++ cp -rf $(@D)/crypto/dh/dh_local.h $(STAGING_DIR)/usr/include/openssl ++ cp -rf $(@D)/include/* $(STAGING_DIR)/usr/include/openssl ++ ++ cp -rf $(@D)/*.a $(STAGING_DIR)/lib64/lp64d/ ++ cp -rf $(@D)/*.so* $(STAGING_DIR)/lib64/lp64d/ + endef + + define HOST_LIBOPENSSL_INSTALL_CMDS From 3c4deb1c2cf73b83387623f657322da91258b42e Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sat, 14 May 2022 23:21:48 +0800 Subject: [PATCH 09/23] Modify ffmpeg compilation parameters: remove enable alsa --- package/ffmpeg_canaan/ffmpeg.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/package/ffmpeg_canaan/ffmpeg.mk b/package/ffmpeg_canaan/ffmpeg.mk index c7ff6af..f7d5180 100644 --- a/package/ffmpeg_canaan/ffmpeg.mk +++ b/package/ffmpeg_canaan/ffmpeg.mk @@ -48,7 +48,6 @@ define FFMPEG_CANAAN_CONFIGURE_CMDS --enable-libk510_video \ --enable-libk510_h264 \ --enable-libk510_jpeg \ - --enable-alsa \ --disable-autodetect \ --disable-ffplay \ --disable-ffprobe \ From cfa6b12563c3fd0d369685d9604dd885fd114286 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 09:37:35 +0800 Subject: [PATCH 10/23] Add configuration items of RTMP package --- Config.in | 2 +- configs/k510_crb_lp3_v0_1_defconfig | 3 +++ configs/k510_crb_lp3_v1_2_defconfig | 3 +++ configs/k510_evb_lp3_v1_1_defconfig | 5 ++++- package/ffmpeg_canaan/Config.in | 1 + package/ffmpeg_canaan/ffmpeg.mk | 1 + 6 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Config.in b/Config.in index f2c9088..db2d053 100644 --- a/Config.in +++ b/Config.in @@ -20,7 +20,6 @@ source "$BR2_EXTERNAL_K510_PATH/package/mediactl_lib/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/mailbox_demo/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/dsp_scheduler/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/live555_canaan/Config.in" -source "$BR2_EXTERNAL_K510_PATH/package/librtmp/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/ai/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/client/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/server/Config.in" @@ -34,3 +33,4 @@ source "$BR2_EXTERNAL_K510_PATH/package/write_read_file/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/wifi/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/gpio_keys/Config.in" source "$BR2_EXTERNAL_K510_PATH/package/hello_world/Config.in" +source "$BR2_EXTERNAL_K510_PATH/package/librtmp/Config.in" diff --git a/configs/k510_crb_lp3_v0_1_defconfig b/configs/k510_crb_lp3_v0_1_defconfig index 4b636f6..35ab978 100644 --- a/configs/k510_crb_lp3_v0_1_defconfig +++ b/configs/k510_crb_lp3_v0_1_defconfig @@ -108,6 +108,9 @@ BR2_TARGET_K510_EVB_TEST_SIMD_UMUL8_FIRMWARE=y BR2_PACKAGE_DSP_LOG=y BR2_PACKAGE_VENC_LIB=y BR2_PACKAGE_ALSA_DEMO=y +BR2_PACKAGE_LIBRTMP=y +BR2_PACKAGE_OPENSSL=y +BR2_PACKAGE_LIBOPENSSL=y BR2_PACKAGE_FFMPEG_CANAAN=y BR2_PACKAGE_AUDIO3A_LIB=y BR2_PACKAGE_MEDIACTL_LIB=y diff --git a/configs/k510_crb_lp3_v1_2_defconfig b/configs/k510_crb_lp3_v1_2_defconfig index be8b3c4..f573c1e 100644 --- a/configs/k510_crb_lp3_v1_2_defconfig +++ b/configs/k510_crb_lp3_v1_2_defconfig @@ -114,6 +114,9 @@ BR2_PACKAGE_MEDIACTL_LIB=y BR2_PACKAGE_MAILBOX_DEMO=y BR2_PACKAGE_DSP_SCHEDULER=y BR2_PACKAGE_LIVE555_CANAAN=y +BR2_PACKAGE_LIBRTMP=y +BR2_PACKAGE_OPENSSL=y +BR2_PACKAGE_LIBOPENSSL=y BR2_PACKAGE_AI=y BR2_PACKAGE_AI_KMODEL_DATA_SITE="https://github.com/kendryte/k510_buildroot/releases/download/v1.5/ai_kmodel_data.tar.xz" BR2_PACKAGE_CLIENT=y diff --git a/configs/k510_evb_lp3_v1_1_defconfig b/configs/k510_evb_lp3_v1_1_defconfig index aee23c5..50969c6 100644 --- a/configs/k510_evb_lp3_v1_1_defconfig +++ b/configs/k510_evb_lp3_v1_1_defconfig @@ -75,7 +75,7 @@ BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING=y BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y BR2_PACKAGE_WPA_SUPPLICANT_EAP=y BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y -BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y +R2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y BR2_PACKAGE_WPA_SUPPLICANT_WPS=y BR2_PACKAGE_WPA_SUPPLICANT_WPA3=y BR2_PACKAGE_WPA_SUPPLICANT_CLI=y @@ -112,5 +112,8 @@ BR2_PACKAGE_MEDIACTL_LIB=y BR2_PACKAGE_MAILBOX_DEMO=y BR2_PACKAGE_DSP_SCHEDULER=y BR2_PACKAGE_LIVE555_CANAAN=y +BR2_PACKAGE_LIBRTMP=y +BR2_PACKAGE_OPENSSL=y +BR2_PACKAGE_LIBOPENSSL=y BR2_PACKAGE_AI=y BR2_PACKAGE_AI_KMODEL_DATA_SITE="https://github.com/kendryte/k510_buildroot/releases/download/v1.5/ai_kmodel_data.tar.xz" diff --git a/package/ffmpeg_canaan/Config.in b/package/ffmpeg_canaan/Config.in index 428b609..4a023f2 100644 --- a/package/ffmpeg_canaan/Config.in +++ b/package/ffmpeg_canaan/Config.in @@ -4,6 +4,7 @@ config BR2_PACKAGE_FFMPEG_CANAAN depends on BR2_PACKAGE_VIDEO_LIB depends on BR2_PACKAGE_VENC_LIB depends on BR2_PACKAGE_MEDIACTL_LIB + depends on BR2_PACKAGE_LIBRTMP help k510 ffmpeg app diff --git a/package/ffmpeg_canaan/ffmpeg.mk b/package/ffmpeg_canaan/ffmpeg.mk index f7d5180..c7ff6af 100644 --- a/package/ffmpeg_canaan/ffmpeg.mk +++ b/package/ffmpeg_canaan/ffmpeg.mk @@ -48,6 +48,7 @@ define FFMPEG_CANAAN_CONFIGURE_CMDS --enable-libk510_video \ --enable-libk510_h264 \ --enable-libk510_jpeg \ + --enable-alsa \ --disable-autodetect \ --disable-ffplay \ --disable-ffprobe \ From cc253c3f26e4a90362b42d993f660b2fa0fe4484 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 10:06:56 +0800 Subject: [PATCH 11/23] Add ffmpeg dependency configuration --- configs/k510_evb_lp3_v1_1_defconfig | 2 +- package/ffmpeg_canaan/ffmpeg.mk | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configs/k510_evb_lp3_v1_1_defconfig b/configs/k510_evb_lp3_v1_1_defconfig index 50969c6..334b5cd 100644 --- a/configs/k510_evb_lp3_v1_1_defconfig +++ b/configs/k510_evb_lp3_v1_1_defconfig @@ -75,7 +75,7 @@ BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING=y BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y BR2_PACKAGE_WPA_SUPPLICANT_EAP=y BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y -R2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y +BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y BR2_PACKAGE_WPA_SUPPLICANT_WPS=y BR2_PACKAGE_WPA_SUPPLICANT_WPA3=y BR2_PACKAGE_WPA_SUPPLICANT_CLI=y diff --git a/package/ffmpeg_canaan/ffmpeg.mk b/package/ffmpeg_canaan/ffmpeg.mk index c7ff6af..b7157ce 100644 --- a/package/ffmpeg_canaan/ffmpeg.mk +++ b/package/ffmpeg_canaan/ffmpeg.mk @@ -25,6 +25,7 @@ FFMPEG_CANAAN_DEPENDENCIES += mediactl_lib FFMPEG_CANAAN_DEPENDENCIES += dsp_scheduler FFMPEG_CANAAN_DEPENDENCIES += libzlib FFMPEG_CANAAN_DEPENDENCIES += libopenssl +FFMPEG_CANAAN_DEPENDENCIES += librtmp FFMPEG_CANAAN_CONF_ENV += CFLAGS="$(FFMPEG_CANAAN_CFLAGS)" FFMPEG_CANAAN_CONF_OPTS += $(call qstrip,$(BR2_PACKAGE_FFMPEG_CANAAN_EXTRACONF)) From 28826cf795349574bf49b60c09dc6ddda2151165 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 10:57:25 +0800 Subject: [PATCH 12/23] rebuild again --- package/ffmpeg_canaan/ffmpeg.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/package/ffmpeg_canaan/ffmpeg.mk b/package/ffmpeg_canaan/ffmpeg.mk index b7157ce..69242d7 100644 --- a/package/ffmpeg_canaan/ffmpeg.mk +++ b/package/ffmpeg_canaan/ffmpeg.mk @@ -27,6 +27,7 @@ FFMPEG_CANAAN_DEPENDENCIES += libzlib FFMPEG_CANAAN_DEPENDENCIES += libopenssl FFMPEG_CANAAN_DEPENDENCIES += librtmp + FFMPEG_CANAAN_CONF_ENV += CFLAGS="$(FFMPEG_CANAAN_CFLAGS)" FFMPEG_CANAAN_CONF_OPTS += $(call qstrip,$(BR2_PACKAGE_FFMPEG_CANAAN_EXTRACONF)) From 42bb9ebef060b0e51ae3cac01033a2bf660a562e Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 11:09:07 +0800 Subject: [PATCH 13/23] Modify rtmpdump download address --- package/librtmp/librtmp.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package/librtmp/librtmp.mk b/package/librtmp/librtmp.mk index de52f13..795857b 100644 --- a/package/librtmp/librtmp.mk +++ b/package/librtmp/librtmp.mk @@ -9,8 +9,10 @@ # LIBRTMP_SITE = http://rtmpdump.mplayerhq.hu/download # LIBRTMP_INSTALL_STAGING = YES -LIBRTMP_VERSION_FULL = f1b83c10d8beb43fcc70a6e88cf4325499f25857 -LIBRTMP_VERSION_HEAD = f1b83c1 +#LIBRTMP_VERSION_FULL = f1b83c10d8beb43fcc70a6e88cf4325499f25857 +#LIBRTMP_VERSION_HEAD = f1b83c1 +LIBRTMP_VERSION_FULL = c5f04a58fc2aeea6296ca7c44ee4734c18401aa3 +LIBRTMP_VERSION_HEAD = c5f04a58fc2aeea6296ca7c44ee4734c18401aa3 LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION_HEAD).tar.gz LIBRTMP_SITE = https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/$(LIBRTMP_VERSION_FULL).tar.gz LIBRTMP_INSTALL_STAGING = YES From 11467f20f1e54c1259b6a6e489328d5ee5d4a514 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 11:18:37 +0800 Subject: [PATCH 14/23] Modify rtmpdump download address --- package/librtmp/librtmp.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/librtmp/librtmp.mk b/package/librtmp/librtmp.mk index 795857b..ac1f507 100644 --- a/package/librtmp/librtmp.mk +++ b/package/librtmp/librtmp.mk @@ -11,8 +11,8 @@ #LIBRTMP_VERSION_FULL = f1b83c10d8beb43fcc70a6e88cf4325499f25857 #LIBRTMP_VERSION_HEAD = f1b83c1 -LIBRTMP_VERSION_FULL = c5f04a58fc2aeea6296ca7c44ee4734c18401aa3 -LIBRTMP_VERSION_HEAD = c5f04a58fc2aeea6296ca7c44ee4734c18401aa3 +LIBRTMP_VERSION_FULL = fa8646daeb19dfd12c181f7d19de708d623704c0 +LIBRTMP_VERSION_HEAD = fa8646daeb19dfd12c181f7d19de708d623704c0 LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION_HEAD).tar.gz LIBRTMP_SITE = https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/$(LIBRTMP_VERSION_FULL).tar.gz LIBRTMP_INSTALL_STAGING = YES From 251cdac12821b0c69e8a6d2ae24e4af2b05a5907 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 12:44:34 +0800 Subject: [PATCH 15/23] Modify librtmp package hash verification --- package/librtmp/librtmp.hash | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash index ad28a54..9b6aaa0 100644 --- a/package/librtmp/librtmp.hash +++ b/package/librtmp/librtmp.hash @@ -1,3 +1,5 @@ # Locally generated -md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz -sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz +#md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz +#sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz +md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz From 5455342b21116fec31c3bf9f21f175bb9036f2e1 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 13:16:18 +0800 Subject: [PATCH 16/23] modify librtmp hash --- package/librtmp/librtmp.hash | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash index 9b6aaa0..dfcf87a 100644 --- a/package/librtmp/librtmp.hash +++ b/package/librtmp/librtmp.hash @@ -1,5 +1,5 @@ # Locally generated -#md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz -#sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz -md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz -sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz +sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz +#md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +#sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz From 4d002e1300a81881982dbd9685b696ac02e51054 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 17:33:52 +0800 Subject: [PATCH 17/23] modify librtmp hash --- package/librtmp/librtmp.hash | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash index dfcf87a..9b6aaa0 100644 --- a/package/librtmp/librtmp.hash +++ b/package/librtmp/librtmp.hash @@ -1,5 +1,5 @@ # Locally generated -md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz -sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz -#md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz -#sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +#md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz +#sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz +md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz From 71deb8e48fac8a24dacbad196a217287565519d4 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 18:11:26 +0800 Subject: [PATCH 18/23] modify librtmp hash --- package/librtmp/librtmp.hash | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash index 9b6aaa0..a48af00 100644 --- a/package/librtmp/librtmp.hash +++ b/package/librtmp/librtmp.hash @@ -1,5 +1,6 @@ # Locally generated #md5 00f5c8a6959ec46832db0d5e29361bd6 rtmpdump-f1b83c1.tar.gz #sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz -md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +#md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +md5 8797fa11c4f2b9686443f2464e7b708e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz From 3ac7fe5d04f0be0221a9bf36c4b3ea4f07c0d32f Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 18:39:39 +0800 Subject: [PATCH 19/23] modify librtmp hash --- package/librtmp/librtmp.hash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/librtmp/librtmp.hash b/package/librtmp/librtmp.hash index a48af00..e71d5be 100644 --- a/package/librtmp/librtmp.hash +++ b/package/librtmp/librtmp.hash @@ -3,4 +3,4 @@ #sha256 9e6388acb7f64c06d1ccff50ed6c2af9fafc515a8d601c5e5f671c72752e2a7e rtmpdump-f1b83c1.tar.gz #md5 d41d8cd98f00b204e9800998ecf8427e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz md5 8797fa11c4f2b9686443f2464e7b708e rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz -sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz +sha256 c59185efb0574ec46eba03718086e8f0ca7764f07ce1f6519f0560389124e609 rtmpdump-fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz From 64673af172ee916dbaf9fa7057739e8ae067c406 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 19:18:26 +0800 Subject: [PATCH 20/23] Modify librtmp decompression name --- package/librtmp/librtmp.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/librtmp/librtmp.mk b/package/librtmp/librtmp.mk index ac1f507..18b9ec4 100644 --- a/package/librtmp/librtmp.mk +++ b/package/librtmp/librtmp.mk @@ -13,7 +13,7 @@ #LIBRTMP_VERSION_HEAD = f1b83c1 LIBRTMP_VERSION_FULL = fa8646daeb19dfd12c181f7d19de708d623704c0 LIBRTMP_VERSION_HEAD = fa8646daeb19dfd12c181f7d19de708d623704c0 -LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION_HEAD).tar.gz +LIBRTMP_SOURCE = rtmpdump.tar.gz LIBRTMP_SITE = https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/$(LIBRTMP_VERSION_FULL).tar.gz LIBRTMP_INSTALL_STAGING = YES From d401aba25e73291caa70d0e393ab7178a16a76d6 Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Sun, 15 May 2022 20:38:42 +0800 Subject: [PATCH 21/23] modify librtmp config --- package/librtmp/librtmp.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/librtmp/librtmp.mk b/package/librtmp/librtmp.mk index 18b9ec4..ac1f507 100644 --- a/package/librtmp/librtmp.mk +++ b/package/librtmp/librtmp.mk @@ -13,7 +13,7 @@ #LIBRTMP_VERSION_HEAD = f1b83c1 LIBRTMP_VERSION_FULL = fa8646daeb19dfd12c181f7d19de708d623704c0 LIBRTMP_VERSION_HEAD = fa8646daeb19dfd12c181f7d19de708d623704c0 -LIBRTMP_SOURCE = rtmpdump.tar.gz +LIBRTMP_SOURCE = rtmpdump-$(LIBRTMP_VERSION_HEAD).tar.gz LIBRTMP_SITE = https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/$(LIBRTMP_VERSION_FULL).tar.gz LIBRTMP_INSTALL_STAGING = YES From 4526df2177f004e56eb2e1627a8af88376a934ab Mon Sep 17 00:00:00 2001 From: gh-sxp Date: Mon, 16 May 2022 08:08:41 +0800 Subject: [PATCH 22/23] modify librtmp patch --- package/librtmp/0001-buildroot-librtmp.patch | 41 +++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/package/librtmp/0001-buildroot-librtmp.patch b/package/librtmp/0001-buildroot-librtmp.patch index c51dc39..261e61b 100644 --- a/package/librtmp/0001-buildroot-librtmp.patch +++ b/package/librtmp/0001-buildroot-librtmp.patch @@ -1,8 +1,12 @@ -Index: b/librtmp/dh.h -=================================================================== ---- a/librtmp/dh.h -+++ b/librtmp/dh.h -@@ -166,6 +166,8 @@ static int MDH_compute_key(uint8_t *secr +diff -uNr librtmp/.applied_patches_list librtmp_patch/.applied_patches_list +--- librtmp/.applied_patches_list 2022-05-16 07:57:39.293694173 +0800 ++++ librtmp_patch/.applied_patches_list 2022-05-16 07:55:59.577091606 +0800 +@@ -0,0 +1 @@ ++/home/sunxiaopeng/src/work/github/k510_buildroot/package/librtmp//0001-buildroot-librtmp.patch +diff -uNr librtmp/librtmp/dh.h librtmp_patch/librtmp/dh.h +--- librtmp/librtmp/dh.h 2015-12-24 03:09:27.000000000 +0800 ++++ librtmp_patch/librtmp/dh.h 2022-05-16 07:55:59.577091606 +0800 +@@ -166,6 +166,8 @@ #else /* USE_OPENSSL */ #include #include @@ -11,11 +15,10 @@ Index: b/librtmp/dh.h typedef BIGNUM * MP_t; #define MP_new(m) m = BN_new() -Index: b/librtmp/handshake.h -=================================================================== ---- a/librtmp/handshake.h -+++ b/librtmp/handshake.h -@@ -66,12 +66,13 @@ typedef struct arcfour_ctx* RC4_handle; +diff -uNr librtmp/librtmp/handshake.h librtmp_patch/librtmp/handshake.h +--- librtmp/librtmp/handshake.h 2015-12-24 03:09:27.000000000 +0800 ++++ librtmp_patch/librtmp/handshake.h 2022-05-16 07:55:59.581091631 +0800 +@@ -66,12 +66,13 @@ #include #include #include @@ -31,10 +34,9 @@ Index: b/librtmp/handshake.h typedef RC4_KEY * RC4_handle; #define RC4_alloc(h) *h = malloc(sizeof(RC4_KEY)) -Index: b/librtmp/hashswf.c -=================================================================== ---- a/librtmp/hashswf.c -+++ b/librtmp/hashswf.c +diff -uNr librtmp/librtmp/hashswf.c librtmp_patch/librtmp/hashswf.c +--- librtmp/librtmp/hashswf.c 2015-12-24 03:09:27.000000000 +0800 ++++ librtmp_patch/librtmp/hashswf.c 2022-05-16 07:55:59.581091631 +0800 @@ -57,10 +57,11 @@ #include #include @@ -49,3 +51,14 @@ Index: b/librtmp/hashswf.c #endif extern void RTMP_TLS_Init(); +diff -uNr librtmp/librtmp/Makefile librtmp_patch/librtmp/Makefile +--- librtmp/librtmp/Makefile 2015-12-24 03:09:27.000000000 +0800 ++++ librtmp_patch/librtmp/Makefile 2022-05-16 08:00:18.006582281 +0800 +@@ -115,6 +115,7 @@ + cp librtmp.3 $(MANDIR)/man3 + + install_so: librtmp$(SO_EXT) ++ -mkdir -p $(SODIR) + cp librtmp$(SO_EXT) $(SODIR) + $(INSTALL_IMPLIB) + cd $(SODIR); ln -sf librtmp$(SO_EXT) librtmp.$(SOX) From 5e1641f3e030acb15b0283efe1330dde94a32650 Mon Sep 17 00:00:00 2001 From: Wentao Wu Date: Mon, 16 May 2022 10:56:32 +0800 Subject: [PATCH 23/23] remove buildroot-2020.02.11 cache dir --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4b33bc..0c509fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,6 +64,7 @@ jobs: run: | sed -i "s/BR2_JLEVEL=5/BR2_JLEVEL=14/g" configs/$CONF rm -rf $CONF + rm -rf buildroot-2020.02.11 make CONF=$CONF - name: Save image to CI root