[x265] [PATCH 4 of 5] Set all I frames as keyframes, change nalunittype decision accordingly
Steve Borho
steve at borho.org
Fri Sep 6 19:12:31 CEST 2013
On Fri, Sep 6, 2013 at 8:17 AM, <deepthidevaki at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Deepthi Devaki <deepthidevaki at multicorewareinc.com>
> # Date 1378467716 -19800
> # Node ID ca65bd3590ccd05f4c87adee53b9b866279470b6
> # Parent 491e4a95a6e4e6a94723cf5011fc69398278a102
> Set all I frames as keyframes, change nalunittype decision accordingly.
>
> diff -r 491e4a95a6e4 -r ca65bd3590cc source/common/lowres.cpp
> --- a/source/common/lowres.cpp Fri Sep 06 15:45:35 2013 +0530
> +++ b/source/common/lowres.cpp Fri Sep 06 17:11:56 2013 +0530
> @@ -113,6 +113,7 @@
> bIntraCalculated = false;
> memset(costEst, -1, sizeof(costEst));
> sliceType = X265_TYPE_AUTO;
> + keyframe = 0; //Not a keyframe unless identified by lookahead
> for (int y = 0; y < bframes + 2; y++)
> {
> for (int x = 0; x < bframes + 2; x++)
> diff -r 491e4a95a6e4 -r ca65bd3590cc source/common/lowres.h
> --- a/source/common/lowres.h Fri Sep 06 15:45:35 2013 +0530
> +++ b/source/common/lowres.h Fri Sep 06 17:11:56 2013 +0530
> @@ -63,6 +63,7 @@
> int scenecut; // Set to zero if the frame cannot possibly be part
> of a real scenecut.
>
> int sliceType; // Slice type decided by lookahead
> + int keyframe;
>
> /* lookahead output data */
> int costEst[X265_BFRAME_MAX + 2][X265_BFRAME_MAX + 2];
> diff -r 491e4a95a6e4 -r ca65bd3590cc source/encoder/dpb.cpp
> --- a/source/encoder/dpb.cpp Fri Sep 06 15:45:35 2013 +0530
> +++ b/source/encoder/dpb.cpp Fri Sep 06 17:11:56 2013 +0530
> @@ -71,8 +71,8 @@
> m_picList.pushFront(pic);
>
> TComSlice* slice = pic->getSlice();
> - if (getNalUnitType(pocCurr, m_lastIDR) ==
> NAL_UNIT_CODED_SLICE_IDR_W_RADL ||
> - getNalUnitType(pocCurr, m_lastIDR) ==
> NAL_UNIT_CODED_SLICE_IDR_N_LP)
> + if (getNalUnitType(pocCurr, m_lastIDR, pic) ==
> NAL_UNIT_CODED_SLICE_IDR_W_RADL ||
> + getNalUnitType(pocCurr, m_lastIDR, pic) ==
> NAL_UNIT_CODED_SLICE_IDR_N_LP)
> {
> m_lastIDR = pocCurr;
> }
> @@ -80,7 +80,7 @@
> slice->setReferenced(slice->getSliceType() != B_SLICE);
> slice->setTemporalLayerNonReferenceFlag(!slice->isReferenced());
> // Set the nal unit type
> - slice->setNalUnitType(getNalUnitType(pocCurr, m_lastIDR));
> + slice->setNalUnitType(getNalUnitType(pocCurr, m_lastIDR, pic));
>
> // If the slice is un-referenced, change from _R "referenced" to _N
> "non-referenced" NAL unit type
> if (slice->getTemporalLayerNonReferenceFlag())
> @@ -368,13 +368,13 @@
> * \returns the nal unit type of the picture
> * This function checks the configuration and returns the appropriate
> nal_unit_type for the picture.
> */
> -NalUnitType DPB::getNalUnitType(int curPOC, int lastIDR)
> +NalUnitType DPB::getNalUnitType(int curPOC, int lastIDR, TComPic* pic)
> {
> if (curPOC == 0)
> {
> return NAL_UNIT_CODED_SLICE_IDR_W_RADL;
> }
> - if (curPOC % m_cfg->param.keyframeMax == 0)
> + if (pic->m_lowres.keyframe)
> {
> if (m_cfg->param.decodingRefreshType == 1)
> {
>
Queued, but I think this should be further simplified once things have
stabilized. We should be able to just pass in the slice type rather than
lastIDR and pic.
> diff -r 491e4a95a6e4 -r ca65bd3590cc source/encoder/dpb.h
> --- a/source/encoder/dpb.h Fri Sep 06 15:45:35 2013 +0530
> +++ b/source/encoder/dpb.h Fri Sep 06 17:11:56 2013 +0530
> @@ -71,7 +71,7 @@
>
> void arrangeLongtermPicturesInRPS(TComSlice *, FrameEncoder
> *frameEncoder);
>
> - NalUnitType getNalUnitType(int curPoc, int lastIdr);
> + NalUnitType getNalUnitType(int curPoc, int lastIdr, TComPic* pic);
> };
> }
>
> diff -r 491e4a95a6e4 -r ca65bd3590cc source/encoder/slicetype.cpp
> --- a/source/encoder/slicetype.cpp Fri Sep 06 15:45:35 2013 +0530
> +++ b/source/encoder/slicetype.cpp Fri Sep 06 17:11:56 2013 +0530
> @@ -105,6 +105,7 @@
> outputQueue.pushBack(pic);
> numDecided++;
> lastKeyframe = 0;
> + pic->m_lowres.keyframe = 1;
> frames[0] = &(pic->m_lowres);
> return;
> }
> @@ -124,8 +125,9 @@
> {
> pic = inputQueue.popFront();
> picsAnalysed[idx++] = pic;
> - if ((pic->m_lowres.sliceType == X265_TYPE_I) && !(pic->getPOC() %
> cfg->param.keyframeMax))
> + if ((pic->m_lowres.sliceType == X265_TYPE_I))
> {
> + pic->m_lowres.keyframe = 1;
> lastKeyframe = pic->getPOC();
> }
> }
> @@ -148,6 +150,7 @@
> TComPic *pic = inputQueue.popFront();
>
> pic->m_lowres.sliceType = X265_TYPE_I;
> + pic->m_lowres.keyframe = 1;
> outputQueue.pushBack(pic);
> numDecided++;
> }
> @@ -157,6 +160,7 @@
>
> bool forceIntra = (pic->getPOC() % cfg->param.keyframeMax) == 0;
> pic->m_lowres.sliceType = forceIntra ? X265_TYPE_I : X265_TYPE_P;
> + pic->m_lowres.keyframe = forceIntra ? 1 : 0;
> outputQueue.pushBack(pic);
> numDecided++;
> }
> @@ -169,10 +173,12 @@
> if (forceIntra)
> {
> picB->m_lowres.sliceType = (picB->getPOC() %
> cfg->param.keyframeMax) ? X265_TYPE_P : X265_TYPE_I;
> + picB->m_lowres.keyframe = (picB->getPOC() %
> cfg->param.keyframeMax) ? 0 : 1;
> outputQueue.pushBack(picB);
> numDecided++;
>
> picP->m_lowres.sliceType = (picP->getPOC() %
> cfg->param.keyframeMax) ? X265_TYPE_P : X265_TYPE_I;
> + picP->m_lowres.keyframe = (picP->getPOC() %
> cfg->param.keyframeMax) ? 0 : 1;
> outputQueue.pushBack(picP);
> numDecided++;
> }
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
--
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.videolan.org/private/x265-devel/attachments/20130906/0a7714b6/attachment.html>
More information about the x265-devel
mailing list