Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
-Original Message- From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of James Almer Sent: Friday, May 31, 2019 11:17 AM To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper >You should return 0 here. AVCodec.encode2() must not return AVERROR_EOF. >Anything < 0 is considered an error. >Since this can only happen after EOF, a return value of 0 and *got_packet == 0 >will effectively signal EOF. >Use PRId64 instead of ld. Thanks so much for the review! Modified and please kindly review again. Regards, Sun, Jing ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
Signed-off-by: Zhengxu Huang Signed-off-by: Hassene Tmar Signed-off-by: Jun Zhao Signed-off-by: Jing Sun --- configure| 4 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libsvt_hevc.c | 501 +++ libavcodec/version.h | 2 +- 5 files changed, 508 insertions(+), 1 deletion(-) create mode 100644 libavcodec/libsvt_hevc.c diff --git a/configure b/configure index 32fc263..9e29ad3 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ External library support: --enable-libspeexenable Speex de/encoding via libspeex [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libssh enable SFTP protocol via libssh [no] + --enable-libsvthevc enable HEVC encoding via svt [no] --enable-libtensorflow enable TensorFlow as a DNN module backend for DNN based filters like sr [no] --enable-libtesseractenable Tesseract, needed for ocr filter [no] @@ -1787,6 +1788,7 @@ EXTERNAL_LIBRARY_LIST=" libspeex libsrt libssh +libsvthevc libtensorflow libtesseract libtheora @@ -3179,6 +3181,7 @@ libshine_encoder_select="audio_frame_queue" libspeex_decoder_deps="libspeex" libspeex_encoder_deps="libspeex" libspeex_encoder_select="audio_frame_queue" +libsvt_hevc_encoder_deps="libsvthevc" libtheora_encoder_deps="libtheora" libtwolame_encoder_deps="libtwolame" libvo_amrwbenc_encoder_deps="libvo_amrwbenc" @@ -6210,6 +6213,7 @@ enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr enabled libssh&& require_pkg_config libssh libssh libssh/sftp.h sftp_init enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init enabled libsrt&& require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket +enabled libsvthevc&& require_pkg_config libsvthevc SvtHevcEnc EbApi.h EbInitHandle enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg diff --git a/libavcodec/Makefile b/libavcodec/Makefile index edccd73..7eb13de 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -991,6 +991,7 @@ OBJS-$(CONFIG_LIBOPUS_ENCODER)+= libopusenc.o libopus.o \ OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o +OBJS-$(CONFIG_LIBSVT_HEVC_ENCODER)+= libsvt_hevc.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6178d31..e27a7b6 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -706,6 +706,7 @@ extern AVCodec ff_librsvg_decoder; extern AVCodec ff_libshine_encoder; extern AVCodec ff_libspeex_encoder; extern AVCodec ff_libspeex_decoder; +extern AVCodec ff_libsvt_hevc_encoder; extern AVCodec ff_libtheora_encoder; extern AVCodec ff_libtwolame_encoder; extern AVCodec ff_libvo_amrwbenc_encoder; diff --git a/libavcodec/libsvt_hevc.c b/libavcodec/libsvt_hevc.c new file mode 100644 index 000..d9ac04c --- /dev/null +++ b/libavcodec/libsvt_hevc.c @@ -0,0 +1,501 @@ +/* +* Scalable Video Technology for HEVC encoder library plugin +* +* Copyright (c) 2019 Intel Corporation +* +* 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 this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "EbErrorCodes.h" +#include "EbTime.h" +#include "EbApi.h" + +#include "libavutil/common.h" +#include "libavutil/frame.h" +#include "libavutil/opt.h" + +#include "internal.h" +#include "avcodec.h" + +typedef enum eos_status { +EOS_NOT_REACHED = 0, +EOS_SENT, +EOS_RECEIVED +}EOS_STATUS; + +typedef struct SvtContext { +AVClass *class; + +EB_H265_ENC_CONFIGURATION enc_params; +EB_COMPONENTTYPE *svt_handle; +EB_BUFFERHEADERTYPE in_buf; +EOS_STATUS eos_flag;
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
On 5/31/2019 12:50 AM, Jing Sun wrote: > Signed-off-by: Zhengxu Huang > Signed-off-by: Hassene Tmar > Signed-off-by: Jun Zhao > Signed-off-by: Jing Sun > --- > configure| 4 + > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/libsvt_hevc.c | 499 > +++ > libavcodec/version.h | 2 +- > 5 files changed, 506 insertions(+), 1 deletion(-) > create mode 100644 libavcodec/libsvt_hevc.c [...] > +static int eb_encode_frame(AVCodecContext *avctx, AVPacket *pkt, > + const AVFrame *frame, int *got_packet) > +{ > +SvtContext *svt_enc = avctx->priv_data; > +EB_BUFFERHEADERTYPE *header_ptr = _enc->in_buf; > +EB_ERRORTYPE svt_ret; > +int av_ret; > + > +if (EOS_RECEIVED == svt_enc->eos_flag) > +return AVERROR_EOF; You should return 0 here. AVCodec.encode2() must not return AVERROR_EOF. Anything < 0 is considered an error. Since this can only happen after EOF, a return value of 0 and *got_packet == 0 will effectively signal EOF. > + > +if (!frame) { > +if (!svt_enc->eos_flag) { > +svt_enc->eos_flag = EOS_SENT; > + > +header_ptr->nAllocLen = 0; > +header_ptr->nFilledLen = 0; > +header_ptr->nTickCount = 0; > +header_ptr->pBuffer = NULL; > +header_ptr->nFlags = EB_BUFFERFLAG_EOS; > + > +EbH265EncSendPicture(svt_enc->svt_handle, header_ptr); > + > +av_log(avctx, AV_LOG_DEBUG, "Sent EOS\n"); > +} > +} else { > +read_in_data(_enc->enc_params, frame, header_ptr); > +header_ptr->pts = frame->pts; > + > +EbH265EncSendPicture(svt_enc->svt_handle, header_ptr); > + > +av_log(avctx, AV_LOG_DEBUG, "Sent PTS %ld\n", header_ptr->pts); Use PRId64 instead of ld. > +} > + > +header_ptr = NULL; > +svt_ret = EbH265GetPacket(svt_enc->svt_handle, _ptr, > svt_enc->eos_flag); > + > +if (svt_ret == EB_NoErrorEmptyQueue) { > +*got_packet = 0; > +av_log(avctx, AV_LOG_DEBUG, "Received none\n"); > +return 0; > +} > + > +av_log(avctx, AV_LOG_DEBUG, "Received PTS %ld packet\n", > header_ptr->pts); Same. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
Signed-off-by: Zhengxu Huang Signed-off-by: Hassene Tmar Signed-off-by: Jun Zhao Signed-off-by: Jing Sun --- configure| 4 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libsvt_hevc.c | 499 +++ libavcodec/version.h | 2 +- 5 files changed, 506 insertions(+), 1 deletion(-) create mode 100644 libavcodec/libsvt_hevc.c diff --git a/configure b/configure index 32fc263..9e29ad3 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ External library support: --enable-libspeexenable Speex de/encoding via libspeex [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libssh enable SFTP protocol via libssh [no] + --enable-libsvthevc enable HEVC encoding via svt [no] --enable-libtensorflow enable TensorFlow as a DNN module backend for DNN based filters like sr [no] --enable-libtesseractenable Tesseract, needed for ocr filter [no] @@ -1787,6 +1788,7 @@ EXTERNAL_LIBRARY_LIST=" libspeex libsrt libssh +libsvthevc libtensorflow libtesseract libtheora @@ -3179,6 +3181,7 @@ libshine_encoder_select="audio_frame_queue" libspeex_decoder_deps="libspeex" libspeex_encoder_deps="libspeex" libspeex_encoder_select="audio_frame_queue" +libsvt_hevc_encoder_deps="libsvthevc" libtheora_encoder_deps="libtheora" libtwolame_encoder_deps="libtwolame" libvo_amrwbenc_encoder_deps="libvo_amrwbenc" @@ -6210,6 +6213,7 @@ enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr enabled libssh&& require_pkg_config libssh libssh libssh/sftp.h sftp_init enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init enabled libsrt&& require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket +enabled libsvthevc&& require_pkg_config libsvthevc SvtHevcEnc EbApi.h EbInitHandle enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg diff --git a/libavcodec/Makefile b/libavcodec/Makefile index edccd73..7eb13de 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -991,6 +991,7 @@ OBJS-$(CONFIG_LIBOPUS_ENCODER)+= libopusenc.o libopus.o \ OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o +OBJS-$(CONFIG_LIBSVT_HEVC_ENCODER)+= libsvt_hevc.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6178d31..e27a7b6 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -706,6 +706,7 @@ extern AVCodec ff_librsvg_decoder; extern AVCodec ff_libshine_encoder; extern AVCodec ff_libspeex_encoder; extern AVCodec ff_libspeex_decoder; +extern AVCodec ff_libsvt_hevc_encoder; extern AVCodec ff_libtheora_encoder; extern AVCodec ff_libtwolame_encoder; extern AVCodec ff_libvo_amrwbenc_encoder; diff --git a/libavcodec/libsvt_hevc.c b/libavcodec/libsvt_hevc.c new file mode 100644 index 000..fe6ea4b --- /dev/null +++ b/libavcodec/libsvt_hevc.c @@ -0,0 +1,499 @@ +/* +* Scalable Video Technology for HEVC encoder library plugin +* +* Copyright (c) 2019 Intel Corporation +* +* 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 this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "EbErrorCodes.h" +#include "EbTime.h" +#include "EbApi.h" + +#include "libavutil/common.h" +#include "libavutil/frame.h" +#include "libavutil/opt.h" + +#include "internal.h" +#include "avcodec.h" + +typedef enum eos_status { +EOS_NOT_REACHED = 0, +EOS_SENT, +EOS_RECEIVED +}EOS_STATUS; + +typedef struct SvtContext { +AVClass *class; + +EB_H265_ENC_CONFIGURATION enc_params; +EB_COMPONENTTYPE *svt_handle; +EB_BUFFERHEADERTYPE in_buf; +EOS_STATUS eos_flag;
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
-Original Message- From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of James Almer Sent: Friday, May 31, 2019 10:38 AM To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper >No, with the encode2 API you should be using ff_alloc_packet2() instead. >As i said, the API user may provide it's own buffer in the avpacket passed to >avcodec_encode_video2(), which av_new_packet() would ignore and >unconditionally allocate a new one. Thanks for the guidance! I am modifying it and will submit the modification soon. Regards, Sun, Jing ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
-Original Message- From: Sun, Jing A Sent: Friday, May 31, 2019 11:37 AM To: ffmpeg-devel@ffmpeg.org Cc: Sun, Jing A ; Huang, Zhengxu ; Tmar, Hassene ; Jun Zhao Subject: [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper Sorry I forgot to remove some debugging code lines, removed them in the just sent one: -typedef struct TIME_LOG{ -unsigned int pts; -int64_t time; -} TIME_LOG; - -#define START_LOG_POS 2 -#define TOTAL_LOG_COUNT 8192 -static TIME_LOG logs[TOTAL_LOG_COUNT], sent_logs[TOTAL_LOG_COUNT]; -static unsigned int frame_count = 0, sent_frame_count = 0; -static int64_t start_time = 0; Regards, Sun, Jing ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
On 5/30/2019 11:16 PM, Sun, Jing A wrote: > -Original Message- > From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of > James Almer > Sent: Thursday, May 30, 2019 11:35 PM > To: ffmpeg-devel@ffmpeg.org > Subject: Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc > encoder wrapper > >> Why the switch to encode2? All previous versions were using the send/receive >> API, and seeing SVT also uses a decoupled input/output API, it was certainly >> the most adequate option. >> Were you running into some issue? A quick look at v12 shows you were using >> ff_alloc_packet2(), which afaik you shouldn't have. It's meant for the >> encode2() API only, where user provided buffers are allowed, and it alone >> does not ensure the packet will be reference counted, which is required for >> the send/receive API. > > Hi James, > > Yes I indeed was running into an issue. Although SVT uses a decoupled > input/output API, it calls the two by the below method: > while(not stopped) { > send_frame(one frame); > if (receive_packet(one frame’s pkt) != empty) > save_bitstream; > } > In one round, none or only one packet is receive. > > However, if using v12's send_frame/receive_packet implementation, it is > possible that multiple of receive_packet are executed in one round. > while(not stopped) { > send_frame(one frame); > while(1) { > if (receive_packet(one frame’s pkt) == empty) > break; > else > save_bitstream; > } > } > > The first calling method's sequence is like: > Send 579 > Receive 487 > Send 580 > Receive 496 > Send 581 > Receive 492 > Send 582 > Receive 490 > Send 583 > Receive 489 > Send 584 > Receive 491 > Send 585 > Receive 494 > Send 586 > Receive 493 > Send 587 > Receive 495 > And the second one's is: > Send 579 > Receive empty > Send 580 > Receive 489 > Receive 491 > Receive 494 > Receive 493 > Receive 495 > Receive empty > Send 581 > Receive 504 > Receive empty > Send 582 > Receive empty > Send 583 > Receive empty > Send 584 > Receive 500 > Receive empty > Send 585 > Receive empty > Send 586 > Receive empty > Send 587 > > When we input the source frame at the constant frequency 60, the first one's > each second's output frames are ~60, [59, 61], while the second one's tends > to be like 64(63) ->57(58) ->64(63) ->57(58)… > Besides the average FPS, the stableness of each second's FPS is also > important to us. So I changed the API to encode2, because in encode2, I can > control the SVT's send_frame/receive_packet calling sequence, and let it not > do receive_packet more than once in one round. Yes, i can reproduce what you describe with the ffmpeg.c CLI, where avcodec_receive_frame is called in a while(1) loop until it returns EAGAIN after each avcodec_send_frame call. In the end it depends on how an API user implements avcodec_send_frame/avcodec_receive_frame, but using the encode2 API for this purpose is ok. > > And thanks for the information on ff_alloc_packet2. I changed to use > av_new_packet in v13 and hope it's OK. No, with the encode2 API you should be using ff_alloc_packet2() instead. As i said, the API user may provide it's own buffer in the avpacket passed to avcodec_encode_video2(), which av_new_packet() would ignore and unconditionally allocate a new one. > > Regards, > Sun, Jing > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
Signed-off-by: Zhengxu Huang Signed-off-by: Hassene Tmar Signed-off-by: Jun Zhao Signed-off-by: Jing Sun --- configure| 4 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libsvt_hevc.c | 499 +++ libavcodec/version.h | 2 +- 5 files changed, 506 insertions(+), 1 deletion(-) create mode 100644 libavcodec/libsvt_hevc.c diff --git a/configure b/configure index 32fc263..9e29ad3 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ External library support: --enable-libspeexenable Speex de/encoding via libspeex [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libssh enable SFTP protocol via libssh [no] + --enable-libsvthevc enable HEVC encoding via svt [no] --enable-libtensorflow enable TensorFlow as a DNN module backend for DNN based filters like sr [no] --enable-libtesseractenable Tesseract, needed for ocr filter [no] @@ -1787,6 +1788,7 @@ EXTERNAL_LIBRARY_LIST=" libspeex libsrt libssh +libsvthevc libtensorflow libtesseract libtheora @@ -3179,6 +3181,7 @@ libshine_encoder_select="audio_frame_queue" libspeex_decoder_deps="libspeex" libspeex_encoder_deps="libspeex" libspeex_encoder_select="audio_frame_queue" +libsvt_hevc_encoder_deps="libsvthevc" libtheora_encoder_deps="libtheora" libtwolame_encoder_deps="libtwolame" libvo_amrwbenc_encoder_deps="libvo_amrwbenc" @@ -6210,6 +6213,7 @@ enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr enabled libssh&& require_pkg_config libssh libssh libssh/sftp.h sftp_init enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init enabled libsrt&& require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket +enabled libsvthevc&& require_pkg_config libsvthevc SvtHevcEnc EbApi.h EbInitHandle enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg diff --git a/libavcodec/Makefile b/libavcodec/Makefile index edccd73..7eb13de 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -991,6 +991,7 @@ OBJS-$(CONFIG_LIBOPUS_ENCODER)+= libopusenc.o libopus.o \ OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o +OBJS-$(CONFIG_LIBSVT_HEVC_ENCODER)+= libsvt_hevc.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6178d31..e27a7b6 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -706,6 +706,7 @@ extern AVCodec ff_librsvg_decoder; extern AVCodec ff_libshine_encoder; extern AVCodec ff_libspeex_encoder; extern AVCodec ff_libspeex_decoder; +extern AVCodec ff_libsvt_hevc_encoder; extern AVCodec ff_libtheora_encoder; extern AVCodec ff_libtwolame_encoder; extern AVCodec ff_libvo_amrwbenc_encoder; diff --git a/libavcodec/libsvt_hevc.c b/libavcodec/libsvt_hevc.c new file mode 100644 index 000..a445c84a4 --- /dev/null +++ b/libavcodec/libsvt_hevc.c @@ -0,0 +1,499 @@ +/* +* Scalable Video Technology for HEVC encoder library plugin +* +* Copyright (c) 2019 Intel Corporation +* +* 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 this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "EbErrorCodes.h" +#include "EbTime.h" +#include "EbApi.h" + +#include "libavutil/common.h" +#include "libavutil/frame.h" +#include "libavutil/opt.h" + +#include "internal.h" +#include "avcodec.h" + +typedef enum eos_status { +EOS_NOT_REACHED = 0, +EOS_SENT, +EOS_RECEIVED +}EOS_STATUS; + +typedef struct SvtContext { +AVClass *class; + +EB_H265_ENC_CONFIGURATION enc_params; +EB_COMPONENTTYPE *svt_handle; +EB_BUFFERHEADERTYPE in_buf; +EOS_STATUS
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
-Original Message- From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of James Almer Sent: Thursday, May 30, 2019 11:35 PM To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper >Why the switch to encode2? All previous versions were using the send/receive >API, and seeing SVT also uses a decoupled input/output API, it was certainly >the most adequate option. >Were you running into some issue? A quick look at v12 shows you were using >ff_alloc_packet2(), which afaik you shouldn't have. It's meant for the >encode2() API only, where user provided buffers are allowed, and it alone does >not ensure the packet will be reference counted, which is required for the >send/receive API. Hi James, Yes I indeed was running into an issue. Although SVT uses a decoupled input/output API, it calls the two by the below method: while(not stopped) { send_frame(one frame); if (receive_packet(one frame’s pkt) != empty) save_bitstream; } In one round, none or only one packet is receive. However, if using v12's send_frame/receive_packet implementation, it is possible that multiple of receive_packet are executed in one round. while(not stopped) { send_frame(one frame); while(1) { if (receive_packet(one frame’s pkt) == empty) break; else save_bitstream; } } The first calling method's sequence is like: Send 579 Receive 487 Send 580 Receive 496 Send 581 Receive 492 Send 582 Receive 490 Send 583 Receive 489 Send 584 Receive 491 Send 585 Receive 494 Send 586 Receive 493 Send 587 Receive 495 And the second one's is: Send 579 Receive empty Send 580 Receive 489 Receive 491 Receive 494 Receive 493 Receive 495 Receive empty Send 581 Receive 504 Receive empty Send 582 Receive empty Send 583 Receive empty Send 584 Receive 500 Receive empty Send 585 Receive empty Send 586 Receive empty Send 587 When we input the source frame at the constant frequency 60, the first one's each second's output frames are ~60, [59, 61], while the second one's tends to be like 64(63) ->57(58) ->64(63) ->57(58)… Besides the average FPS, the stableness of each second's FPS is also important to us. So I changed the API to encode2, because in encode2, I can control the SVT's send_frame/receive_packet calling sequence, and let it not do receive_packet more than once in one round. And thanks for the information on ff_alloc_packet2. I changed to use av_new_packet in v13 and hope it's OK. Regards, Sun, Jing ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
On 5/30/2019 8:04 AM, Jing Sun wrote: > Signed-off-by: Zhengxu Huang > Signed-off-by: Hassene Tmar > Signed-off-by: Jun Zhao > Signed-off-by: Jing Sun > --- > configure| 4 + > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/libsvt_hevc.c | 510 > +++ > libavcodec/version.h | 2 +- > 5 files changed, 517 insertions(+), 1 deletion(-) > create mode 100644 libavcodec/libsvt_hevc.c [...] > +AVCodec ff_libsvt_hevc_encoder = { > +.name = "libsvt_hevc", > +.long_name = NULL_IF_CONFIG_SMALL("SVT-HEVC(Scalable Video > Technology for HEVC) encoder"), > +.priv_data_size = sizeof(SvtContext), > +.type = AVMEDIA_TYPE_VIDEO, > +.id = AV_CODEC_ID_HEVC, > +.init = eb_enc_init, > +.encode2= eb_encode_frame, Why the switch to encode2? All previous versions were using the send/receive API, and seeing SVT also uses a decoupled input/output API, it was certainly the most adequate option. Were you running into some issue? A quick look at v12 shows you were using ff_alloc_packet2(), which afaik you shouldn't have. It's meant for the encode2() API only, where user provided buffers are allowed, and it alone does not ensure the packet will be reference counted, which is required for the send/receive API. > +.close = eb_enc_close, > +.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS, > +.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, > +AV_PIX_FMT_YUV420P10, > +AV_PIX_FMT_YUV422P, > +AV_PIX_FMT_YUV420P10, > +AV_PIX_FMT_YUV444P, > +AV_PIX_FMT_YUV444P10, > +AV_PIX_FMT_NONE }, > +.priv_class = , > +.defaults = eb_enc_defaults, > +.caps_internal = FF_CODEC_CAP_INIT_CLEANUP, > +.wrapper_name = "libsvt_hevc", > +}; > diff --git a/libavcodec/version.h b/libavcodec/version.h > index 7ed6071..8773fee 100644 > --- a/libavcodec/version.h > +++ b/libavcodec/version.h > @@ -29,7 +29,7 @@ > > #define LIBAVCODEC_VERSION_MAJOR 58 > #define LIBAVCODEC_VERSION_MINOR 52 > -#define LIBAVCODEC_VERSION_MICRO 102 > +#define LIBAVCODEC_VERSION_MICRO 103 > > #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ > LIBAVCODEC_VERSION_MINOR, \ > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH v13 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper
Signed-off-by: Zhengxu Huang Signed-off-by: Hassene Tmar Signed-off-by: Jun Zhao Signed-off-by: Jing Sun --- configure| 4 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libsvt_hevc.c | 510 +++ libavcodec/version.h | 2 +- 5 files changed, 517 insertions(+), 1 deletion(-) create mode 100644 libavcodec/libsvt_hevc.c diff --git a/configure b/configure index 32fc263..9e29ad3 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ External library support: --enable-libspeexenable Speex de/encoding via libspeex [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libssh enable SFTP protocol via libssh [no] + --enable-libsvthevc enable HEVC encoding via svt [no] --enable-libtensorflow enable TensorFlow as a DNN module backend for DNN based filters like sr [no] --enable-libtesseractenable Tesseract, needed for ocr filter [no] @@ -1787,6 +1788,7 @@ EXTERNAL_LIBRARY_LIST=" libspeex libsrt libssh +libsvthevc libtensorflow libtesseract libtheora @@ -3179,6 +3181,7 @@ libshine_encoder_select="audio_frame_queue" libspeex_decoder_deps="libspeex" libspeex_encoder_deps="libspeex" libspeex_encoder_select="audio_frame_queue" +libsvt_hevc_encoder_deps="libsvthevc" libtheora_encoder_deps="libtheora" libtwolame_encoder_deps="libtwolame" libvo_amrwbenc_encoder_deps="libvo_amrwbenc" @@ -6210,6 +6213,7 @@ enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr enabled libssh&& require_pkg_config libssh libssh libssh/sftp.h sftp_init enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init enabled libsrt&& require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket +enabled libsvthevc&& require_pkg_config libsvthevc SvtHevcEnc EbApi.h EbInitHandle enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg diff --git a/libavcodec/Makefile b/libavcodec/Makefile index edccd73..7eb13de 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -991,6 +991,7 @@ OBJS-$(CONFIG_LIBOPUS_ENCODER)+= libopusenc.o libopus.o \ OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o +OBJS-$(CONFIG_LIBSVT_HEVC_ENCODER)+= libsvt_hevc.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6178d31..e27a7b6 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -706,6 +706,7 @@ extern AVCodec ff_librsvg_decoder; extern AVCodec ff_libshine_encoder; extern AVCodec ff_libspeex_encoder; extern AVCodec ff_libspeex_decoder; +extern AVCodec ff_libsvt_hevc_encoder; extern AVCodec ff_libtheora_encoder; extern AVCodec ff_libtwolame_encoder; extern AVCodec ff_libvo_amrwbenc_encoder; diff --git a/libavcodec/libsvt_hevc.c b/libavcodec/libsvt_hevc.c new file mode 100644 index 000..1c740e6 --- /dev/null +++ b/libavcodec/libsvt_hevc.c @@ -0,0 +1,510 @@ +/* +* Scalable Video Technology for HEVC encoder library plugin +* +* Copyright (c) 2019 Intel Corporation +* +* 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 this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "EbErrorCodes.h" +#include "EbTime.h" +#include "EbApi.h" + +#include "libavutil/common.h" +#include "libavutil/frame.h" +#include "libavutil/opt.h" + +#include "internal.h" +#include "avcodec.h" + +typedef enum eos_status { +EOS_NOT_REACHED = 0, +EOS_SENT, +EOS_RECEIVED +}EOS_STATUS; + +typedef struct SvtContext { +AVClass *class; + +EB_H265_ENC_CONFIGURATION enc_params; +EB_COMPONENTTYPE *svt_handle; +EB_BUFFERHEADERTYPE in_buf; +EOS_STATUS eos_flag;