Commit graph

68 commits

Author SHA1 Message Date
Doney Alex
983e1aecd4 Encoder: Added support for configuring VUI parameters.
Bug: 27442922

Change-Id: I781195e78c480e7449f49467abb1df71902e568d
2016-07-12 14:41:59 -07:00
Doney Alex
6581cbf841 DO NOT MERGE Encoder: Fixed adaptive intra refresh.
Earlier if an MB was coded as intra in the previous frame,
corresponding MB in the current frame will not be coded as intra
even though it was supposed to be intra according to adaptive intra refresh.
Now the MB will honour adaptive intra refresh irrespective of its type
in previous frame.

Change-Id: Icc84ddf962dad6f7d1f4d11e9cb2a37bcda567b8
2016-03-12 00:11:40 +00:00
Doney Alex
dfe686ad4a DO NOT MERGE Encoder: Added support for Constrained intra prediction.
Change-Id: I674746047b2b007ca4bc52fad1a2cd9b177cd7bb
2016-03-11 22:10:12 +00:00
Harish Mahendrakar
089f41d1f5 Encoder: Fixed an out of bound write in AIR map
pu2_intr_rfrsh_map was initialized with a wrong pointer which was
resulting in an out of bound write.
This was resulting in inconsistent output between runs when AIR was
enabled

Bug: 27076302

Change-Id: I1f36936837e3cb221ff218c3c6e7b8b20a0e26a7
2016-02-10 10:23:36 -08:00
Dan Willemsen
f197ccb756 Remove __DATE__/__TIME__ from Android builds
This removes unnecessary changes from build to build.

Bug: 24204119
Change-Id: I25258314fe56ea186d38d756fb5fb04aa689a812
2015-10-27 17:52:13 -07:00
Hamsalekha S
4202606c70 Encoder added support for VUI params
SPS will now include vui params
Removed a trailing space in ih264e_api.c

Change-Id: I67a57741689206e571e9a83f7e3360149f87e06a
2015-08-04 11:27:29 +05:30
Harish Mahendrakar
2eaba5ebd1 Encoder: Fixed an issue in handling FPS greater than 60
FPS > 60 was resulting in an integer overflow, so using float now.

Change-Id: I4626ba6a43167c00c42dd6440df37bd1eb1f151a
2015-08-03 12:13:51 +05:30
Marco Nelissen
1cd52d608f Merge "Don't use side effects in the macro PUT_BITS_SEV parameters" 2015-07-28 19:16:42 +00:00
Harinarayanan K K
aad4587335 Made gops closed
Now no picture in a gop will depend on any picture in the previous gop

All calls to force an IDR are respected as soon as possible

Change-Id: Id2bcd5687c3fb786336a01894c1b9228d67a87a6
2015-07-28 19:14:39 +00:00
Marco Nelissen
634567f170 Merge "Always do recon of 4x4 intra blocks" 2015-07-28 18:53:44 +00:00
Martin Storsjo
5696adb5ec Validate the u4_entropy_coding_mode field
Previously, if this field wasn't set, the invalid coding mode
could lead to crashes later.

Change-Id: If8dd2f8d5f2fbdd6bb76772344f959df23159167
2015-07-28 18:52:05 +00:00
Harinarayanan K K
b7d5bb5e2a Fixed issue in cost computation for BIPRED ME
BIPRED ME was discarding the halfpel motion vector components
in cost computation. That is fixed now.

Change-Id: If6c77096d701a258920b14134ff120fd1540f254
2015-07-28 18:50:14 +00:00
Doney Alex
9c6a2f78dd Cabac optimizations
Optimized cabac functions for writing bypass bins.
Removed unused return from cabac flush function.
Removed the macro REV_NBITS.

Change-Id: Iece82797f2f45a35281817a2b77a7c7fe4e02bd1
2015-07-28 18:48:57 +00:00
Martin Storsjo
0fee94865a Use INT_MAX as i4_max_sad in ih264e_evaluate_bipred
The stored i4_mb_distortion that was used as i4_max_sad previously
might come from a different coding mode - even if
pf_ime_compute_sad_16x16 returns early when i4_mb_distortion is
larger than ps_mb_ctxt_bi->i4_mb_distortion, the calculated i4_mb_cost
can still end up smaller than ps_mb_ctxt_bi->i4_mb_cost.

Therefore, set i4_max_sad to INT_MAX to avoid the early exit in
pf_ime_compute_sad_16x16 here, since it can't be used reliably (and
returning early can end up choosing a suboptimal mode).

