Re: [x265] [PATCH] RateControl : Bug fix when previous estimated frame cost is zero
On Tue, Sep 24, 2013 at 1:33 AM, sumala...@multicorewareinc.com wrote: # HG changeset patch # User sumalatha polureddy # Date 1380004245 -19800 # Node ID 759460e7afeeb7d97ea427a702ac08eb9d8a3293 # Parent 6fa50183e0098f9e94b677ef8dc00c416f28c0f3 RateControl : Bug fix when previous estimated frame cost is zero queued for stable after some white-space cleanups diff -r 6fa50183e009 -r 759460e7afee source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cppTue Sep 24 11:56:43 2013 +0530 +++ b/source/encoder/ratecontrol.cppTue Sep 24 12:00:45 2013 +0530 @@ -62,7 +62,7 @@ lastNonBPictType = -1; baseQp = param-rc.qp; qp = baseQp; - +lastRceq = 1; // handles the cmplxrsum when the previous frame cost is zero // heuristics- encoder specific qCompress = param-rc.qCompress; // tweak and test for x265. ipFactor = param-rc.ipFactor; @@ -255,15 +255,20 @@ lqmax = lastQScaleFor[pictType] * lstep; } /* Rate control needs to be more aggressive based on actual costs obtained for previous encoded frame */ -if (overflow 1.1 framesDone 3) -{ -lqmax *= lstep; -lqmin*= pow(lstep,1/frameThreads); -} -else if (overflow 0.9) -{ -lqmin /= lstep; -lqmax /= pow(lstep,1/frameThreads); +int rfAdapt = 1; +if (overflow 1.1 framesDone 3) +{ +//Control propagation of excessive overflow / underfow +if(overflow 1.5) +rfAdapt = 2; +lqmax *= pow(lstep, rfAdapt); +} +else if (overflow 0.9) +{ +if(overflow 0.6) +rfAdapt = 2; +lqmin /= pow(lstep, rfAdapt); +lqmax /= pow(lstep, rfAdapt / frameThreads); } q = Clip3(lqmin, lqmax, q); } ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel -- Steve Borho ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] [PATCH] Reset CABAC status to get same output between single and multi threading
# HG changeset patch # User Min Chen chenm...@163.com # Date 1380008038 -28800 # Node ID 24ee870a56655b89cc43c60e14aa6aadb412ead8 # Parent ad78668116108242def30a1ce3e8d14c52323346 Reset CABAC status to get same output between single and multi threading diff -r ad7866811610 -r 24ee870a5665 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Mon Sep 23 20:09:53 2013 -0500 +++ b/source/encoder/frameencoder.cpp Tue Sep 24 15:33:58 2013 +0800 @@ -843,6 +843,7 @@ m_rows[i].m_rdSbacCoders[0][CI_CURR_BEST]-load(m_sbacCoder); m_rows[i].m_completed = 0; +m_rows[i].m_rdGoOnBinCodersCABAC.m_fracBits = 0; } UInt refLagRows = ((m_cfg-param.searchRange + NTAPS_LUMA/2 + g_maxCUHeight - 1) / g_maxCUHeight) + 1; diff -r ad7866811610 -r 24ee870a5665 source/encoder/framefilter.cpp --- a/source/encoder/framefilter.cppMon Sep 23 20:09:53 2013 -0500 +++ b/source/encoder/framefilter.cppTue Sep 24 15:33:58 2013 +0800 @@ -85,6 +85,7 @@ m_rdGoOnSbacCoder.init(m_rdGoOnBinCodersCABAC); m_entropyCoder.setEntropyCoder(m_rdGoOnSbacCoder, pic-getSlice()); m_entropyCoder.setBitstream(m_bitCounter); +m_rdGoOnBinCodersCABAC.m_fracBits = 0; if (m_cfg-param.bEnableLoopFilter) { ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] [PATCH] Reset CABAC status to get same output between single and multi threading
# HG changeset patch # User Min Chen chenm...@163.com # Date 1380008038 -28800 # Node ID 24ee870a56655b89cc43c60e14aa6aadb412ead8 # Parent ad78668116108242def30a1ce3e8d14c52323346 Reset CABAC status to get same output between single and multi threading diff -r ad7866811610 -r 24ee870a5665 source/encoder/frameencoder.cpp --- a/source/encoder/frameencoder.cpp Mon Sep 23 20:09:53 2013 -0500 +++ b/source/encoder/frameencoder.cpp Tue Sep 24 15:33:58 2013 +0800 @@ -843,6 +843,7 @@ m_rows[i].m_rdSbacCoders[0][CI_CURR_BEST]-load(m_sbacCoder); m_rows[i].m_completed = 0; +m_rows[i].m_rdGoOnBinCodersCABAC.m_fracBits = 0; } UInt refLagRows = ((m_cfg-param.searchRange + NTAPS_LUMA/2 + g_maxCUHeight - 1) / g_maxCUHeight) + 1; diff -r ad7866811610 -r 24ee870a5665 source/encoder/framefilter.cpp --- a/source/encoder/framefilter.cppMon Sep 23 20:09:53 2013 -0500 +++ b/source/encoder/framefilter.cppTue Sep 24 15:33:58 2013 +0800 @@ -85,6 +85,7 @@ m_rdGoOnSbacCoder.init(m_rdGoOnBinCodersCABAC); m_entropyCoder.setEntropyCoder(m_rdGoOnSbacCoder, pic-getSlice()); m_entropyCoder.setBitstream(m_bitCounter); +m_rdGoOnBinCodersCABAC.m_fracBits = 0; if (m_cfg-param.bEnableLoopFilter) { ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] Commit c56e392b2c68 fails to link with MinGW
There is a linking problem with revision c56e392b2c68 on MinGW. The error comes from common.cpp and is our old friend: undefined reference to `__sync_val_compare_and_swap_4' The file common.cpp must be added to the list of files for which -march=i686 is applied in source\common\CMakeLists.txt. Best regards Nikos___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
Re: [x265] Commit c56e392b2c68 fails to link with MinGW
Thanks, pushed fix. On Tue, Sep 24, 2013 at 2:14 PM, Nikos Barkas nikbar2...@yahoo.com wrote: There is a linking problem with revision c56e392b2c68 on MinGW. The error comes from common.cpp and is our old friend: undefined reference to `__sync_val_compare_and_swap_4' The file common.cpp must be added to the list of files for which -march=i686 is applied in source\common\CMakeLists.txt. Best regards Nikos ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] [PATCH] tcomBitstream: Removed Unused std::vector class code
# HG changeset patch # User Gopu Govindaswamy g...@multicorewareinc.com # Date 1380023106 -19800 # Node ID 1752b4fce57e6e78a626642c07a1fd498c650256 # Parent 70ba2b3b7bc972ed04f5fd135d940e4759315fa8 tcomBitstream: Removed Unused std::vector class code diff -r 70ba2b3b7bc9 -r 1752b4fce57e source/Lib/TLibCommon/TComBitStream.cpp --- a/source/Lib/TLibCommon/TComBitStream.cpp Tue Sep 24 16:15:10 2013 +0530 +++ b/source/Lib/TLibCommon/TComBitStream.cpp Tue Sep 24 17:15:06 2013 +0530 @@ -208,27 +208,4 @@ return cnt; } -/** - * insert the contents of the bytealigned (and flushed) bitstream src - * into this at byte position pos. - */ -void TComOutputBitstream::insertAt(const TComOutputBitstream src, UInt pos) -{ -assert(0 == src.getNumberOfWrittenBits() % 8); - -vectoruint8_t::iterator at = this-m_fifo-begin() + pos; -this-m_fifo-insert(at, src.m_fifo-begin(), src.m_fifo-end()); -} - -TComOutputBitstream TComOutputBitstream::operator =(const TComOutputBitstream src) -{ -vectoruint8_t::iterator at = this-m_fifo-begin(); -this-m_fifo-insert(at, src.m_fifo-begin(), src.m_fifo-end()); - -this-m_num_held_bits = src.m_num_held_bits; -this-m_held_bits = src.m_held_bits; - -return *this; -} - //! \} diff -r 70ba2b3b7bc9 -r 1752b4fce57e source/Lib/TLibCommon/TComBitStream.h --- a/source/Lib/TLibCommon/TComBitStream.h Tue Sep 24 16:15:10 2013 +0530 +++ b/source/Lib/TLibCommon/TComBitStream.h Tue Sep 24 17:15:06 2013 +0530 @@ -142,16 +142,13 @@ */ UInt getNumberOfWrittenBits() const { return UInt(m_fifo-size()) * 8 + m_num_held_bits; } -void insertAt(const TComOutputBitstream src, UInt pos); - -/** + /** * Return a reference to the internal fifo */ std::vectoruint8_t getFIFO() { return *m_fifo; } UChar getHeldBits() { return m_held_bits; } -TComOutputBitstream operator =(const TComOutputBitstream src); /** Return a reference to the internal fifo */ std::vectoruint8_t getFIFO() const { return *m_fifo; } ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
[x265] [PATCH] Encoder: do not use std::list for the class AccessUnit
# HG changeset patch # User Gopu Govindaswamy g...@multicorewareinc.com # Date 1380019510 -19800 # Node ID 70ba2b3b7bc972ed04f5fd135d940e4759315fa8 # Parent a8f6f62217d5e519f99a004c420e5906ac900f2f Encoder: do not use std::list for the class AccessUnit diff -r a8f6f62217d5 -r 70ba2b3b7bc9 source/Lib/TLibEncoder/TEncTop.cpp --- a/source/Lib/TLibEncoder/TEncTop.cppTue Sep 24 14:22:02 2013 +0530 +++ b/source/Lib/TLibEncoder/TEncTop.cppTue Sep 24 16:15:10 2013 +0530 @@ -114,14 +114,16 @@ for (int i = 0; i param.frameNumThreads; i++) { // Ensure frame encoder is idle before destroying it -AccessUnit tmp; -m_frameEncoder[i].getEncodedPicture(tmp); -for (AccessUnit::const_iterator it = tmp.begin(); it != tmp.end(); it++) +NALUnitEBSP **nalunits = NULL; +m_frameEncoder[i].getEncodedPicture(nalunits); +if (nalunits) { -const NALUnitEBSP nalu = **it; -free(nalu.m_nalUnitData); +for (int nalcount = 0; nalunits[nalcount] != NULL; nalcount++) +{ +const NALUnitEBSP nalu = *nalunits[nalcount]; +free(nalu.m_nalUnitData); +} } - m_frameEncoder[i].destroy(); } @@ -161,9 +163,9 @@ } } -int TEncTop::getStreamHeaders(AccessUnit accessUnit) +int TEncTop::getStreamHeaders(NALUnitEBSP **nalunits) { -return m_frameEncoder-getStreamHeaders(accessUnit); +return m_frameEncoder-getStreamHeaders(nalunits); } /** @@ -173,7 +175,7 @@ \param accessUnitsOut output bitstream \retval number of encoded pictures */ -int TEncTop::encode(bool flush, const x265_picture_t* pic_in, x265_picture_t *pic_out, AccessUnit accessUnitOut) +int TEncTop::encode(bool flush, const x265_picture_t* pic_in, x265_picture_t *pic_out, NALUnitEBSP **nalunits) { if (pic_in) { @@ -213,7 +215,7 @@ // getEncodedPicture() should block until the FrameEncoder has completed // encoding the frame. This is how back-pressure through the API is // accomplished when the encoder is full. -TComPic *out = curEncoder-getEncodedPicture(accessUnitOut); +TComPic *out = curEncoder-getEncodedPicture(nalunits); if (!out flush) { @@ -227,7 +229,7 @@ { curEncoder = m_frameEncoder[m_curEncoder]; m_curEncoder = (m_curEncoder + 1) % param.frameNumThreads; -out = curEncoder-getEncodedPicture(accessUnitOut); +out = curEncoder-getEncodedPicture(nalunits); } while (!out flushed != m_curEncoder); } @@ -259,7 +261,7 @@ pic_out-stride[2] = recpic-getCStride(); } -double bits = calculateHashAndPSNR(out, accessUnitOut); +double bits = calculateHashAndPSNR(out, nalunits); // Allow this frame to be recycled if no frame encoders are using it for reference ATOMIC_DEC(out-m_countRefEncoders); @@ -487,7 +489,7 @@ /* Returns Number of bits in current encoded pic */ -double TEncTop::calculateHashAndPSNR(TComPic* pic, AccessUnit accessUnit) +double TEncTop::calculateHashAndPSNR(TComPic* pic, NALUnitEBSP **nalunits) { TComPicYuv* recon = pic-getPicYuvRec(); TComPicYuv* orig = pic-getPicYuvOrg(); @@ -544,7 +546,10 @@ m_frameEncoder-m_seiWriter.writeSEImessage(onalu.m_Bitstream, sei_recon_picture_digest, pic-getSlice()-getSPS()); writeRBSPTrailingBits(onalu.m_Bitstream); -accessUnit.insert(accessUnit.end(), new NALUnitEBSP(onalu)); +int count = 0; +while(nalunits[count] != NULL) +count++; +nalunits[count]-init(onalu); } /* calculate the size of the access unit, excluding: @@ -552,13 +557,14 @@ * - SEI NAL units */ UInt numRBSPBytes = 0; -for (AccessUnit::const_iterator it = accessUnit.begin(); it != accessUnit.end(); it++) +int count = 0; +for (;nalunits[count] != NULL; count++) { -UInt numRBSPBytes_nal = (*it)-m_packetSize; +UInt numRBSPBytes_nal = nalunits[count]-m_packetSize; #if VERBOSE_RATE printf(*** %6s numBytesInNALunit: %u\n, nalUnitTypeToString((*it)-m_nalUnitType), numRBSPBytes_nal); #endif -if ((*it)-m_nalUnitType != NAL_UNIT_PREFIX_SEI (*it)-m_nalUnitType != NAL_UNIT_SUFFIX_SEI) +if (nalunits[count]-m_nalUnitType != NAL_UNIT_PREFIX_SEI nalunits[count]-m_nalUnitType != NAL_UNIT_SUFFIX_SEI) { numRBSPBytes += numRBSPBytes_nal; } diff -r a8f6f62217d5 -r 70ba2b3b7bc9 source/Lib/TLibEncoder/TEncTop.h --- a/source/Lib/TLibEncoder/TEncTop.h Tue Sep 24 14:22:02 2013 +0530 +++ b/source/Lib/TLibEncoder/TEncTop.h Tue Sep 24 16:15:10 2013 +0530 @@ -101,9 +101,9 @@ void xInitSPS(TComSPS *sps); void xInitPPS(TComPPS *pps); -int encode(bool bEos, const
Re: [x265] [PATCH 1/5][RFC] Only use UNIX line endings
On 9/24/2013 2:15 AM, Steve Borho wrote: I've pushed commits which affect these changes and go a bit further in a few cases ... Any particular reason my commits weren't used? I even sent a PR as you requested. - Derek ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
Re: [x265] Bug report: incorrect computation of sps_max_dec_pic_buffering_minus1
This was the cmdline info used (Though I don't know which build of x265 was used): ./x265 --input ~/FILES/yuv/720p50_parkrun_ter.yuv --fps 30 --input-res 1280x720 --refresh 2 -i 30 --bitrate 5000 -o parkrun_ter_720p30fps_5Mbps.hevc Encoding info as printed by x265 is below. yuv [info]: 1280x720 30Hz, frames 0 - 49 of 50 x265 [info]: detected SIMD architectures SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 x265 [info]: performance primitives: intrinsic x265 [info]: Main profile, Level-3.1 (Main tier) x265 [info]: WPP streams / pool / frames : 12 / 8 / 1 x265 [info]: CU size : 64 x265 [info]: Max RQT depth inter / intra : 3 / 3 x265 [info]: ME / range / subpel / merge : star / 60 / 5 / 5 x265 [info]: Keyframe min / max : 30 / 30 x265 [info]: Rate Control : ABR-5000 kbps x265 [info]: Lookahead len / -b / bAdapt : 10 / 3 / 1 [Default is max 3 consecutive B-frames, corresponding to -b 3 option] x265 [info]: tools: rect amp rdo rdoq lft sao sao-lcu sign-hide tskip tskip-fast rdoqts x265 [info]: frame I:2 kb/s: 38722.20 PSNR Mean: Y:39.782 U:43.591 V:44.109 x265 [info]: frame P:32 kb/s: 5119.59 PSNR Mean: Y:27.178 U:39.095 V:40.228 x265 [info]: frame B:16 kb/s: 1147.47 PSNR Mean: Y:26.369 U:38.924 V:40.048 x265 [info]: global:kb/s: 5192.62 PSNR Mean: Y:27.423 U:39.220 V:40.326 encoded 50 frames in 115.83s (0.43 fps), 5193.93 kb/s, Global PSNR: 30.511 From: x265-devel [mailto:x265-devel-boun...@videolan.org] On Behalf Of Deepthi Devaki Akkoorath Sent: Tuesday, September 24, 2013 2:05 AM To: Development for x265 Subject: Re: [x265] Bug report: incorrect computation of sps_max_dec_pic_buffering_minus1 Olivier, I couldn't reproduce the problem with b-frames enabled. I will be able to look into it better once I get the exact command line. - Deepthi On Tue, Sep 24, 2013 at 1:25 AM, Steve Borho st...@borho.orgmailto:st...@borho.org wrote: On Mon, Sep 23, 2013 at 2:38 PM, Olivier Lapicque olapic...@nvidia.commailto:olapic...@nvidia.com wrote: (param-bframes+2)-1 seems correct for 1-backward and 1 forward reference (but seems like it would be too low for more than 2 refs). Yeah, we haven't re-enabled multiple refs yet after plugging in the new lookahead. It should happen soon, though. The exact condition that was violated in the bitstream I saw is the following: NumNegativePics(4) + NumPositivePics(1) + num_long_term_sps(0) + num_long_term_pics(0) max_dec_pic_buffering_minus1(3)+1 I'll get the exact cmdline parameters to reproduce this, but I was told that this problem occurs any time B-frames are enabled. Ah, ok. The problem is probably with NumNegativePics then. We'll take a look at this. -- Steve Borho ___ x265-devel mailing list x265-devel@videolan.orgmailto:x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel --- This email message is for the sole use of the intended recipient(s) and may contain confidential information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message. --- ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel
Re: [x265] [PATCH] Encoder: do not use std::list for the class AccessUnit
On Tue, Sep 24, 2013 at 5:26 PM, Gopu Govindaswamy g...@multicorewareinc.com wrote: # HG changeset patch # User Gopu Govindaswamy g...@multicorewareinc.com # Date 1380019510 -19800 # Node ID 70ba2b3b7bc972ed04f5fd135d940e4759315fa8 # Parent a8f6f62217d5e519f99a004c420e5906ac900f2f Encoder: do not use std::list for the class AccessUnit diff -r a8f6f62217d5 -r 70ba2b3b7bc9 source/Lib/TLibEncoder/TEncTop.cpp --- a/source/Lib/TLibEncoder/TEncTop.cppTue Sep 24 14:22:02 2013 +0530 +++ b/source/Lib/TLibEncoder/TEncTop.cppTue Sep 24 16:15:10 2013 +0530 @@ -114,14 +114,16 @@ for (int i = 0; i param.frameNumThreads; i++) { // Ensure frame encoder is idle before destroying it -AccessUnit tmp; -m_frameEncoder[i].getEncodedPicture(tmp); -for (AccessUnit::const_iterator it = tmp.begin(); it != tmp.end(); it++) +NALUnitEBSP **nalunits = NULL; +m_frameEncoder[i].getEncodedPicture(nalunits); +if (nalunits) { -const NALUnitEBSP nalu = **it; -free(nalu.m_nalUnitData); +for (int nalcount = 0; nalunits[nalcount] != NULL; nalcount++) +{ +const NALUnitEBSP nalu = *nalunits[nalcount]; +free(nalu.m_nalUnitData); +} } - m_frameEncoder[i].destroy(); } @@ -161,9 +163,9 @@ } } -int TEncTop::getStreamHeaders(AccessUnit accessUnit) +int TEncTop::getStreamHeaders(NALUnitEBSP **nalunits) { -return m_frameEncoder-getStreamHeaders(accessUnit); +return m_frameEncoder-getStreamHeaders(nalunits); } /** @@ -173,7 +175,7 @@ \param accessUnitsOut output bitstream \retval number of encoded pictures */ -int TEncTop::encode(bool flush, const x265_picture_t* pic_in, x265_picture_t *pic_out, AccessUnit accessUnitOut) +int TEncTop::encode(bool flush, const x265_picture_t* pic_in, x265_picture_t *pic_out, NALUnitEBSP **nalunits) { if (pic_in) { @@ -213,7 +215,7 @@ // getEncodedPicture() should block until the FrameEncoder has completed // encoding the frame. This is how back-pressure through the API is // accomplished when the encoder is full. -TComPic *out = curEncoder-getEncodedPicture(accessUnitOut); +TComPic *out = curEncoder-getEncodedPicture(nalunits); if (!out flush) { @@ -227,7 +229,7 @@ { curEncoder = m_frameEncoder[m_curEncoder]; m_curEncoder = (m_curEncoder + 1) % param.frameNumThreads; -out = curEncoder-getEncodedPicture(accessUnitOut); +out = curEncoder-getEncodedPicture(nalunits); } while (!out flushed != m_curEncoder); } @@ -259,7 +261,7 @@ pic_out-stride[2] = recpic-getCStride(); } -double bits = calculateHashAndPSNR(out, accessUnitOut); +double bits = calculateHashAndPSNR(out, nalunits); // Allow this frame to be recycled if no frame encoders are using it for reference ATOMIC_DEC(out-m_countRefEncoders); @@ -487,7 +489,7 @@ /* Returns Number of bits in current encoded pic */ -double TEncTop::calculateHashAndPSNR(TComPic* pic, AccessUnit accessUnit) +double TEncTop::calculateHashAndPSNR(TComPic* pic, NALUnitEBSP **nalunits) { TComPicYuv* recon = pic-getPicYuvRec(); TComPicYuv* orig = pic-getPicYuvOrg(); @@ -544,7 +546,10 @@ m_frameEncoder-m_seiWriter.writeSEImessage(onalu.m_Bitstream, sei_recon_picture_digest, pic-getSlice()-getSPS()); writeRBSPTrailingBits(onalu.m_Bitstream); -accessUnit.insert(accessUnit.end(), new NALUnitEBSP(onalu)); +int count = 0; +while(nalunits[count] != NULL) +count++; +nalunits[count]-init(onalu); } Isn't nalunits[count] supposed to be initalized , if its null - before calling its init() ? /* calculate the size of the access unit, excluding: @@ -552,13 +557,14 @@ * - SEI NAL units */ UInt numRBSPBytes = 0; -for (AccessUnit::const_iterator it = accessUnit.begin(); it != accessUnit.end(); it++) +int count = 0; +for (;nalunits[count] != NULL; count++) { -UInt numRBSPBytes_nal = (*it)-m_packetSize; +UInt numRBSPBytes_nal = nalunits[count]-m_packetSize; #if VERBOSE_RATE printf(*** %6s numBytesInNALunit: %u\n, nalUnitTypeToString((*it)-m_nalUnitType), numRBSPBytes_nal); #endif -if ((*it)-m_nalUnitType != NAL_UNIT_PREFIX_SEI (*it)-m_nalUnitType != NAL_UNIT_SUFFIX_SEI) +if (nalunits[count]-m_nalUnitType != NAL_UNIT_PREFIX_SEI nalunits[count]-m_nalUnitType != NAL_UNIT_SUFFIX_SEI) { numRBSPBytes += numRBSPBytes_nal; } diff -r a8f6f62217d5 -r 70ba2b3b7bc9
[x265] [ANN] x265 0.4.1
Hello, I've made a tag on the stable branch for 0.4.1. This email describes the state of the encoder at that tag. x265 can be compiled and run on Linux, Mac OS X, and Windows. Its cmake based build system supports MSVC 9-11, Xcode, gcc+gmake, MinGW/MSYS, and Intel C++ (both icl and icpc) x265 currently generates HM11 compliant bitstreams. = New features since 0.3 = 1. Frame parallelism * The GOP level parallelism and mini-gop cadence of the 0.3 release were removed and replaced with fine-grained frame level parallelism. * The memory requirements were drastically reduced, x265 no longer caches subpel planes per reference frame * Latency is drastically reduced, WPP + 5 frame threads is enough to saturate a dual socket 8 core Xeon. 2. New simple average bitrate (ABR) rate control * converges on target bitrate via frame level QP adjustments * algorithm was adapted from x264 for HEVC * safe for use in combination with frame parallelsim (new since 0.4) 3. New Lookahead * three complexity levels of slice decision with scene cut and flash detection * algorithm was adapted from x264 for HEVC * still missing bidir cost estimates, multiple refs, weightp, and MBtree = Disabled Features since 0.3 = * weightp and weighted bidir prediction are both disabled; they were broken when we stopped pre-generating reference (subpel) pixels * GOP parallelism is dead, hopefully to never return to the core library. It could be added above x265 if necessary. * many CLI options were added, removed, or renamed since 0.3. Consult the online help for the current set of options. = Known Bugs = * all intra encodes (--keyint 1) require --b-adapt 0 to avoid a lookahead bug * --no-sao-lcu-bounds cannot be used in conjunction with frame parallelism. The encoder will use incomplete reference pixels with predictable bad effects. * we have a report that our DPB signalling is potentially incorrect for decoders which respect max DPB size. This is under investigation. ABR and lookahead are very new and we will not be surprised to find bugs in those features. Please report any bugs you find to this mailing list. = Performance Characteristics = See https://bitbucket.org/multicoreware/x265/wiki/Performance = Upcoming features = We are trying to make the encoder deterministic with -Fn for all values of n greater than 1. In other words, there will always be a slight benefit to having only one frame thread (unlimited motion search to reference frames) but -F2 and -F10 should output the exact same bitstream with CQP rate control. This is considered a debugging feature to validate our frame parallelism. We are also planning to swap out the HM's bidir search with logic adapted from x264 (for performance reasons) and to add estimation logic for this new bidir search to the lookahead (to improve lookahead accuracy). We plan to repair the weighted prediction features and re-enable its command line options. Lastly, the lookahead will use wave-front scheduling of the lowres CUs using the existing thread pool. This should lesson the bottlenecking effects of --b-adapt 2. -- Steve Borho ___ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel