Commit graph

499 commits

Author SHA1 Message Date
Laurent Fasnacht f0b076876f Moved all the stream related stuff into substream_write_bitstream 2014-05-07 11:40:20 +02:00
Ari Koivula eaf8835bda Add some comments and const qualifiers. 2014-05-06 19:20:38 +03:00
Ari Koivula 3910b7989a Clear old cbf data before recursion in encode_transform_tree.
- Because encode_transform_tree also maintains the CBF data and assumes that
  the CBFs are initially zeroed, calling the function more than once would
  result in incorrect CBF data.
2014-05-06 19:03:29 +03: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 d123b98aea Remove unnecessary tertiary expressions from usages of CABAC_BIN. 2014-05-06 17:39:25 +03:00
Marko Viitanen bf2c2a1330 Small changes to fix compiling on VS
- Added threads.h to VS project
- Included Windows.h in threads.h
2014-05-05 11:18:43 +03:00
Laurent Fasnacht f3d4e6eb09 Move bitstream write to a separate function, and add assertions about the part which should not write to bitstream. 2014-05-05 09:24:57 +02:00
Laurent Fasnacht 7f6f4fe9c1 Reference count for picture 2014-05-05 08:03:24 +02:00
Laurent Fasnacht 323054d5e2 naming: alloc_yuv_t -> yuv_t_alloc dealloc_yuv_t -> yuv_t_free 2014-05-02 11:45:27 +02:00
Laurent Fasnacht 7d6d1d5536 Remove pic->pred_* 2014-05-02 11:38:07 +02:00
Laurent Fasnacht 92e14cc80d rename picture_init to picture alloc and picture_destroy to picture_free 2014-05-02 10:58:28 +02:00
Laurent Fasnacht b76f7377b6 Always initialize tiles data structures (even with only one tile) 2014-05-02 10:00:22 +02:00
Laurent Fasnacht 161fe38f5e Remove USE_TILES define 2014-05-01 13:58:13 +02:00
Laurent Fasnacht a84fd6486d Add function subencoder_blit_pixels 2014-05-01 11:16:11 +02:00
Laurent Fasnacht b8b28635ff Iterable structure for sub-encoders (more flexibility) 2014-05-01 11:16:10 +02:00
Laurent Fasnacht 212d390003 Cleanup of encoder_state_init and encoder_state_finalize 2014-05-01 11:16:10 +02:00
Laurent Fasnacht 161053f86b Do not allow more tiles than dimension in LCU 2014-05-01 07:11:31 +02:00
Ari Koivula d1fbc6dc80 Fix a small memory leak.
- Malloced pointer returned by alloc_yuv_t was not being freed in
  substream_encode.

- Remove use of yuv_t from encode_one_frame, as it's not used there anymore.
2014-04-30 11:15:34 +03:00
Ari Koivula 27b94d4b45 Address gcc -Wtype-limits errors.
- Fixes warnings in #19 and #16.
2014-04-29 09:15:52 +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 76ec605b72 SAO works with tiles now 2014-04-28 06:29:21 +02:00
Laurent Fasnacht 7719837f17 Simple OpenMP parallelization 2014-04-25 09:11:10 +02:00
Laurent Fasnacht 4e34859e66 Fix compilation error with USE_TILES=1 and -Werror=maybe-uninitialized 2014-04-24 08:41:05 +02:00
Laurent Fasnacht 59392c4a62 Fix compilation issue with USE_TILES=0 2014-04-24 08:38:24 +02:00
Laurent Fasnacht af9a1c0fbb Use same reference images for all subencoders 2014-04-24 08:38:23 +02:00
Laurent Fasnacht 73c574fb45 P-frame: first try... 2014-04-24 08:38:22 +02:00
Laurent Fasnacht 03361dcf2c sao try... still not working 2014-04-24 08:38:22 +02:00
Laurent Fasnacht 3db4c59478 Recontruct full frame from tiles 2014-04-24 08:38:21 +02:00
Laurent Fasnacht 35d5d22ccc Fix tile size not to go outside of the original picture 2014-04-24 08:38:20 +02:00
Laurent Fasnacht b36e154c38 Some cleanup 2014-04-24 08:38:19 +02:00
Laurent Fasnacht 01580a93c3 Encoding with tiles now more or less works with -p 1 --no-sao --no-deblock 2014-04-24 08:38:19 +02:00
Laurent Fasnacht 5fb4d9c36e substream_encode function 2014-04-24 08:38:17 +02:00
Laurent Fasnacht e292b2c274 allocate subencoders 2014-04-24 08:38:17 +02:00
Laurent Fasnacht fba4f5432a Fix debug code 2014-04-24 08:38:16 +02:00
Laurent Fasnacht b255133460 Debug for tiles 2014-04-24 08:38:15 +02:00
Laurent Fasnacht 11629ce811 Use tile scan order in encode_one_frame() 2014-04-24 08:38:14 +02:00
Laurent Fasnacht 0036afa056 Write tiles related information picture parameter set and slice header 2014-04-24 08:38:14 +02:00
Laurent Fasnacht 1e9c894eba Coding tree block raster and tile scanning conversion process, according to ITU-T Rec. H.265 (04/2013) 6.5.1 2014-04-24 08:38:13 +02:00
Laurent Fasnacht 7bd6aa2e9c encoder_control_input_init call moved to encoder_control_init 2014-04-24 08:38:13 +02:00
Laurent Fasnacht ff318ae0e9 Tiles in encoder_control 2014-04-24 08:38:12 +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
Ari Koivula 88a67a4e49 Fix faulty assert that stops the program from working with inter frames.
- The assert would be true after the next if block, but in it's current place
  it's false.
2014-04-22 10:57:38 +03:00
Ari Koivula 1b437a5989 Address clang-analyzer warnings about garbage values.
- False alarm, but surprisingly difficult to convince clang of that. It
  doesn't seem to understand bit shifts very well.

- Only assert and changing LCU_WIDTH>>depth to width was necessary to satisfy
  clang.

- Closes #35.
2014-04-17 18:43:09 +03: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 83360918ba Removed table generation from main code, moved it to tools. 2014-04-17 11:13:15 +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 d01e3ae67f bitstream is a union, and is statically in encoder_control structure 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 21d34613c2 Replace encoder->stream by stream 2014-04-17 11:13:09 +02:00
Laurent Fasnacht 2286175378 nal are now written to a bitstream, not a FILE* 2014-04-17 11:13:09 +02:00
Laurent Fasnacht ec9d70f70c Moved scalinglist_process into init_encoder_control 2014-04-16 11:45:51 +02:00
Laurent Fasnacht e06253d437 scalinglist changes missing in previous commit 2014-04-16 11:00:29 +02:00
Laurent Fasnacht 9901c38dd5 scalinglist in independent file 2014-04-16 10:25:16 +02:00
Laurent Fasnacht 9112cbb58c Generate and use static tables 2014-04-16 09:49:09 +02:00
Laurent Fasnacht 960f2cb4b0 g_sig_last_scan -> const uint32_t* 2014-04-15 16:09:52 +02:00
Laurent Fasnacht 763b775d3e encoder_control->cfg is const 2014-04-15 16:09:52 +02:00
Laurent Fasnacht ae2d79c954 Remove encoder_control.cqmfile 2014-04-15 16:09:51 +02:00
Laurent Fasnacht 486768fc79 scalinglist privatization 2014-04-14 13:39:28 +02:00
Laurent Fasnacht 78c579053a encoder_control should be const in nearly all the code 2014-04-14 10:56:06 +02:00
Laurent Fasnacht 418e6eae51 Changed bitstream handling to allow in-memory bitstream. 2014-04-14 08:13:00 +02: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 c5dfcdf3aa Simplify scan mode selection.
- The scan mode selection for chroma was a bit complicated so I checked it
  and it was all unnecessary. The mode selection is the same as for luma.
2014-04-09 10:36:39 +03:00
Ari Koivula 3764688f84 Fix lambda initialization.
- Lambda was initialized before slice type was set in encoder_control.
2014-04-08 16:58:36 +03:00
Ari Koivula 6e0bc655e2 Resolve unused variable warning.
- This unexpectedly changes bitstream, but as that makes no sense, it must be
  because some part of the program uses uninitialized memory.
2014-04-04 17:28:50 +03:00
Marko Viitanen e15a86268d Clean up tabs and whitespaces 2014-04-04 16:04:44 +03:00
Laurent Fasnacht 816ae13b1d Moved context information inside cabac_data.
This is required in order to be able to work on parallelism.
2014-04-04 14:28:50 +02:00
Laurent Fasnacht 8a14bd3b7b Remove cabac global variable 2014-04-04 14:26:40 +02:00
Laurent Fasnacht 946c815932 init_context directly has a QP parameter, instead of passing an encoder_control*
This makes context less tightly coupled with encoder.
2014-04-04 14:26:39 +02:00
Marko Viitanen b83559d3f3 Use RDO to check for transform skip mode 2014-04-04 13:09:42 +03:00
Ari Koivula b19e4f3f2d Resolve possible uninitialized variable warnings.
- Working towards issue #11.

- Neither variable was actually used as uninitialized.
2014-04-04 13:02:06 +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 27a3329dfb Remove unreferenced_parameter macro.
- It was a silly hack to selectively silence compiler warnings from VS, but
  there is no point as it causes compiler warnings in GCC.
2014-04-03 15:38:17 +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
Marko Viitanen a14fb14e33 Added new commandline parameter --no-transform-skip 2014-04-02 14:49:48 +03:00
Marko Viitanen cfb21c0e4c Implemented transform skipping (for 4x4 blocks)
transform skip vs. normal transform selection criteria might need more work, currently both are calculated for each 4x4 block and SAD+coeff_SSE is compared.
2014-04-02 10:54:03 +03:00
Panu Sjövall c8f629495d Remove unnecessary buffer from bitstream.
- Writing encoded data to file is done in bitstream_put one byte at a time and nal_write only writes the packet headers
2014-03-25 11:46:56 +02:00
Ari Koivula 953aef0379 Move rest of LCU encoding inside the LCU loop.
- Move SAO search inside the LCU loop.

- Move CU coding inside the LCU loop.

- Move SAO frame reconstruction loop to sao module.
2014-03-21 12:41:44 +02:00
Ari Koivula 746eaa3671 Move deblocking code to filter module. 2014-03-21 11:57:12 +02:00
Ari Koivula c42b25054a Modify deblocking to be done per-LCU in the encoding loop.
- Intra works. There is still something wrong in inter.

- Avoid horizontal deblocking of the rightmost 4 pixels in the LCU.
  This is because vertical deblocking must be done for all pixels
  before horizontal, but vertical deblocking can't be done for those
  pixels before the next LCU is finished.

- Add separate deblocking of the rightmost pixels of the last LCU
  after the LCU edge has been deblocked.

- This is a pretty ugly hack but will have to do for now.
2014-03-20 18:14:43 +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 34e453c880 Clean up encode_one_frame.
There is a lot of duplicated code due to handling random access and trailing
pictures separately. I merged the code for these two branches so it would be
easier to modify.
2014-03-17 18:04:41 +02:00
Ari Koivula b1596eb76c Refactor coding of end_of_slice_segment_flag.
According to spec the end_of_slice_segment_flag is always coded, but in the
code it looked like it was not coded for the last LCU in picture. This was
due to the end_of_slice_segment_flag being coded inside cabac_flush, like it
is in HM. This is a bit silly so I moved it out of cabac_flush.
2014-03-17 18:04:41 +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
Ari Koivula 9563b50a34 Refactor coefficient group scan mapping lists.
The relation between coefficients positions and coefficient group positions
was a big confusing due to the use of 16x16 diagonal coefficient mappings
also as coefficient group mappings.

- Moved all coefficient group mappings to their own const arrays and added
  a new array the select the correct coefficient group mapping. This removes
  special cases for 8x8 and 32x32 transform sizes.

- Removed all coefficient group mapping initialization from init_sig_last_scan.

- Removed 128x128 and 64x64 from regular coefficient group array as those
  transform sizes don't exist anymore in HEVC.
2014-03-14 16:56:49 +02:00
Ari Koivula e93ae54e70 Fix bug with selecting wrong coeff scan mode for 4x4 blocks. 2014-03-12 14:56:05 +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
Ari Koivula 470f36ce34 Remove left-over commented out code. 2014-03-07 12:44:45 +02:00
Ari Koivula 5d9aa3409b Merge branch 'new-search-wip'
Conflicts:
	src/encoder.c
	src/intra.c
	src/intra.h
	src/search.c
