[x265] [PATCH] api: 'x265_get_ref_frame_list' to get forward and backward refrence list
Pradeep Ramachandran
pradeep at multicorewareinc.com
Mon Nov 6 05:51:38 CET 2017
On Fri, Nov 3, 2017 at 4:21 PM, <praveen at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Praveen Tiwari <praveen at multicorewareinc.com>
> # Date 1509446629 -19800
> # Tue Oct 31 16:13:49 2017 +0530
> # Node ID 6ad93877ffe19cd6cf285f0cc8189f41dce606b8
> # Parent de91aae2db5353e4e548d002e2dce530a6c8078d
> api: 'x265_get_ref_frame_list' to get forward and backward refrence list
>
Pushed to default branch.
>
> diff -r de91aae2db53 -r 6ad93877ffe1 doc/reST/api.rst
> --- a/doc/reST/api.rst Tue Oct 31 13:57:37 2017 +0530
> +++ b/doc/reST/api.rst Tue Oct 31 16:13:49 2017 +0530
> @@ -201,6 +201,13 @@
> * This API must be called after(poc >= lookaheadDepth + bframes
> + 2) condition check. */
> int x265_get_slicetype_poc_and_scenecut(x265_encoder *encoder, int
> *slicetype, int *poc, int* sceneCut);
>
> +**x265_get_ref_frame_list()** may be used to fetch forward and backward
> refrence list::
> +
> + /* x265_get_ref_frame_list:
> + * returns negative on error, 0 when access unit were output.
> + * This API must be called after(poc >= lookaheadDepth + bframes
> + 2) condition check */
> + int x265_get_ref_frame_list(x265_encoder *encoder, x265_picyuv**,
> x265_picyuv**, int, int);
> +
> **x265_encoder_ctu_info**
> /* x265_encoder_ctu_info:
> * Copy CTU information such as ctu address and ctu partition
> structure of all
> diff -r de91aae2db53 -r 6ad93877ffe1 source/CMakeLists.txt
> --- a/source/CMakeLists.txt Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/CMakeLists.txt Tue Oct 31 16:13:49 2017 +0530
> @@ -29,7 +29,7 @@
> option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
> # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 137)
> +set(X265_BUILD 138)
> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
> "${PROJECT_BINARY_DIR}/x265.def")
> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r de91aae2db53 -r 6ad93877ffe1 source/common/frame.h
> --- a/source/common/frame.h Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/common/frame.h Tue Oct 31 16:13:49 2017 +0530
> @@ -98,6 +98,7 @@
>
> float* m_quantOffsets; // points to
> quantOffsets in x265_picture
> x265_sei m_userSEI;
> + Event m_reconEncoded;
>
> /* Frame Parallelism - notification between FrameEncoders of
> available motion reference rows */
> ThreadSafeInteger* m_reconRowFlag; // flag of CTU rows
> completely reconstructed and extended for motion reference
> diff -r de91aae2db53 -r 6ad93877ffe1 source/common/picyuv.h
> --- a/source/common/picyuv.h Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/common/picyuv.h Tue Oct 31 16:13:49 2017 +0530
> @@ -27,6 +27,7 @@
> #include "common.h"
> #include "md5.h"
> #include "x265.h"
> +struct x265_picyuv {};
>
> namespace X265_NS {
> // private namespace
> @@ -34,7 +35,7 @@
> class ShortYuv;
> struct SPS;
>
> -class PicYuv
> +class PicYuv : public x265_picyuv
> {
> public:
>
> diff -r de91aae2db53 -r 6ad93877ffe1 source/encoder/api.cpp
> --- a/source/encoder/api.cpp Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/encoder/api.cpp Tue Oct 31 16:13:49 2017 +0530
> @@ -350,6 +350,15 @@
> return -1;
> }
>
> +int x265_get_ref_frame_list(x265_encoder *enc, x265_picyuv** l0,
> x265_picyuv** l1, int sliceType, int poc)
> +{
> + if (!enc)
> + return -1;
> +
> + Encoder *encoder = static_cast<Encoder*>(enc);
> + return encoder->getRefFrameList((PicYuv**)l0, (PicYuv**)l1,
> sliceType, poc);
> +}
> +
> void x265_cleanup(void)
> {
> BitCost::destroy();
> @@ -424,6 +433,7 @@
> &x265_encoder_intra_refresh,
> &x265_encoder_ctu_info,
> &x265_get_slicetype_poc_and_scenecut,
> + &x265_get_ref_frame_list,
> };
>
> typedef const x265_api* (*api_get_func)(int bitDepth);
> diff -r de91aae2db53 -r 6ad93877ffe1 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/encoder/encoder.cpp Tue Oct 31 16:13:49 2017 +0530
> @@ -446,6 +446,47 @@
> return 0;
> }
>
> +int Encoder::getRefFrameList(PicYuv** l0, PicYuv** l1, int sliceType,
> int poc)
> +{
> + if (!(IS_X265_TYPE_I(sliceType)))
> + {
> + Frame *framePtr = m_dpb->m_picList.getPOC(poc);
> + if (framePtr != NULL)
> + {
> + for (int j = 0; j < framePtr->m_encData->m_slice->m_numRefIdx[0];
> j++) // check only for --ref=n number of frames.
> + {
> + if (framePtr->m_encData->m_slice->m_refFrameList[0][j]
> && framePtr->m_encData->m_slice->m_refFrameList[0][j]->m_reconPic != NULL)
> + {
> + int l0POC = framePtr->m_encData->m_slice->
> m_refFrameList[0][j]->m_poc;
> + Frame* l0Fp = m_dpb->m_picList.getPOC(l0POC);
> + if (l0Fp->m_reconPic->m_picOrg[0] == NULL)
> + l0Fp->m_reconEncoded.wait(); /* If recon is not
> ready, current frame encoder need to wait. */
> + l0[j] = l0Fp->m_reconPic;
> + }
> + }
> + for (int j = 0; j < framePtr->m_encData->m_slice->m_numRefIdx[1];
> j++) // check only for --ref=n number of frames.
> + {
> + if (framePtr->m_encData->m_slice->m_refFrameList[1][j]
> && framePtr->m_encData->m_slice->m_refFrameList[1][j]->m_reconPic != NULL)
> + {
> + int l1POC = framePtr->m_encData->m_slice->
> m_refFrameList[1][j]->m_poc;
> + Frame* l1Fp = m_dpb->m_picList.getPOC(l1POC);
> + if (l1Fp->m_reconPic->m_picOrg[0] == NULL)
> + l1Fp->m_reconEncoded.wait(); /* If recon is not
> ready, current frame encoder need to wait. */
> + l1[j] = l1Fp->m_reconPic;
> + }
> + }
> + }
> + else
> + x265_log(NULL, X265_LOG_WARNING, "Refrence List is not in
> piclist\n");
> + }
> + else
> + {
> + x265_log(NULL, X265_LOG_ERROR, "I frames does not have a refrence
> List\n");
> + return -1;
> + }
> + return 0;
> +}
> +
> void Encoder::destroy()
> {
> #if ENABLE_HDR10_PLUS
> diff -r de91aae2db53 -r 6ad93877ffe1 source/encoder/encoder.h
> --- a/source/encoder/encoder.h Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/encoder/encoder.h Tue Oct 31 16:13:49 2017 +0530
> @@ -207,6 +207,8 @@
>
> int copySlicetypePocAndSceneCut(int *slicetype, int *poc, int
> *sceneCut);
>
> + int getRefFrameList(PicYuv** l0, PicYuv** l1, int sliceType, int poc);
> +
> void getStreamHeaders(NALList& list, Entropy& sbacCoder, Bitstream&
> bs);
>
> void fetchStats(x265_stats* stats, size_t statsSizeBytes);
> diff -r de91aae2db53 -r 6ad93877ffe1 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/encoder/frameencoder.cpp Tue Oct 31 16:13:49 2017 +0530
> @@ -337,6 +337,8 @@
> }
> compressFrame();
> m_done.trigger(); /* FrameEncoder::getEncodedPicture() blocks
> for this event */
> + if (m_frame != NULL)
> + m_frame->m_reconEncoded.trigger();
> m_enable.wait();
> }
> }
> diff -r de91aae2db53 -r 6ad93877ffe1 source/x265.h
> --- a/source/x265.h Tue Oct 31 13:57:37 2017 +0530
> +++ b/source/x265.h Tue Oct 31 16:13:49 2017 +0530
> @@ -35,6 +35,10 @@
> * opaque handler for encoder */
> typedef struct x265_encoder x265_encoder;
>
> +/* x265_picyuv:
> + * opaque handler for PicYuv */
> +typedef struct x265_picyuv x265_picyuv;
> +
> /* Application developers planning to link against a shared library
> version of
> * libx265 from a Microsoft Visual Studio or similar development
> environment
> * will need to define X265_API_IMPORTS before including this header.
> @@ -1712,6 +1716,11 @@
> * This API must be called after(poc >= lookaheadDepth + bframes + 2)
> condition check */
> int x265_get_slicetype_poc_and_scenecut(x265_encoder *encoder, int
> *slicetype, int *poc, int* sceneCut);
>
> +/* x265_get_ref_frame_list:
> + * returns negative on error, 0 when access unit were output.
> + * This API must be called after(poc >= lookaheadDepth + bframes + 2)
> condition check */
> +int x265_get_ref_frame_list(x265_encoder *encoder, x265_picyuv**,
> x265_picyuv**, int, int);
> +
> void x265_cleanup(void);
>
> #define X265_MAJOR_VERSION 1
> @@ -1760,6 +1769,7 @@
> int (*encoder_intra_refresh)(x265_encoder*);
> int (*encoder_ctu_info)(x265_encoder*, int,
> x265_ctu_info_t**);
> int (*x265_get_slicetype_poc_and_scenecut)(x265_encoder*,
> int*, int*, int*);
> + int (*x265_get_ref_frame_list)(x265_encoder*,
> x265_picyuv**, x265_picyuv**, int, int);
> /* add new pointers to the end, or increment X265_MAJOR_VERSION */
> } x265_api;
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20171106/1384746e/attachment-0001.html>
More information about the x265-devel
mailing list