This makes sure that the encoded output is identical when the SIMD
optimized routines are disabled, when using B-frames.

Change-Id: I9b8d524f88020e557541700133c7a0b48fe6a3b8
2015-07-28 18:47:19 +00:00
Martin Storsjo
8e78e306bb Make sure that apv_bufs[0] and u4_is_last always are set
When encoding in header mode, the s_inp_buf struct that was written
to ps_video_encode_op->s_ive_op.s_inp_buf was completely uninitialized.

In ih264e_input_queue_update, make sure to initialize u4_is_last
when skipping frames.

Change-Id: I87e677acd00baf4f732ca7d35ee192e7f1f73994
2015-07-28 18:46:30 +00:00
Martin Storsjo
cc58d3f491 Check the width/height and adjust level used for RC
Since 6cb6772805, the actual level used is
MAX(u4_max_level, ih264e_get_min_level()), which means that it isn't
a fatal error to set u4_max_level to a too low level (if the caller
doesn't know or care). Despite this, the actual value set by the caller
was still used for initializing the RC.

This allows the caller to not have to set u4_max_level (currently
every caller has to duplicate a table or code snippet for determining
the right level for each resolution). The caller still can set it
to a higher value if he wants to explicitly use a higher level than
what is necessary.

This makes sure that the output is identical even if u4_max_level is
set too low.

Change-Id: Icdc6c0652a97568d1eafc050226357a9d643d809
2015-07-28 18:44:06 +00:00
Marco Nelissen
a306c95201 Merge "Fixed encode of trailing B frames" 2015-07-28 18:43:47 +00:00
Marco Nelissen
d0603c30a6 Merge "Remove the now unused stride field from the set dimensions struct" 2015-07-28 18:42:28 +00:00
Harinarayanan K K
f080d51500 Fixed encode of single frame
Encoding a single frame used to make encoder to go into infinite
loop. That is fixed now

Change-Id: I51752bdc5fd6071868884c2ff6074c14d05c8564
2015-07-28 18:37:38 +00:00
Martin Storsjo
9fbffcfb6e Don't declare variables after statements
This fixes building with compilers that are strict about the pre-C99
rule about having all variable declarations before statements.

(The previous version of this commit was originally made before
the commit adding support for main profile, which added a bunch
more similar issues.)

Change-Id: I0a927deb2ef4125f79429d108439e249fa531607
2015-07-28 18:35:54 +00:00
Martin Storsjo
a77fc521ca Don't use side effects in the macro PUT_BITS_SEV parameters
If ENTROPY_TRACE is defined, the value parameter gets evaluated
twice. Since this parameter includes ++, the pointer gets incremented
twice.

This fixes encoding with trace enabled.

Change-Id: I3d71ac33d007301e488d264a33c7b5c4d4ff2b56
2015-07-18 17:30:44 +03:00
Martin Storsjo
17c7e8e151 Always do recon of 4x4 intra blocks
Even if this 4x4 block isn't at the bottom or right border,
the other 4x4 intra blocks within the same macroblock may
use it for intra prediction.

This fixes intra coded macroblocks in b-frames.

Change-Id: Ifdf48c1b2bbf232e785d6d5b8244aacba1ad3dd6
2015-07-02 13:22:18 +03:00
Harinarayanan K K
4d35438288 Fixed encode of trailing B frames
In case a P frame was marked as the last frame to encode, the B frames
previous to it in the same gop were not getting encoded. This is fixed now.

Change-Id: I871f2a1d52b8db9ee75426b00287b58203586f23
2015-06-29 15:04:53 +05:30
Martin Storsjo
18e256879b Remove the now unused stride field from the set dimensions struct
Since 90a3904fd3 and d020be5ac7, this field doesn't have any actual
effect - the strides are taken from the input pictures.

Change-Id: I9b08cbf8ee558e038d0017a6176d7b3bd3c428bd
2015-06-27 09:28:24 +03:00
Martin Storsjo
76cdaed5fa Remove double semicolons (empty statements)
Some compilers can't handle this, and these occurrances are typos.

Change-Id: I82349f103cef1f196d1a85dae307aff83c7d6090
2015-06-27 00:42:57 +03:00
Marco Nelissen
aabbf6052f Merge "Don't declare variables after statements" 2015-06-25 14:28:51 +00:00
Martin Storsjo
cc87241e79 Don't declare variables after statements
This fixes building with compilers that are strict about the pre-C99
rule about having all variable declarations before statements.

Change-Id: I06dd0cc42a6dbe90025c3c913a0c8d9ffb0acbcb
2015-06-25 13:29:52 +03:00
Martin Storsjo
d78b75702b Reorder code to avoid reading uninitialized data
If the current slice isn't BSLICE, u1_weighted_bipred_idc is
uninitialized, which valgrind can complain about (mostly in uninitialized
builds). By reordering the conditions, we avoid doing conditional
jumps based on uninitialized data.

Change-Id: I4d601fd1a4e34d85fe5992ecb934ac3747953960
2015-06-25 13:29:13 +03:00
Marco Nelissen
cd74de4a1b Fix MIPS build
Change-Id: I8190ce01d313f987f142a0c7ef5ae31f01562510
2015-06-24 15:05:29 -07:00
Martin Storsjo
7c99adf718 Initialize i4_non_ref_frames_in_stream before encoding SPS/PPS
When header mode is enabled, the SPS is populated before this
field was initialized in ih264e_pic_init.

Change-Id: I7e38828e12bee15bd3a53562b4e4d0d65354326a
2015-06-24 21:08:11 +00:00
Martin Storsjo
517e0627ef Allow setting profile IV_PROFILE_MAIN
Now once that the encoder supports the main profile, allow it to
be set in the IVE_CMD_CTL_SET_PROFILE_PARAMS request.

The actual profile value set here is ignored in practice, but
at least allow setting it to main.
2015-06-24 21:06:22 +00:00
Harinarayanan K K
d2d469e520 Added check for minimum output buffer size.
Changed macro specifying the minimum size required for output buffer.

Added an error check on the size allocated for output buffer.

Change-Id: I98e4f46e62ffc974df760f2633689de079ca3e5e
2015-06-24 21:05:34 +00:00
Harinarayanan K K
8588303afa Added code to handle cases with qp less than 10
When qp goes less than 10, all I16x16 mode evaluations
are disabled and I4x4 evaluations are enabled irrespective
of preset. This will ensure that the residual will not
exceed the supported range of entropy

Minimum Qp cannot be set less than 4 now. When QP goes lesser,
the residual may exceed the supported range even with I4x4 enabled.

Change-Id: I25b404fcd9c9e9dbdd77679280968635ee047eb3
2015-06-24 21:04:58 +00:00
Harinarayanan K K
6cb6772805 Reduced memory requirements.
Buffer allocation is based on minimum level required for the
input resolution rather than the input max level.

Number of maximum context sets can be set to 1 to reduce
memory usage.

Added a macro ENC_MIN_PU_SIZE for minimum size of
inter prediction unit supported by encoder.

Changed the maximum constraint on number of MBs for NMB
processing to width in Mbs.

Change-Id: I5a9255e93935d90c13262681aafc772aedf8ae81
2015-06-24 21:04:04 +00:00
Harinarayanan K K
461adb94c9 Fixed QP lockups
Fixed QP getting locked up at particluar values even when
it is supposed to be changing by ensuring that Qp will have
a swing of atleast +-2 from previous value and correcting
the Qp translation tables

Change-Id: Id6f0fa4f282c288b81cfe278f34957a0fa68ff8c
2015-06-24 21:03:22 +00:00
Harinarayanan K K
63f40a8f85 Fixed issues with forcing I and IDR frames.
Setting I frame interval to 1 caused encoder to go into
infinite loop. Fixed that by stopping RC update.

Forcing of I and IDR frame did not cause the frames at expected time
due to delayed encoding. This is fixed now.

Change-Id: Ibf549fb335c053ee33de768455b20e46be3e7c1c
2015-06-24 21:02:01 +00:00
Martin Storsjo
d020be5ac7 Remove the codec level stride field
This field isn't used at the moment at all. The public field
ive_ctl_set_dimensions_ip_t.u4_strd is kept to avoid breaking
other calling code, although it doesn't have any actual function
any longer.

Change-Id: Icfc88846fa63f209c67b8e1f8e0cc21bc4ddb73a
2015-06-24 20:54:45 +00:00
Martin Storsjo
f768297941 Always copy data to a local buffer if padding is needed
If horizontal padding is needed, copy the data to avoid having to try
to write into the input buffer.

If vertical padding is needed, we could get away with only copying
the last MB row (as previously was done), but then one extra row of
pixels are needed for intra pred. Thus always copy all of the picture,
for simplicity, if padding is needed.

Change-Id: I6b456a12956120d64e7c6b86d7b571e159f4566b
2015-06-24 20:54:23 +00:00
Martin Storsjo
90a3904fd3 Set the luma/chroma strides depending on source buffer
If the data is read directly from the input buffer, set the stride
values to those of the input buffer. If the data is copied, set the
stride to the value of the local buffer instead.

This fixes handling of cases where the input buffer stride is
(significantly) larger than the maxwidth of the video.

This also effectively makes the parameter
ive_ctl_set_dimensions_ip_t.u4_strd useless - nothing needs to
know the stride until you actually encode a frame, and at that point,
we can either use the stride of the input buffer, or of the local
pu1_y_csc_buf_base where the copied content is stored.

Change-Id: Icde400b4a0867d25855e621e143454e608748aa3
2015-06-24 20:50:12 +00:00
Martin Storsjo
53c6878c15 Use a separate field for the chroma stride
When both luma and chroma are copied to the local buffer (either
due to yuv format conversion, or due to padding), they have got
the same stride, but if chroma is copied while luma is used directly
from the input buffer, they might have different strides.

Therefore add a separate field for chroma stride.

This commit only adds the field, while it still has got the same
value as before.

Change-Id: I0dce97ad4d91cd1d9aba4b4472c6a0de45a314bc
2015-06-24 20:49:50 +00:00
Martin Storsjo
5f5a2805ac armv8: Don't touch the x18 register
The x18 register is platform specific, and using it in portable assembler
code should be avoided.

In this particular case, using it is not actually needed at all.

Change-Id: I07016fdd3a264ed77eba37abcd1748b51cf7a49e
2015-06-24 20:48:51 +00:00
Martin Storsjo
50738a6bd8 arm: Properly match /* */ comments in the arm assembly
Some versions of the clang built-in assembler interprets /* as a start
of a multi-line comment, even within lines starting with a @. Therefore,
make sure to terminate these properly.

This fixes warnings about /* within a block comment when building
using the clang built-in assembler (in some versions of clang), and
fixes issues where part of the assembly source was effectively
commented out, when building with this assembler.

Change-Id: I4b520334d92740f8c60def94ee990561b2cb8b7c
2015-06-24 20:47:59 +00:00
Martin Storsjo
a61d4e0108 armv8: Don't accidentally write 8 bytes instead of 4
This fixes running when built with clang - by pure luck the out of bounds
writes didn't cause any harm when the calling C code was built with gcc.

Change-Id: I4e33dd403b785cbcd24fb80f4db7a86310a32225
2015-06-24 20:45:58 +00:00
Martin Storsjo
db02f57bdc armv8: Remove redundant NEON element size declarations
When specifying one specific lane of the vector, the number of
lanes don't need to be specified.

The clang built-in assembler doesn't allow the redundant
declarations, while binutils gas work fine with both forms.

Change-Id: I86077ce0774d4594a1295b6860e4944df87dde2f
2015-06-24 20:44:24 +00:00
Marco Nelissen
171fe40050 Merge "Handle non-mod-16 widths in the NEON version of 422i->420sp conversion" 2015-06-24 20:43:07 +00:00
Harinarayanan K K
134291ea0b Added support for Main Profile toolsets in encoder.
Added support for CABAC entropy coding.
Added support for B slices.
Fixed an issue in rate control constant QP mode.

Change-Id: Ib759d35e8e943f941aa9b8bbff0362d92c619994
2015-06-24 20:36:11 +00:00
Marco Nelissen
3764559f3f Merge "Remove a duplicate header" 2015-06-24 20:33:45 +00:00
Marco Nelissen
91a4aa1393 Merge "Fix string handling for generating version strings" 2015-06-24 20:33:32 +00:00
Marco Nelissen
2b0f8b134f Merge "Force regenerating the header via i4_gen_header instead of i4_header_mode" 2015-06-24 20:32:12 +00:00
Martin Storsjo
7313602dec Don't use static structs for rc init
Most of them was benign and didn't risk any data race; they
were used for write-only memory during init.

The array as_itt_memtab in ih264e_get_rate_control_mem_tab
could however cause a real data race, if multiple threads
try to initialize an encoder at the same time, since it
used as temporary storage when mapping between different
structs.

Change-Id: I3ca29f0e3be2fad154becc3ee29867e591975a74
2015-06-23 15:00:45 +03:00