2014-03-06 19:00:53 +02:00
Ari Koivula 47af5207c5 Remove dead code and fix white space. 2014-03-06 18:35:17 +02:00
Marko Viitanen c3e47c6a8d Removed redundant coeff_y/u/v variables from CU 2014-03-05 17:18:03 +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
Ari Koivula 1cf03cfb37 Add --no-rdoq parameter. 2014-03-05 17:02:21 +02:00
Ari Koivula ca51f660d5 Fix fluctuation of coefficients on identical frames when RDOQ is on.
Moves CABAC context initialization to take place before search. This fixes
an issue with RDOQ returning different coefficients for identical adjacent
frames.

- This actually probably worsens BD-rate a little for all frames except the
  first one because we were using last frames final CABAC context for every
  LCU and now we are using initialized CABAC contexts. The fix is to encode
  the LCU before we start compressing the next LCU so we can update CABAC
  contexts.
2014-03-05 17:02:13 +02:00
Ari Koivula 8f3d5045b0 Add --no-rdoq parameter. 2014-03-05 17:00:08 +02:00
Ari Koivula 139e00f064 Fix fluctuation of coefficients on identical frames when RDOQ is on.
Moves CABAC context initialization to take place before search. This fixes
an issue with RDOQ returning different coefficients for identical adjacent
frames.

- This actually probably worsens BD-rate a little for all frames except the
  first one because we were using last frames final CABAC context for every
  LCU and now we are using initialized CABAC contexts. The fix is to encode
  the LCU before we start compressing the next LCU so we can update CABAC
  contexts.
2014-03-05 17:00:08 +02:00
Marko Viitanen bddadbb4ed Inter coding fixed and added call to encode_transform_tree() 2014-03-03 17:42:44 +02:00
Ari Koivula 448285a56a Fix bug in intra mode coding. 2014-02-28 17:36:04 +02:00
Marko Viitanen f1882a0d82 Fixed CU type initialization and PU index calculations 2014-02-28 15:56:27 +02:00
Marko Viitanen 0a6d9bda41 Fixed stride values in transform_chroma() 2014-02-27 17:47:00 +02:00
Marko Viitanen 4027de6e1f Fixed reconstruct_chroma() stride values 2014-02-27 16:48:51 +02:00
Ari Koivula 6e11eda133 Fix coeff flag initialization.
They should be initialized, even if none exist.
2014-02-27 16:43:20 +02:00
Marko Viitanen 9968fd46b0 Fixed chroma array index calculations in transform_tree() and intra_recon_lcu() 2014-02-27 16:42:32 +02:00
Ari Koivula 5f75753f85 Set coeff flags correctly.
The coeff flags are no longer propagated upwards because encode_transform_tree
is being called from depth > 0. The fix is to initialize the whole coeff flag
array when the coeff flag is set.
2014-02-27 15:45:07 +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 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
Marko Viitanen d2b8f50351 Merge branch 'master' of https://github.com/lu-zero/kvazaar 2014-02-25 10:53:51 +02:00
Marko Viitanen 565be069b9 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-24 15:28:37 +02:00
Luca Barbato a6dfe79d16 encoder: Export g_convert_to_bit correctly
It is a global table initialized in encoder.c and used all over the
codebase.
2014-02-22 18:02:09 +01:00
Ari Koivula 73f5c3b80e Fix compiler warnings for VS2010 /W4 in config.c and encmain.c.
- Working towards issue #11.
- Widened datatypes for cfg struct members that take values from atoi to full
  ints so that bounds checking can be done after parsing without overflow.
2014-02-21 17:28:11 +02:00
Luca Barbato 350826bc00 encoder: Staticize functions 2014-02-21 15:03:35 +01:00
Luca Barbato 934a4e3b88 whitespace: Drop trailing spaces 2014-02-21 15:03:35 +01:00
Marko Viitanen e3a528df2e Added rate cost to SAO mode selection calculations
Decreased BD-rate 1% on LP configuration with 600 frames of BQMall, QP 22,27,32,37
Merge check is now performed in a function to ease the checking
2014-02-21 15:54:56 +02:00
Marko Viitanen f1f293ae0c Implemented SAO merging 2014-02-21 13:20:54 +02:00
Marko Viitanen e4880aa4b7 Fixed SAO bitstream generation and band offset a bit 2014-02-20 17:22:33 +02:00
Marko Viitanen 5d946c774a Implemented draft SAO band offset functions 2014-02-20 16:08:09 +02:00
Marko Viitanen c230a73155 Added number of reference frames to prefix SEI user data 2014-02-19 14:45:18 +02:00
Marko Viitanen 54e68378dc Fixed merge candidate selection on multiref 2014-02-18 16:59:45 +02:00
Marko Viitanen cda60897e1 Fixed inter mv_ref propagation and merge candidate mv_ref matching 2014-02-17 11:13:12 +02:00
Marko Viitanen 7dee412cb0 Fixed some of the motion vector scaling problems
motion vector candidates are not yet scaled or selected correctly
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
Yusuke Nakamura a860bbc7f9 config: Add --cqmfile to use custom quantization matrices from a file.
The coefficients in a matrix are stored in up-right diagonal order.

