Commit graph

247 commits

Author SHA1 Message Date
Ari Koivula 9147b7acbf Split residual quantization to separate luma and chroma function. 2014-05-14 11:19:48 +03:00
Ari Koivula 1c38209cab Add missing include. 2014-05-13 09:33:05 +03:00
Laurent Fasnacht 0e6f1c99fc Refactor picture to remove hidden dependency between slice and tiles
picture.type -> encoder_state->global->pictype
picture.slicetype -> encoder_state->global->slicetype
picture.slice_sao_luma_flag -> 1 (was constant)
picture.slice_sao_chroma_flag -> 1 (was constant)

This may be changed later. For now it's better to avoid having slice related stuff in picture.
2014-05-07 11:55:48 +02:00
Laurent Fasnacht 6c6adf18c7 Refactor encoder_state 2014-05-07 11:47:31 +02:00
Ari Koivula bdc16d2612 Improve cu_info coded block flag data structure a bit.
- It works just like the old structure except that the flags are checked with
  bitmasks instead of having the flag value be propagated upwards. There isn't
  really any benefit to this because the flags still have to be propagated to
  parent CUs.

- Wrapped them inside a struct to make copying them easier. (Just need to copy
  the struct instead of making individual copies)
2014-05-06 18:28:04 +03:00
Ari Koivula 4490e8afd6 Remove depth dimension from picture->cu_array.
- It isn't used for anything anymore.

- It was used in the past to hold information during search, but now that
  information is held in lcu_t structs.
2014-04-28 10:18:22 +03:00
Laurent Fasnacht 5e7945888a Inter-frame prediction with tiles works.
Many thanks to Jean-Hugues Recolin for the insightful comments about shifts!
2014-04-25 09:28:00 +02:00
Laurent Fasnacht 571a373f69 Use tile offset in search 2014-04-24 08:38:24 +02:00
Laurent Fasnacht 19b1642aa2 Removed all cabac parameters (cabac is part of encoder_state) 2014-04-22 11:46:53 +02:00
Laurent Fasnacht 5fea5875a5 Huge refactoring
Split some parts of encoder_control into encoder_state
(idea: encoder_control is immutable)

Goal is to allow multiple substreams in the future.
2014-04-22 10:39:12 +02:00
Laurent Fasnacht 3396264f3c Moved g_cur_lambda_cost into encoder_control.cur_lambda_cost 2014-04-17 12:00:21 +02:00
Laurent Fasnacht 534013be77 Remove g_lambda_cost 2014-04-17 11:49:27 +02:00
Laurent Fasnacht 4a9c239027 Remove g_bitdepth 2014-04-17 11:13:13 +02:00
Laurent Fasnacht 7a2b883059 Remove encoder_input width, height, height_in_lcu, and width_in_lcu 2014-04-17 11:13:12 +02:00
Laurent Fasnacht 9ac3b7bf2b encoder->in.cur_pic --> cur_pic 2014-04-17 11:13:10 +02:00
Laurent Fasnacht 52ae027b3a Avoid undefined behavior in memcpy calls
"The memcpy() function shall copy n bytes from the object pointed to by s2 into the object pointed to by s1. If copying takes place between objects that overlap, the behavior is undefined."
2014-04-15 06:30:21 +02:00
Laurent Fasnacht 78c579053a encoder_control should be const in nearly all the code 2014-04-14 10:56:06 +02:00
Ari Koivula 5fa5e01e05 Merge branch 'intra-cleanup'
Conflicts:
	src/intra.c
	src/intra.h
	src/search.c
2014-04-10 13:51:14 +03:00
Ari Koivula 088dd9ab96 Clean up intra mode search.
- This changes the bitstream a little bit, because it changes the order in
  which the modes are tried and when two modes have the same cost the first
  one is chosen.

- Dst buffer was removes as it was no longer used.
2014-04-10 10:25:57 +03:00
Marko Viitanen 43ae0a3b9a Implemented RDO cost calculation to Intra modes 2014-04-10 10:25:20 +03:00
Marko Viitanen c38ec1aa10 Added commandline option for RDO (--rd) 2014-04-09 12:29:15 +03:00
Ari Koivula 92ac5025f9 Take intra mode based coeff scan mode into account for coeff bit cost.
- Previously only diagonal scan mode, the most common one, would be used.

- This improved bdrate by 0.1-0.5 % for p0 and 0-0.2 % for p60.
2014-04-09 10:44:44 +03:00
Ari Koivula 0251bf5a1a Improve calculation of chroma coding cost for 4x4 blocks.
- Adds calculation of chroma coefficient cost for 4x4 blocks.

- Previously there was no cost. Now the cost is added to the first prediction
  block for NxN.

