Commit graph

88 commits

Author SHA1 Message Date
Marco Nelissen
3c192ea28b Merge "Mark arrays of pointers as const" 2015-07-28 18:35:01 +00:00
Marco Nelissen
87ad734d5e Merge "Don't set -mno-avx" 2015-07-28 18:29:44 +00:00
Martin Storsjo
75b967ae2c Don't set -mno-avx
There is no point in intentionally disabling this feature; it
isn't enabled by default by the compiler - and if it were to be
enabled by default (if the toolchain baseline includes it, because
it can be expected to be supported everywhere) there would be no
reason to disable it.

Change-Id: I67019eea63c4fb7183d9e47cf16bc8485022fef2
2015-06-27 00:44:27 +03:00
Martin Storsjo
91d2783e2b Mark arrays of pointers as const
Previously they were only marked as the pointers pointing to const
data, but the array themselves being non-const.

Change-Id: Ib5a9af6298615b2c40367a21e728899418b09935
2015-06-27 00:43:36 +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
ac694327a0 Merge "Remove all other thread implementations than pthread" 2015-06-25 14:29:09 +00:00
Marco Nelissen
aabbf6052f Merge "Don't declare variables after statements" 2015-06-25 14:28:51 +00:00
Martin Storsjo
cc89b12115 Remove all other thread implementations than pthread
Change-Id: Id30fc1a9c007f2f32ed3375bbf02085f0edad5a0
2015-06-25 13:31:23 +03: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
a926c1d695 avcenc: Make sure that "avcenc --help" works as intended
The --help option is handled by the normal argument parsing loop
below, but that is only invoked if argc > 2.

Change-Id: Icff3625412c340565c062628f2657c41db73068e
2015-06-24 21:07:43 +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
1a6481fb1b Allow using the clang built-in arm assembler
The arm and armv8 assembly source should now build just fine with
clang's built-in assembler.

Change-Id: I26d2a74d05e56e6e93457299d4d8ab082368701f
2015-06-24 20:46:19 +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
ab3f812396 arm: Use vqmovun instead of vqshrun #0
binutils gas automatically produces vqmovun when vqshrun is used
with a zero shift.

This is required for building the armv8 assembly with the clang built-in
assembler.

Change-Id: Ie986978e4508a085e4e4c76f8db9a8a8394c4fec
2015-06-24 20:45:42 +00:00
Martin Storsjo
d847c7fd84 arm: Use unified syntax, ldrsheq instead of ldreqsh
clang only supports the new, unified arm syntax (UAL), while binutils
gas supports both (and defaults to the old syntax). Explicitly declare
that the unified syntax is used, and use the right form of these
instructions that is supported by both.

Change-Id: I9a3940e060c129861c7a542ccf09035dbd1766ae
2015-06-24 20:45:21 +00:00
Martin Storsjo
622cf7a838 armv8: Use the cmn instruction instead of doing cmp with negative values
binutils gas automatically converts cmp with negative values to use
the cmn instruction instead.

This is required for building the armv8 assembly with the clang built-in
assembler.

Change-Id: If6465ea1bec252446c49cf497153e3ef3dad905a
2015-06-24 20:45:05 +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
Martin Storsjo
81b0b5a411 Don't include <sys/time.h> if WINDOWS_TIMER is set
If WINDOWS_TIMER is set, windows.h is supposed to be used instead,
and sys/time.h isn't available.

This reduces the amount of duplicated include directives in the test
apps.

Change-Id: I223d80c4ccaed2aab55e3aae66dab903ecacef7a
2015-06-24 20:42:25 +00:00
Martin Storsjo
584cbb6996 Remove the ithread_exit function
This function is dangerous since it behaved differently on different
platform implementations. It is not used for any actual purpose, and
not currently necessary.

Change-Id: I9702e9943065235c7a7b29dc6c6eeb36212e7ce1
2015-06-24 20:41:03 +00:00
Martin Storsjo
7cc1badb17 Remove unnecessary calls to ithread_exit
The ithread_exit wrapper function behaves inconsistently across
platforms; on windows, the argument is a thread handle, denoting
the thread that will be exited. On pthreads, ithread_exit only
terminates the current thread, not any other thread.

These both calls are at the end of each thread function (and the one
with a non-null parameter refers to the handle of the thread itself),
so the thread will exit immediately anyway.

Change-Id: I21e43c56874729452bd80b28ff351e3c5d3f087e
2015-06-24 20:40:31 +00:00
Hamsalekha S
1f2d0129ef Improved error resilience in decoder
Fixed buffer management for error cases
Fixed end of picture detection logic for multiple slice error cases
Fixed handling of incomplete frame, missing slices.

Change-Id: Iae447667e4d88869a8bf992180cacd77870b9877
2015-06-24 20:39:37 +00:00
Martin Storsjo
202a538fdb Don't add -m32/-m64 to the cflags
If the environment already indicates that the compiler targets
either x86 or x86_64, we don't need to enforce this by trying to
force the compiler to output a specific bitness.

Change-Id: Ife6e717e90b4da4edd852dcd66ad92dba70939a2
2015-06-24 20:37:53 +00:00
Martin Storsjo
8bf6b2c4f3 Remove an unused and unnecessary function prototype and associated define
Change-Id: I61b30d0934715cddd54b66ea3b023b2316a0106f
2015-06-24 20:37:43 +00:00
Martin Storsjo
29fe0e290a Remove unnecessary defines/undefines in the makefiles
The following defines aren't referenced anywhere in the code base:
_LIB MULTICORE APPLY_CONCEALMENT THREAD_QUAD_CORE DISABLE_NEONINTR
ARMGCC

The DEFAULT_ARCH define isn't used within the encoder at all.

The ANDROID define isn't referenced anywhere either, and if necessary,
the automatically enabled define __ANDROID__ can be used instead.

The defines INSERT_LOGO and LOGO_EN were undefined in the makefiles,
but that is unnecessary since nothing actually defines them. The
decoder x86_64 makefile also undefined LOGO_EN; an architecture
specific makefile shouldn't touch such feature settings, otherwise
there's a risk that different builds for different architectures
behave significantly differently.

Change-Id: I13b86c8bf2feb3a381d904a13f18c3b35f40a575
2015-06-24 20:37:31 +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
0e4a966003 Merge "Moved check for level after check for resolution change." 2015-06-24 20:35:39 +00:00
Marco Nelissen
1a07f1d667 Merge "Added support for level 52" 2015-06-24 20:35:13 +00:00
Marco Nelissen
3764559f3f Merge "Remove a duplicate header" 2015-06-24 20:33:45 +00:00
Marco Nelissen
f42f40e32b Merge "Remove some unused source files and headers" 2015-06-24 20:33:38 +00:00
Marco Nelissen
91a4aa1393 Merge "Fix string handling for generating version strings" 2015-06-24 20:33:32 +00:00
Marco Nelissen
cbf7ecb3bf Merge "avcenc: Check that enough arguments exist before parsing" 2015-06-24 20:32:50 +00:00
Marco Nelissen
1cdebe9f64 Merge "SSSE3/SSE4 Intrinsics Optimizations" 2015-06-24 20:32:49 +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
Martin Storsjo
afe8d03624 Force regenerating the header via i4_gen_header instead of i4_header_mode
If i4_header_mode is set (without the caller explicitly requesting it),
the next frame to be encoded will be missed altogether (when only
a header is output).

Instead force a header to be generated prepended to the next frame.
If the caller explicitly requests header mode, it will be output
in a separate call.

Change-Id: If475717edf980bccb2076f880c60c9dd7dede904
2015-06-23 12:34:46 +03:00