The following indicates the default matrices specified in the spec.

INTRA4X4_LUMA
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTRA4X4_CHROMAU
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTRA4X4_CHROMAV
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTER4X4_LUMA
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTER4X4_CHROMAU
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTER4X4_CHROMAV
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16,
16, 16, 16, 16

INTRA8X8_LUMA
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTRA8X8_CHROMAU
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTRA8X8_CHROMAV
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTER8X8_LUMA
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTER8X8_CHROMAU
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTER8X8_CHROMAV
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTRA16X16_LUMA
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTRA16X16_CHROMAU
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTRA16X16_CHROMAV
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTER16X16_LUMA
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTER16X16_CHROMAU
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTER16X16_CHROMAV
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTRA32X32_LUMA
16, 16, 16, 16, 17, 18, 21, 24,
16, 16, 16, 16, 17, 19, 22, 25,
16, 16, 17, 18, 20, 22, 25, 29,
16, 16, 18, 21, 24, 27, 31, 36,
17, 17, 20, 24, 30, 35, 41, 47,
18, 19, 22, 27, 35, 44, 54, 65,
21, 22, 25, 31, 41, 54, 70, 88,
24, 25, 29, 36, 47, 65, 88, 115

INTER32X32_LUMA
16, 16, 16, 16, 17, 18, 20, 24,
16, 16, 16, 17, 18, 20, 24, 25,
16, 16, 17, 18, 20, 24, 25, 28,
16, 17, 18, 20, 24, 25, 28, 33,
17, 18, 20, 24, 25, 28, 33, 41,
18, 20, 24, 25, 28, 33, 41, 54,
20, 24, 25, 28, 33, 41, 54, 71,
24, 25, 28, 33, 41, 54, 71, 91

INTRA16X16_LUMA_DC
16

INTRA16X16_CHROMAU_DC
16

INTRA16X16_CHROMAV_DC
16

INTER16X16_LUMA_DC
16

INTER16X16_CHROMAU_DC
16

INTER16X16_CHROMAV_DC
16

INTRA32X32_LUMA_DC
16

INTER32X32_LUMA_DC
16
2014-02-13 17:47:21 +09:00
Marko Viitanen 96d62e1bec Fixed general_profile_compatibility_flag value
Might help with issue #5
2014-02-12 16:01:02 +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
Marko Viitanen 0ac12e72f6 Added init value for encoder->ref_list to fix valgrind warnings
This might help with issue #16
Thanks again to ps-auxw for pointing this out ;)
2014-02-10 20:06:54 +02:00
Marko Viitanen 4bd6131499 Fixed array overflow causing segfault, fixes #17
Should also solve issue #16
Thanks to ps-auxw @ IRC for finding this stupid bug!
2014-02-10 19:40:43 +02:00
Ari Koivula 75f3ba5b2f Fix compiler warnings for VS2010 /W4 in nal.c.
- Working towards issue #11.
- Leaving this as a separate commit in case there is a regression.
2014-02-10 17:46:38 +02:00
Ari Koivula ea600ec980 Fix some compiler warnings for VS2010 /W4 in encoder.c.
- Working towards issue #11.
- There is a lot in this module so I'm fixing only ~half in this commit.
2014-02-10 17:31:52 +02:00
Marko Viitanen 5f79f30b8c Added preliminary support for multiple reference frames
L0 reference list is being updated and sent to bitstream but actual usage of other than default reference might break something.
2014-02-10 11:32:48 +02:00
Marko Viitanen 241aa9155c Fixed crash-bug when using NxN Intra mode (array index overflow)
In NxN mode, chroma predictions were pushed to buffer when chroma should not have been used at all. (Because it is processed only on first of the four NxN luma blocks)
2014-02-07 17:24:58 +02:00
Marko Viitanen d106b21954 Removed redundant function call from encode_block_residual()
intra_set_block_mode() was called twice with the same parameters.
2014-02-07 15:33:58 +02:00
Ari Koivula b48d1c9ca2 Fixes to version sei message.
- Fixed the last 16 characters of the url string being cut of.
- Added some guards against the message overwriting the stack.
2014-02-07 11:43:38 +02:00
Yusuke Nakamura 3e96df2a81 Write Kvazaar's version and encoding options in an user data unregistered SEI. 2014-02-07 10:53:18 +09:00
Yusuke Nakamura 430e475954 config: Add --aud to use access unit delimiters. 2014-02-07 07:35:15 +09:00
Yusuke Nakamura a29b6f7c92 Add some options to specify VUI parameters. 2014-02-07 06:50:43 +09:00
Marko Viitanen 337a565232 Better lambda cost implementation (from HM12)
- Lambda array changed to double as in HM
 - Needs updating when GOP / B-pictures are used