- This fix should improve bdrate by about 1%.
2014-04-08 12:43:26 +03:00
Ari Koivula 3c0977c7f3 Fix buffer overflow on copying of reference pixels.
- Valgrind noticed this.

- Shouldn't affect anything as the buffer overflowed to pixel buffers which
  were initialized later.
2014-04-04 17:28:56 +03:00
Marko Viitanen e15a86268d Clean up tabs and whitespaces 2014-04-04 16:04:44 +03:00
Laurent Fasnacht 8a14bd3b7b Remove cabac global variable 2014-04-04 14:26:40 +02:00
Marko Viitanen c5ba5eb3c8 Use RDO in final_cost 2014-04-04 14:10:49 +03:00
Ari Koivula d44d1837bb Remove unreferenced parameters.
- Working towards issue #11.
2014-04-04 12:56:24 +03:00
Ari Koivula 46d33d3945 Resolve unsigned/signed mismatch warnings.
- Working towards issue #11.
2014-04-04 12:56:23 +03:00
Ari Koivula 313466fdff Remove unused variables.
- Working towards issue #11.

- Either removed or redefined variables to not cause a warning.
2014-04-03 15:37:59 +03:00
Marko Viitanen 0da8071300 Changed final cost (and transform skip) error function from SAD to SSD 2014-04-02 14:51:39 +03:00
Ari Koivula bbd1202f90 Replace old LCU reference pixels initialization with new ones.
In the future we might even have just a const pointer to reference pixels.
2014-03-19 16:01:31 +02:00
Ari Koivula 7328fc2897 Add special handling for bottom right LCU pixel.
I didn't take into account that the reference pixel on the top-left of the
LCU gets over written if we just replace the top reference pixels for
current LCU with the bottom reference pixels after doing the search.
To handle this I copy the pixel that gets overwritten to the vertical
reference pixels.
2014-03-19 16:01:31 +02:00
Ari Koivula 57ce7e990b Add new reference pixel buffer management to encoding loop.
- This is necessary because after we add in-loop filters to be done per LCU,
  the reconstruction buffer will have the deblocked pixels. We only need the
  edge-pixels for intra prediction though so we just save those.

- Right now it only copies the pixels and passes them on to search, where
  the copied pixels are asserted to be the same ones we copy from
  reconstruction buffer.

- New yuv_t struct added for arrays of dynamic length. We might want to change
  other buffers to use it or something like it in the future.
2014-03-19 16:01:30 +02:00
Ari Koivula 6a384112cc Remove old unnecessary functions from search module.
- As we move to per-LCU encoding only search_lcu will be necessary.

- Function search_best_mode is no longer used.
2014-03-17 18:04:41 +02:00
Marko Viitanen c7ee176480 Removed unused function search_best_mode() 2014-03-17 12:56:04 +02:00
Ari Koivula 34d4e74cd6 Fix selection of bitcost for NxN mode intra CUs. 2014-03-12 18:05:42 +02:00
Ari Koivula 462b75f0f3 Merge branch 'intra-NxN'
Conflicts:
	src/search.c
2014-03-12 15:08:39 +02:00
Marko Viitanen e6985eeb08 Terminate search when any block is found with no coefficients to code 2014-03-12 14:14:42 +02:00
Marko Viitanen 362fc6c5a5 Reduced bit cost when skip mode is selected 2014-03-12 14:13:38 +02:00
Ari Koivula aa59605392 Set correct max depth for search work-tree copying.
The copy up and down functions had wrong max depth so they didn't work with
4x4 blocks.
2014-03-12 14:02:13 +02:00
Marko Viitanen b5756821dd Tuned cost calculations for "final cost"
By adding chroma cost and using 1.5x coeff cost instead of 0.5x, additional 3% (LP) and 1.8% (AI) drop in BD-rate noticed.
2014-03-12 10:35:56 +02:00
Ari Koivula 409b094acf Try and get NxN to work again.
- Moved NxN search to be done on the same level as other searches, as it's
  really not any different from 2Nx2N.
- Produces working bitstream but reconstruction is different.
2014-03-11 19:19:20 +02:00
Marko Viitanen 75dd1f48ef Bugfix: calculate "final cost" only when block is inter or intra 2014-03-11 17:09:08 +02:00
Marko Viitanen 3b59d7c3a3 Implemented "final cost" calculation for best CU on each depth in search
Take SAD between reconstruction and original and add cost from coding and cost for coding coefficients.
2014-03-11 15:01:50 +02:00
Marko Viitanen aa0fb6ccad Store intra coding bit costs to CU structure 2014-03-11 12:15:50 +02:00
Marko Viitanen bdf8166e5c Store inter coding bit costs to CU structure
To be used for calculating better coding cost later
2014-03-11 11:40:39 +02:00
Marko Viitanen eaf4434ae9 Removed unused parameter cur_cu from inter_get_merge_cand() 2014-03-11 09:04:17 +02:00
Marko Viitanen f2e722fed8 Implemented early search termination when skip mode is used 2014-03-11 08:55:38 +02:00
Marko Viitanen a7dade5069 Tuned inter MV coding costs to achieve BD-rate reduction
Compared to version with no inter costs, around -2% BD-rate in LP configuration
2014-03-10 12:08:09 +02:00
Marko Viitanen 1bd79c719e Fixed MV candidate derivation in search 2014-03-10 10:16:30 +02:00
Marko Viitanen c7e4861dbf Added coding cost calculations to MV search 2014-03-10 10:16:30 +02:00
Ari Koivula 9dde96f25e Refactor search_cu_intra.
- Formatted.
- Renamed and consolidated variables.
- Removed unused x and y pos from intra_prediction function.
2014-03-07 16:25:25 +02:00
Ari Koivula 47af5207c5 Remove dead code and fix white space. 2014-03-06 18:35:17 +02:00
Marko Viitanen 877e156cb8 Fixed the case where transform split is used (always on depth 0)
After this fix, inter coding should be working.
2014-03-06 14:52:58 +02:00
Marko Viitanen b00f4c8dbf Fixed transform offset value and set tr_depth to correct value when depth 0 2014-03-05 17:10:17 +02:00
Marko Viitanen 278042aaac Fixed top-right CU copy to lcu structure 2014-03-04 16:32:31 +02:00
Marko Viitanen df669ca7df Added skip mode checking to the new lcu search 2014-03-04 12:48:19 +02:00
Marko Viitanen bddadbb4ed Inter coding fixed and added call to encode_transform_tree() 2014-03-03 17:42:44 +02:00
Marko Viitanen 17b256b5e3 Converted inter mv candidate functions to use lcu structure
Implemented merge and mvd candidate search
Added initialization of the whole work_tree
2014-03-03 16:08:35 +02:00
Marko Viitanen 1f82239367 Implemented inter search and reconstruction with lcu structure 2014-03-03 14:51:36 +02:00
Marko Viitanen b5fca8b206 Added missing chroma ref pixel init and fixed pic width/height in intra ref border
intra_build_reference_border() was given wrong picture width and height on chroma.
Chroma top-left reference pixels were not copied on init_lcu_t()
2014-03-03 12:21:55 +02:00
Marko Viitanen f1882a0d82 Fixed CU type initialization and PU index calculations 2014-02-28 15:56:27 +02:00
Ari Koivula 768d54ff4c Fix wrong array offset in intra search. 2014-02-28 14:22:13 +02:00
Ari Koivula 71d9ab7e26 Fix copying-up of coefficients during search. 2014-02-27 15:58:47 +02:00
Ari Koivula 526fdfc078 Fix erroneous indexing of pixel arrays. 2014-02-27 15:51:21 +02:00
Ari Koivula eda5ade06d Add missing offsets for lcu_t.cu pointers.
Also changes alternate ways of doing the offset to use LCU_CU_OFFSET macro.
2014-02-27 14:22:01 +02:00
Ari Koivula a8237bcb1e Remove duplicated defines. 2014-02-27 14:03:33 +02:00
Marko Viitanen b58c5b872a Fixed cu coordinate derivation in lcu_set_intra_mode() 2014-02-27 13:53:26 +02:00
Ari Koivula f6c97712b2 Add lcu_set_intra_mode. 2014-02-27 13:02:24 +02:00
Ari Koivula faea7caaf4 Remove unnecessary copying of reconstructed pixels from init_lcu_t.
The reconstructed pixels don't exist yet.
2014-02-27 11:58:32 +02:00
Ari Koivula 869ca5aa58 Add copying of LCU coefficients to search. 2014-02-27 11:56:16 +02:00
Marko Viitanen 7a1bf6b17d Intra fix: encode_transform_tree() call was missing and depth was not set 2014-02-27 10:53:01 +02:00
Marko Viitanen 8ae453551d Fixed cu type definition and reconstruction function calling
reconstruction could have been called when no search was done
2014-02-26 17:50:09 +02:00
Ari Koivula 879c355d9d Add work_tree_copy_down. 2014-02-26 17:31:26 +02:00
Ari Koivula 9faecd375a Add work_tree_copy_up. 2014-02-26 16:08:43 +02:00
Ari Koivula 1450d0edf8 Add lcu_t copying to main CU array. 2014-02-26 16:08:43 +02:00
Ari Koivula e651078e78 Fix compilation for rebase.
Conflicts:
	src/search.c
