Hmm - this patch is just doing what we've been doing so far with x265_picture->planes....
I guess this is fine for now, but this really needs to be documented - it could screw up lots of derivative applications. On Mon, Jun 13, 2016 at 2:51 PM, Deepthi Nandakumar < [email protected]> wrote: > > > On Mon, Jun 13, 2016 at 11:45 AM, Divya Manivannan < > [email protected]> wrote: > >> On Mon, Jun 13, 2016 at 11:00 AM, Divya Manivannan < >> [email protected]> wrote: >> >>> # HG changeset patch >>> # User Divya Manivannan <[email protected]> >>> # Date 1465554208 -19800 >>> # Fri Jun 10 15:53:28 2016 +0530 >>> # Node ID c898428779dfbfaaf9b1e7eb2d7676d86a2f54c0 >>> # Parent 0af296185f7ae3e05493ecf164046ddfec085bb3 >>> rc: Add multi-pass data to x265_rc_stats >>> x265_rc_stats is changed into void pointer to avoid the build number >>> change >>> whenever new fields are added to it in future. >>> >>> diff -r 0af296185f7a -r c898428779df source/CMakeLists.txt >>> --- a/source/CMakeLists.txt Tue Jun 07 09:20:11 2016 +0530 >>> +++ b/source/CMakeLists.txt Fri Jun 10 15:53:28 2016 +0530 >>> @@ -30,7 +30,7 @@ >>> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD) >>> >>> # X265_BUILD must be incremented each time the public API is changed >>> -set(X265_BUILD 85) >>> +set(X265_BUILD 86) >>> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in" >>> "${PROJECT_BINARY_DIR}/x265.def") >>> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in" >>> diff -r 0af296185f7a -r c898428779df source/common/frame.cpp >>> --- a/source/common/frame.cpp Tue Jun 07 09:20:11 2016 +0530 >>> +++ b/source/common/frame.cpp Fri Jun 10 15:53:28 2016 +0530 >>> @@ -42,12 +42,14 @@ >>> m_prev = NULL; >>> m_param = NULL; >>> memset(&m_lowres, 0, sizeof(m_lowres)); >>> + m_rcData = NULL; >>> } >>> >>> bool Frame::create(x265_param *param, float* quantOffsets) >>> { >>> m_fencPic = new PicYuv; >>> m_param = param; >>> + CHECKED_MALLOC_ZERO(m_rcData, x265_rc_stats, 1); >>> >>> if (m_fencPic->create(param->sourceWidth, param->sourceHeight, >>> param->internalCsp) && >>> m_lowres.create(m_fencPic, param->bframes, !!param->rc.aqMode)) >>> @@ -64,6 +66,8 @@ >>> return true; >>> } >>> return false; >>> +fail: >>> + return false; >>> } >>> >>> bool Frame::allocEncodeData(x265_param *param, const SPS& sps) >>> @@ -140,4 +144,5 @@ >>> } >>> >>> m_lowres.destroy(); >>> + X265_FREE(m_rcData); >>> } >>> diff -r 0af296185f7a -r c898428779df source/common/frame.h >>> --- a/source/common/frame.h Tue Jun 07 09:20:11 2016 +0530 >>> +++ b/source/common/frame.h Fri Jun 10 15:53:28 2016 +0530 >>> @@ -72,6 +72,7 @@ >>> Frame* m_prev; >>> x265_param* m_param; // Points to the >>> latest param set for the frame. >>> x265_analysis_data m_analysisData; >>> + x265_rc_stats* m_rcData; >>> Frame(); >>> >>> bool create(x265_param *param, float* quantOffsets); >>> diff -r 0af296185f7a -r c898428779df source/encoder/encoder.cpp >>> --- a/source/encoder/encoder.cpp Tue Jun 07 09:20:11 2016 +0530 >>> +++ b/source/encoder/encoder.cpp Fri Jun 10 15:53:28 2016 +0530 >>> @@ -779,17 +779,22 @@ >>> >>> if (pic_out && m_param->rc.bStatWrite) >>> { >>> - pic_out->rcData.qpaRc = outFrame->m_encData->m_avgQpRc; >>> - pic_out->rcData.qRceq = curEncoder->m_rce.qRceq; >>> - pic_out->rcData.qpNoVbv = curEncoder->m_rce.qpNoVbv; >>> - pic_out->rcData.coeffBits = >>> outFrame->m_encData->m_frameStats.coeffBits; >>> - pic_out->rcData.miscBits = >>> outFrame->m_encData->m_frameStats.miscBits; >>> - pic_out->rcData.mvBits = >>> outFrame->m_encData->m_frameStats.mvBits; >>> - pic_out->rcData.newQScale = >>> x265_qp2qScale(outFrame->m_encData->m_avgQpRc); >>> - pic_out->rcData.poc = curEncoder->m_rce.poc; >>> - pic_out->rcData.encodeOrder = >>> curEncoder->m_rce.encodeOrder; >>> - pic_out->rcData.sliceType = curEncoder->m_rce.sliceType; >>> - pic_out->rcData.keptAsRef = curEncoder->m_rce.sliceType >>> == B_SLICE && !IS_REFERENCED(outFrame) ? 0 : 1; >>> + pic_out->rcData = outFrame->m_rcData; >>> + outFrame->m_rcData->qpaRc = >>> outFrame->m_encData->m_avgQpRc; >>> + outFrame->m_rcData->qRceq = curEncoder->m_rce.qRceq; >>> + outFrame->m_rcData->qpNoVbv = curEncoder->m_rce.qpNoVbv; >>> + outFrame->m_rcData->coeffBits = >>> outFrame->m_encData->m_frameStats.coeffBits; >>> + outFrame->m_rcData->miscBits = >>> outFrame->m_encData->m_frameStats.miscBits; >>> + outFrame->m_rcData->mvBits = >>> outFrame->m_encData->m_frameStats.mvBits; >>> + outFrame->m_rcData->qScale = >>> outFrame->m_rcData->newQScale = >>> x265_qp2qScale(outFrame->m_encData->m_avgQpRc); >>> + outFrame->m_rcData->poc = curEncoder->m_rce.poc; >>> + outFrame->m_rcData->encodeOrder = >>> curEncoder->m_rce.encodeOrder; >>> + outFrame->m_rcData->sliceType = >>> curEncoder->m_rce.sliceType; >>> + outFrame->m_rcData->keptAsRef = >>> curEncoder->m_rce.sliceType == B_SLICE && !IS_REFERENCED(outFrame) ? 0 : 1; >>> + outFrame->m_rcData->qpAq = >>> outFrame->m_encData->m_avgQpAq; >>> + outFrame->m_rcData->iCuCount = >>> outFrame->m_encData->m_frameStats.percent8x8Intra * m_rateControl->m_ncu; >>> + outFrame->m_rcData->pCuCount = >>> outFrame->m_encData->m_frameStats.percent8x8Inter * m_rateControl->m_ncu; >>> + outFrame->m_rcData->skipCuCount = >>> outFrame->m_encData->m_frameStats.percent8x8Skip * m_rateControl->m_ncu; >>> } >>> >> >> This still needs to be copied into x265_picture..... >> >> It is copied into x265_picture in the above code: pic_out->rcData = >> outFrame->m_rcData; >> > > pic_out is memory "owned" by the application. You cannot return a pointer > to a block of encoder's internal memory (within Frame). If statswrite > (analysis save or pass 1) is enabled, x265_picture_alloc allocates > data for rcdata, copies from Frame* and returns in pic_out (also free it > in picture_free). > > You may need to modify the CLI to use x265_picture_alloc and free. > > > >> >>> /* Allow this frame to be recycled if no frame encoders are >>> using it for reference */ >>> diff -r 0af296185f7a -r c898428779df source/x265.h >>> --- a/source/x265.h Tue Jun 07 09:20:11 2016 +0530 >>> +++ b/source/x265.h Fri Jun 10 15:53:28 2016 +0530 >>> @@ -153,17 +153,22 @@ >>> /* Ratecontrol statistics */ >>> typedef struct x265_rc_stats >>> { >>> - double qpaRc; >>> - double qRceq; >>> - double qpNoVbv; >>> - double newQScale; >>> - int mvBits; >>> - int miscBits; >>> - int coeffBits; >>> - int poc; >>> - int encodeOrder; >>> - int sliceType; >>> - int keptAsRef; >>> + double qpaRc; >>> + double qpAq; >>> + double qRceq; >>> + double qpNoVbv; >>> + double newQScale; >>> + double iCuCount; >>> + double pCuCount; >>> + double skipCuCount; >>> + double qScale; >>> + int mvBits; >>> + int miscBits; >>> + int coeffBits; >>> + int poc; >>> + int encodeOrder; >>> + int sliceType; >>> + int keptAsRef; >>> } x265_rc_stats; >>> >>> >> This definition can now be moved inside into frame.h. >> >> I will move this definition and send the patch again. >> >> >>> /* Used to pass pictures into the encoder, and to get picture data back >>> out of >>> @@ -240,7 +245,7 @@ >>> /* Ratecontrol statistics for collecting the ratecontrol >>> information. >>> * It is not used for collecting the last pass ratecontrol data in >>> * multi pass ratecontrol mode. */ >>> - x265_rc_stats rcData; >>> + void* rcData; >>> >>> uint64_t framesize; >>> >>> _______________________________________________ >>> x265-devel mailing list >>> [email protected] >>> https://mailman.videolan.org/listinfo/x265-devel >>> >> >> >> >> -- >> Deepthi Nandakumar >> Engineering Manager, x265 >> Multicoreware, Inc >> >> _______________________________________________ >> x265-devel mailing list >> [email protected] >> https://mailman.videolan.org/listinfo/x265-devel >> >> >> >> _______________________________________________ >> x265-devel mailing list >> [email protected] >> https://mailman.videolan.org/listinfo/x265-devel >> >> > > > -- > Deepthi Nandakumar > Engineering Manager, x265 > Multicoreware, Inc > -- Deepthi Nandakumar Engineering Manager, x265 Multicoreware, Inc
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