2014-02-05 15:57:16 +02:00
Yusuke Nakamura de2c4ab78e Avoid reading one extra frame at the end of the input file. 2014-02-04 21:55:08 +09:00
Marko Viitanen 39a45936a6 Fixed crash bug on QP < 15 caused by division with zero lambda cost 2014-02-04 09:39:27 +02:00
Ari Koivula 7bb9c25447 Remove duplicate implementation of intra_build_reference_border.
The search_buildReferenceBorder was an ugly hack and a place for bugs to hide
that should never have existed. Now it doesn't.

The change reduces PSNR a little, but also reduces the bitrate, when the
expected result was to have no change in either. I'm guessing there was still
some bug in the search_buildReferenceBorder, but the bug could also be in
intra_build_reference_border. Will have to do more testing to be sure, but
having one place to look at will be better than having two.
2014-02-03 18:35:11 +02:00
Marko Viitanen d1b093c2ee Merge branch 'master' of https://github.com/ultravideo/kvazaar 2014-02-03 17:20:36 +02:00
Ari Koivula 91ff5ff086 Merge branch 'jeeb-cleanup'
Conflicts:
	src/encoder.c
	src/encoder.h
2014-02-03 17:13:13 +02:00
Yusuke Nakamura 4ffdb358ed nal: Add the writing of an additional zero_byte before the start code.
Enables the output of spec-compliant byte streams, as the specification
notes that an additional zero_byte has to be added under certain
circuimstances.
2014-02-03 17:00:55 +02:00
Jan Ekström ac8fbc0519 Move initialization away from main() 2014-02-03 16:53:51 +02:00
Marko Viitanen d69f97cb90 Fixed level and profile sent to bitstream, for issue #5 b 2014-02-03 16:08:25 +02:00
Marko Viitanen ffd00695c7 Better cleanup of allocated memory at exit
Using valgrind all the leaks were tracked and fixed.
2014-02-03 11:52:43 +02:00
Jan Ekström d8d44e5bcd encoder: Remove a non-UTF-8 symbol from the code
Silences a Visual Studio warning on systems where the symbol is not
in the local code page
2014-01-31 17:17:44 +02:00
Marko Viitanen 5d5fbb8704 Added commandline configuration of intra period (-p <intra_period>) 2014-01-31 10:23:56 +02:00
Ari Koivula b93629f26e Re-enable P frames.
It was inadvertently disabled due to an aborted merge.
2014-01-29 17:56:38 +02:00
Ari Koivula 5d12706510 Merge branch 'intra_NxN'
Conflicts:
	src/encoder.c

- Chroma RDOQ changes conflicted because I had moved the chroma
  quantization/dequantization to it's own function.
- Merged to master because I want my code to show up in github. =)
  All the old stuff still works, even though NxN doesn't work, so there
  is no reason not to merge anyway.
2014-01-29 17:04:41 +02:00
Ari Koivula e33655fde5 Remove debug stuff and disable intra NxN in preparation for a merge.
- Re-enable intra search based on reconstructed image.
  - This didn't have as much of an effect as I thought it would.
- Re-enable SAO and deblocking.
- Disable NxN searching. (4x4 luma coding is still broken)
2014-01-29 16:45:37 +02:00
Ari Koivula bf80007270 Try to fix 4x4 luma coding.
Still doesn't work. I have no idea what the problem is. Probably somehow related to the coefficient coding, since the bitstream seems to work, the prediction is correct and the error is not very severe.