2014-02-26 16:08:15 +02:00
Marko Viitanen b4181dd398 Fixed problems with the new structure and commented out old search 2014-02-26 14:57:57 +02:00
Marko Viitanen bf21e4d019 Modified encode_transform_tree() to use new structure 2014-02-26 14:28:02 +02:00
Marko Viitanen 43abe296d0 Fixed intra headers and implemented intra search in the new structure 2014-02-26 12:45:43 +02:00
Marko Viitanen fb9e3ad1d2 Implemented proper intra mode cost calculation
This does not currently affect the search primary search defining the used block sizes, only the refining second intra search. Gain 1.9% BD-rate on All Intra 600f of BQMall QP 22,27,32,37.
2014-02-26 12:26:54 +02:00
Ari Koivula b067b2f802 Add lcu_t initialization. 2014-02-26 10:58:20 +02:00
Ari Koivula 7e520a85c4 Add skeleton/plan for LCU based search.
The plan is to replace the dumb search we are doing now with proper sequential
search that is encapsulated inside data structure that holds all temporary
search data for the LCU.
2014-02-25 13:06:22 +02:00
Luca Barbato 0cafa8105f search: Conditionally compile conditionally used functions 2014-02-21 15:07:15 +01:00
Luca Barbato e03049782c search: Staticize functions 2014-02-21 15:07:15 +01:00
Luca Barbato 934a4e3b88 whitespace: Drop trailing spaces 2014-02-21 15:03:35 +01:00
Marko Viitanen 8490ff1a9d Disabled NxN mode
Something must be done to enable better selection of NxN blocks in order to gain BD-rate with this mode.
2014-02-19 14:36:17 +02:00
Marko Viitanen 3618eab72a Added lambda cost when using reference frames with refIdx > 0
Because selecting references "far away" costs bits, this should help with the issue that multiple reference frames actually increases coded bits with no quality gain.
2014-02-19 14:34:36 +02:00
Marko Viitanen 28aa20df12 Basic search for multiple reference frames 2014-02-17 09:58:10 +02:00
Ari Koivula 8e63dd29bb Fix compiler warnings for VS2010 /W4 in intra.c.
- Working towards issue #11.
- Removed intra_get_block_mode as unused.
- Removed unused parameters from functions. Many of them were remnants from
  earlier data structures and earlier features of HEVC that have been removed.
- Lots of implicit conversions from larger types to smaller ones. I tried to
  avoid turning all of them to explicit ones this time and opted for changing
  the original data type instead. Had to do it in few cases though to stop the
  changes from propagating too widely.
2014-02-14 17:15:54 +02:00
Marko Viitanen 5c4c47b07a Fixed and enabled Intra NxN
NxN block needs reference border from previous NxN blocks and to do this, the structure was changed a bit.
2014-02-11 18:31:41 +02:00
Ari Koivula c18b6f53e1 Fix regression that disabled intra prediction in inter frames.
The intent was to remove the flag that enabled intra in inter frames, as that
is not really that usefull anymore, but it ended up disabling intra instead.
2014-02-11 11:57:54 +02:00
Marko Viitanen c202c8caac Fixed motion vector cost calculation a bit
Cost was calculated a bit wrong causing non-zero motion vectors on totally black video.
2014-02-10 20:30:55 +02:00
Ari Koivula bc3b80b9e4 Fix compiler warnings for VS2010 /W4 in intra.c.
- Working towards issue #11.
2014-02-10 16:50:10 +02:00
Marko Viitanen 27ffb98d08 Fixed an issue with NxN using uninitialized y_recdata
NxN is still disabled by default as it's being fixed.
2014-02-07 15:33:58 +02:00
Ari Koivula 0188aa8631 Fix compiler warnings for VS2010 /W4 in search.c.
- Working towards issue #11.
- Implicit conversions to explicit ones.
2014-02-06 14:40:18 +02:00
Ari Koivula 2614aa0fe4 Fix compiler warnings for VS2010 /W3.
- Working towards issue #11.
- Change lambda cost multiplier for intra NxN to from 256 to 4.
- Add 0.5 to the lambda multipliers so it's rounded instead of truncated.
2014-02-06 11:04:23 +02:00
Ari Koivula 355340067f Modify search_tree to take a pixel coordinate instead of CU coordinate.
I need at least 4x4 resolution for NxN. It's simpler to just use pixel
coordinates.
2014-02-05 18:43:34 +02:00
Ari Koivula ea312082a4 Simplify the prediction mode search recursion.
No need to be so clever for something this simple.

I moved the cost initialization outside the recursing function because it
relied on the clever recursion to work. It should eventually be moved to its
own function that also initializes all the other fields just to be safe. I
didn't do that yet because I want to do it per-LCU and these functions are
still working on per-frame basis.
2014-02-05 18:43:34 +02:00