- Change scan order selection to be more verbose and based on the correct mode for 4x4. Didn't affect the problem with 4x4 luma in any way although it should have.
- Re-enable residual coding as everything seems to work now besides 4x4 luma.
2014-01-29 15:09:41 +02:00
Ari Koivula de3c58862a Fix intra NxN chroma coefficients.
- The NxN coefficients were being saved to the bottom right PU offset instead of
  the parent CU offset.
- Re-enable coefficient coding for chroma NxN.
2014-01-29 14:22:31 +02:00
Ari Koivula f1b2e9f603 Fix buggy chroma when NxN is present.
- NxN intra prediction seems to work fully now.
- Coefficients still don't work for NxN.
2014-01-29 14:22:31 +02:00
Ari Koivula acbe656c6d Fix intra prediction mode list generation. 2014-01-29 14:22:30 +02:00
Ari Koivula 71a996f50f Work on reconstruction and searching.
- Set part-size for Inter.
- Change to Intra Only mode for testing.
- Many small changes here and there. Should have been separate commits probably, but too late.
- Disable SAO and deblocking to be able to see problems with reconstruction better.
2014-01-29 14:18:01 +02:00
Ari Koivula 5e2f22f447 Try to fix intra prediction mode coding for NxN.
- Adjust predictor list to take modes from PUs in addition to 2Nx2N CUs.
- Change intra_get_dir_luma_predictor to take PU index instead of CU index.
- Comment prediction encoding now that I've had to look it up.
2014-01-29 13:52:17 +02:00
Marko Viitanen 23427a72cf Merge branch 'rdoq' 2014-01-28 12:29:21 +02:00
Marko Viitanen 7a21b9b769 Changed lambda calculation to fix RDOQ issues, RDOQ is now in use by default. 2014-01-28 12:14:43 +02:00
Marko Viitanen de6faf623d Imported entropy bits array from HM and added macro to access it 2014-01-27 14:34:57 +02:00
Ari Koivula 77339efa57 Add COPYING file and add boilerplate for copyright and GPLv2 to every file. 2014-01-24 12:48:48 +02:00
Ari Koivula 7a7110ff7a Move chroma transformation and reconstruction to it's own functions.
Just a simple copy and paste with minimal changes.
2014-01-15 16:55:05 +02:00
Ari Koivula 35ba873abc Move transform unit coding to its own function. 2014-01-14 18:47:02 +02:00
Ari Koivula a38a5fd647 Improve transform tree coding.
- Clean up code and comment.
- Change terminology to match H.265 specification where possible.
- Move transform splitting for depth==0 out of the coding part. It's not
  possible to do it here anyway because intra reconstruction is different
  if the transform is split.
- Add checking for transform hierarchy depth when coding split flag.
- Fixes bug with cu_data.tr_depth being set. The CU struct was being reused
  for inter coded CUs, which did not initialize the tr_depth.
2014-01-14 18:39:24 +02:00
Ari Koivula d5745aa31a Fix encode_transform_tree to handle 4x4 luma.
- Add room to cu_data.coeff_top_yuv arrays for the 4x4 PUs data. Will probably have to do the same to other coeff flags. The flags could also probably be combined as they are a bit redundant.
2014-01-13 18:37:47 +02:00
Ari Koivula 73fdc35c4f Try to implement 4x4 luma transform coding.
- Doesn't work yet so it's disabled.
- Change encode_transform_coeff to accept PU (Prediction Unit) coordinates
  instead of CU coordinates because CUs are 8x8.
2014-01-09 19:30:54 +02:00
Ari Koivula c3f4a628af Try to fix stuff related to NxN intra transform splitting. 2014-01-03 16:47:27 +02:00
Ari Koivula 1b7e44c4d4 Add NxN to intra reconstruction. 2014-01-03 13:01:54 +02:00
Ari Koivula 5083e6db10 Change cu_info.intra into an array to support NxN split. 2014-01-02 15:13:20 +02:00
Ari Koivula 80cd172f75 Clean up SAO encoding.
- Fixes a bug when pic->slice_sao_chroma == false.
2014-01-02 15:10:07 +02:00
Ari Koivula f1d8aae5b4 Clean up SAO encoding.
- Fixes a bug when pic->slice_sao_chroma == false.
2013-12-19 13:54:32 +02:00
Ari Koivula 8e2a7ef6ed Start implementing NxN prediction coding. 2013-12-18 14:55:05 +02:00
Ari Koivula 553bcdc324 Rewrite intra prediction mode coding to be simpler.
Should work exactly the same, but with the prediction mode selection done
separately from the binarization it's easier to see that the implementation
is correct.
2013-12-18 14:16:04 +02:00
Ari Koivula cf0d314d03 Clean up prediction mode coding.
This was done as preparation for adding NxN intra.

- Monochrome coding was removed as it's not part of the standard.
- No other functional changes.
2013-12-18 11:25:44 +02:00
Ari Koivula 8f610176d8 Add NxN part_mode coding. 2013-12-18 10:50:24 +02:00
Ari Koivula 3af65b8477 Add SAO searching and reconstruction for chroma.
One I frame and 99 P frames encoded with SAO off and on.
Processed 100 frames,    6693224 bits AVG PSNR: 30.7248 37.8978 37.8287
Processed 100 frames,    6295072 bits AVG PSNR: 32.2511 38.9373 38.9818
2013-11-12 11:55:39 +02:00
Ari Koivula 692ef3e9d9 Add guard against illegal SAO edge offsets. 2013-11-08 16:13:48 +02:00
Ari Koivula 43ae719ddb Tweak implementation of SAO reconstruction to be a bit more clear. 2013-11-08 15:04:06 +02:00
Ari Koivula f9061d322a Fix handling of incomplete LCU's in SAO reconstruction. 2013-11-06 23:09:56 +02:00
Ari Koivula 7a20e797be Fix incorrect SAO encoding. 2013-11-06 22:50:26 +02:00
Ari Koivula 3eccdc0d7b Move deblocking filtering to happen before SAO reconstruction.
-Re-enable deblocking.
2013-11-06 22:50:14 +02:00
Ari Koivula 98f2a1aedc Fix LCU borders in sao reconstruction. 2013-11-06 11:23:01 +02:00
Ari Koivula f21df00386 Save a copy of luma for sao. 2013-11-04 20:33:29 +02:00
Ari Koivula a57b938270 Add new module sao.
- Move sao-stuff not directly related to encoding to sao-module.
- Calculate sao for all LCUs before encoding any of them. This is in
  preparation to doing the reconstruction line at a time instead of
  LCU at a time.
2013-11-04 19:41:01 +02:00
Ari Koivula 03f2967899 Block based sao dead end.
This will never work because the adjacent blocks require the original values
of the boundary pixels to make category decisions.
2013-11-04 17:55:29 +02:00
Ari Koivula 31af7e3929 Fix sao offsets. Reconstruction kind of works. 2013-11-04 13:05:05 +02:00
Ari Koivula 66fe302520 Fix cabac context for sao. HM accepts encoded sao. 2013-11-04 13:03:51 +02:00
Ari Koivula b6c5c87fb7 Merge branch 'master' into sao
SAO needs to be coded before LCU data has been searched. Searching
has already been moved to happen before encoding in the master branch.

Conflicts:
	src/encoder.c
	src/picture.c
	src/picture.h
2013-11-04 12:44:01 +02:00
Ari Koivula 7bd0902727 Implement fast distortion estimation for sao.
Add function for blitting pixels from one buffer to another.

Several commits have been squashed to this one.
2013-11-04 12:37:37 +02:00
Marko Viitanen caa010a972 Changed scalinglist_process() to be done on frame level 2013-10-28 11:47:54 +02:00
Marko Viitanen ded4c18bf6 Fixed merge candidate duplicate removal and implemented skip mode selection 2013-10-25 15:39:19 +03:00
Ari Koivula e9819cbb5e Fix coding of sao chroma type idx. 2013-10-25 10:51:11 +03:00
Ari Koivula 3244c98b29 Fix sao cabac contexts.
According to HM implementation, sao luma and chroma use the same contexts.
2013-10-25 10:51:10 +03:00
Ari Koivula 291be9507b Start adding Sample Adaptive Offset capability. 2013-10-25 10:39:42 +03:00
Marko Viitanen e1f0274b51 Merge mode working on blocks > 8x8 2013-10-23 15:14:26 +03:00