Frank Galligan [Fri, 16 Aug 2013 18:16:48 +0000 (11:16 -0700)]
Merge "vp9: neon: optimise vp9_wide_mbfilter_neon"
Johann [Fri, 16 Aug 2013 17:29:59 +0000 (10:29 -0700)]
Merge "vp9: neon: use aligned stores in convolve functions"
Adrian Grange [Fri, 9 Aug 2013 23:25:01 +0000 (16:25 -0700)]
Fixed typos and formatting
Change-Id: I3814984a624bc64147c57efa74fbdda8eda47262
Adrian Grange [Fri, 16 Aug 2013 16:07:36 +0000 (09:07 -0700)]
Merge "Added resizing & initialization of last frame segment map"
Mans Rullgard [Tue, 13 Aug 2013 16:19:57 +0000 (17:19 +0100)]
vp9: neon: use aligned stores in convolve functions
The destination is block-aligned so it is safe to use aligned
stores.
Change-Id: I38261e4fa40bc60e6472edffece59e372908da7e
Jingning Han [Thu, 15 Aug 2013 23:02:12 +0000 (16:02 -0700)]
Merge "Refactor rd loop for chroma components"
Adrian Grange [Fri, 9 Aug 2013 23:21:27 +0000 (16:21 -0700)]
Added resizing & initialization of last frame segment map
When the frame size changes the last frame segment map must
be resized to match and initialized to 0.
Change-Id: Idc10de109f55dbe9af3a6caae355a2974712243d
Dmitry Kovalev [Thu, 15 Aug 2013 22:21:09 +0000 (15:21 -0700)]
Merge "Converting code from using ss_txfrm_size to tx_size."
Dmitry Kovalev [Thu, 15 Aug 2013 22:14:32 +0000 (15:14 -0700)]
Merge "Moving segmentation struct from MACROBLOCKD to VP9_COMMON."
Johann [Thu, 15 Aug 2013 21:55:15 +0000 (14:55 -0700)]
Merge "vp9: neon: add vp9_convolve_avg_neon"
Johann [Thu, 15 Aug 2013 21:55:08 +0000 (14:55 -0700)]
Merge "vp9: neon: add vp9_convolve_copy_neon"
Jingning Han [Wed, 14 Aug 2013 17:52:36 +0000 (10:52 -0700)]
Refactor rd loop for chroma components
This commit makes the rate-distortion optimization search of chroma
components consistent across all block sizes. It removes redundant
codes.
Change-Id: I7e76f54d045e8efdd41d84a164c71f55b484471b
Jingning Han [Thu, 15 Aug 2013 20:48:25 +0000 (13:48 -0700)]
Merge "Remove unused RDCOST_8X8 macro"
Jingning Han [Thu, 15 Aug 2013 20:48:15 +0000 (13:48 -0700)]
Merge "Unify luma and chroma rd-cost estimation"
Dmitry Kovalev [Thu, 15 Aug 2013 18:44:57 +0000 (11:44 -0700)]
Converting code from using ss_txfrm_size to tx_size.
Updated function signatures:
txfrm_block_to_raster_block
txfrm_block_to_raster_xy
extend_for_intra
vp9_optimize_b
Change-Id: I7213f4c4b1b9ec802f90621d5ba61d5e4dac5e0a
Dmitry Kovalev [Thu, 15 Aug 2013 18:37:56 +0000 (11:37 -0700)]
Using { 0 } for initialization instead of memset.
Change-Id: I4fad357465022d14bfc7e13b348c6da267587314
Mans Rullgard [Thu, 15 Aug 2013 17:54:51 +0000 (18:54 +0100)]
vp9: neon: optimise vp9_wide_mbfilter_neon
Break up long dependency chains to improve instruction scheduling.
Change-Id: I0e0cb66943df24af920767bb4167b25c38af9630
James Zern [Thu, 15 Aug 2013 17:59:22 +0000 (10:59 -0700)]
Merge "vp9_dx_iface: check for NULL/0-size input"
James Zern [Thu, 15 Aug 2013 17:58:53 +0000 (10:58 -0700)]
Merge "vpxenc: open output file after setting pass #"
Dmitry Kovalev [Wed, 14 Aug 2013 18:20:33 +0000 (11:20 -0700)]
Moving segmentation struct from MACROBLOCKD to VP9_COMMON.
VP9_COMMON is the right place to segmentatation struct because it has
global segmentation parameters, not something specific to macroblock
processing.
Change-Id: Ib9ada0c06c253996eb3b5f6cccf6a323fbbba708
Jingning Han [Thu, 15 Aug 2013 17:40:44 +0000 (10:40 -0700)]
Remove unused RDCOST_8X8 macro
Change-Id: I17c7d7eaa60fe69c543403c340f7c1078bfd339f
Dmitry Kovalev [Thu, 15 Aug 2013 17:23:01 +0000 (10:23 -0700)]
Merge "Quantization code cleanup."
Deb Mukherjee [Sat, 3 Aug 2013 00:15:38 +0000 (17:15 -0700)]
Speed feature to skip split partition based on var
Adds a speed feature to disable split partition search based on a
given threshold on the source variance. A tighter threshold derived
from the threshold provided is used to also disable horizontal and
vertical partitions.
Results on derfraw300:
threshold = 16, psnr = -0.057%, speedup ~1% (football)
threshold = 32, psnr = -0.150%, speedup ~4-5% (football)
threshold = 64, psnr = -0.570%, speedup ~10-12% (football)
Results on stdhdraw250:
threshold = 32, psnr = -0.18%, speedup is somewhat more than derf
because of a larger number of smoother blocks at higher resolution.
Based on these results, a threshold of 32 is chosen for speed 1,
and a threshold of 64 is chosen for speeds 2 and above.
Change-Id: If08912fb6c67fd4242d12a0d094783a99f52f6c6
Jingning Han [Wed, 14 Aug 2013 01:58:21 +0000 (18:58 -0700)]
Unify luma and chroma rd-cost estimation
This commit unifies the rate-distortion cost calculation process of
luma and chroma components. It allows early termination to be enabled
later in the rd search loop of chroma components, in consistent with
luma pixels.
Change-Id: I2e52a7c6496176bf2a5e3ef338d34ceb8aad9b3d
Paul Wilkins [Thu, 15 Aug 2013 09:12:48 +0000 (02:12 -0700)]
Merge "Renaming in MB_MODE_INFO"
James Zern [Thu, 15 Aug 2013 05:22:15 +0000 (22:22 -0700)]
Merge "Get rid of bashisms in armlink_adapter.sh"
Guillaume Martres [Thu, 15 Aug 2013 01:56:48 +0000 (18:56 -0700)]
Get rid of bashisms in armlink_adapter.sh
Change-Id: If3cd84bb873fbad5622172c9b79ad8ae5485235a
James Zern [Thu, 15 Aug 2013 01:49:52 +0000 (18:49 -0700)]
Merge "Get rid of bashisms in the main build scripts"
James Zern [Thu, 15 Aug 2013 01:35:22 +0000 (18:35 -0700)]
vp9_dx_iface: check for NULL/0-size input
avoids a crash caused by issue #585
Change-Id: I301595ee0227699b0da6f0dad6d870dd546e94ef
James Zern [Thu, 15 Aug 2013 01:28:42 +0000 (18:28 -0700)]
vpxenc: open output file after setting pass #
write_ivf_file_header would incorrectly skip writing the file header in
the 2nd pass, causing the initial frame header to be overwritten on
close potential causing an overly large frame header to be read and a
crash.
most likely broken since:
9e50ed7 vpxenc: initial implementation of multistream support
fixes issue #585
Change-Id: I7e863e295dd6344c33b3e9c07f9f0394ec496e7b
hkuang [Wed, 14 Aug 2013 21:16:20 +0000 (14:16 -0700)]
Merge "Add neon optimize vp9_short_idct16x16_add."
hkuang [Tue, 6 Aug 2013 23:05:14 +0000 (16:05 -0700)]
Add neon optimize vp9_short_idct16x16_add.
Change-Id: I27134b9a5cace2bdad53534562c91d829b48838d
Dmitry Kovalev [Wed, 14 Aug 2013 18:39:31 +0000 (11:39 -0700)]
foreach_transformed_block_in_plane cleanup, explicit tx_size var.
Making foreach_transformed_block_in_plane more clear (it's not finished
yet). Using explicit tx_size variable consistently instead of
(ss_txfrm_size / 2) or (ss_txfrm_size >> 1) expression.
Change-Id: I1b9bba2c0a9f817fca72c88324bbe6004766fb7d
Dmitry Kovalev [Wed, 14 Aug 2013 17:35:56 +0000 (10:35 -0700)]
Adding const to arguments of intra prediction functions.
Adding const to above and left pointers. Cleanup.
Change-Id: I51e195fa2e2923048043fe68b4e38a47ee82cda1
Mans Rullgard [Wed, 14 Aug 2013 15:18:08 +0000 (16:18 +0100)]
vp9: neon: add vp9_convolve_avg_neon
Change-Id: I33cff9ac4f2234558f6f87729f9b2e88a33fbf58
Mans Rullgard [Wed, 14 Aug 2013 15:17:21 +0000 (16:17 +0100)]
vp9: neon: add vp9_convolve_copy_neon
Change-Id: I15adbbda15d1842e9f15f21878a5ffbb75c3c0c9
Paul Wilkins [Tue, 13 Aug 2013 16:47:40 +0000 (17:47 +0100)]
Renaming in MB_MODE_INFO
The macro block mode info context originally contained an
entry for each 16x16 macroblock. In VP9 each entry refers
to an 8x8 region not a macro block, so the naming is misleading.
This first stage clean up changes the names of 3 entries in the
structure to remove the mb_ prefix.
TODO clean up the nomenclature more widely in respect of
mbmi and bmi.
Change-Id: Ia7305c6d0cb805dfe8cdc98dad21338f502e49c6
Paul Wilkins [Wed, 14 Aug 2013 11:45:18 +0000 (04:45 -0700)]
Merge "Honor min_partition_size properly for non-square splits"
Guillaume Martres [Wed, 14 Aug 2013 01:46:58 +0000 (18:46 -0700)]
Get rid of bashisms in the main build scripts
The conversion was done with the help of the checkbashisms script
and https://wiki.ubuntu.com/DashAsBinSh .
Change-Id: Id64ecefb35c8d72302f343cd2ec442e7ef989d47
Guillaume Martres [Tue, 13 Aug 2013 19:34:32 +0000 (12:34 -0700)]
Honor min_partition_size properly for non-square splits
Don't do vertical or horizontal splits if subsize < min_partition_size,
except for edge blocks where it makes sense.
Change-Id: I479aa66ba1838d227b5de8312d46be184a8d6401
Dmitry Kovalev [Tue, 13 Aug 2013 21:43:10 +0000 (14:43 -0700)]
Merge "Little cleanup inside decode_tile() function."
Guillaume Martres [Tue, 13 Aug 2013 19:40:37 +0000 (12:40 -0700)]
Merge "Trivial clean up."
Jingning Han [Mon, 12 Aug 2013 23:56:32 +0000 (16:56 -0700)]
Use lookup table to find largest txfm size
Refactor choose_largest_txfm_size_ and make it find the largest
transform size via lookup table.
Change-Id: I685e0396d71111b599d5367ab1b9c934bd5490c8
Dmitry Kovalev [Tue, 13 Aug 2013 17:00:01 +0000 (10:00 -0700)]
Merge "Using is_inter_block() instead of repetitive code."
Jingning Han [Tue, 13 Aug 2013 15:48:49 +0000 (08:48 -0700)]
Merge "Refactor model based tx search in super_block_yrd"
Paul Wilkins [Tue, 13 Aug 2013 12:22:13 +0000 (13:22 +0100)]
Trivial clean up.
Delete unused / commented out variable references.
Change-Id: Iaf20c0c3744f89adb296d153b516b5ea41b4f3b4
Paul Wilkins [Tue, 13 Aug 2013 12:19:51 +0000 (05:19 -0700)]
Merge "Honor min_partition_size properly"
Paul Wilkins [Tue, 13 Aug 2013 08:56:29 +0000 (01:56 -0700)]
Merge "Broken loop filter case."
Jingning Han [Tue, 13 Aug 2013 06:03:47 +0000 (23:03 -0700)]
Merge "SSE2 high precision 32x32 forward DCT"
Dmitry Kovalev [Tue, 13 Aug 2013 01:28:13 +0000 (18:28 -0700)]
Little cleanup inside decode_tile() function.
Change-Id: I3ed4beb59371fe21ca3e82253aa98e0cbd5e0630
Johann [Tue, 13 Aug 2013 00:54:47 +0000 (17:54 -0700)]
Merge "vp9: neon: optimise convolve8_vert functions"
Johann [Tue, 13 Aug 2013 00:54:42 +0000 (17:54 -0700)]
Merge "vp9: neon: optimise convolve8_horiz functions"
Dmitry Kovalev [Tue, 13 Aug 2013 00:42:14 +0000 (17:42 -0700)]
Using is_inter_block() instead of repetitive code.
Change-Id: If0b04c476c34fb8c102c9f750d7fe5669a86a532
Jingning Han [Wed, 7 Aug 2013 21:45:37 +0000 (14:45 -0700)]
SSE2 high precision 32x32 forward DCT
Enable SSE2 implementation of high precision 32x32 forward DCT. The
intermediate stacks are of 32-bits. The run-time goes down from
32126 cycles to 13442 cycles.
Change-Id: Ib5ccafe3176c65bd6f2dbdef790bd47bbc880e56
Jingning Han [Mon, 12 Aug 2013 23:34:48 +0000 (16:34 -0700)]
Refactor model based tx search in super_block_yrd
Remove unnecessary conditional branches in model-based transform
size search.
Change-Id: Ic862dc33ed6710a186f6248239dd5f09b5c19981
Dmitry Kovalev [Mon, 12 Aug 2013 23:24:22 +0000 (16:24 -0700)]
Merge "Simplifying vp9_mvref_common.c."
Dmitry Kovalev [Mon, 12 Aug 2013 22:54:01 +0000 (15:54 -0700)]
Merge "Removing foreach_predicted_block_uv function."
Dmitry Kovalev [Mon, 12 Aug 2013 22:53:25 +0000 (15:53 -0700)]
Merge "Using MV* instead of int_mv* as argument of vp9_clamp_mv_min_max."
Dmitry Kovalev [Mon, 12 Aug 2013 22:52:08 +0000 (15:52 -0700)]
Simplifying vp9_mvref_common.c.
Change-Id: I272df2e33fa05310466acf06c179728514dd7494
Dmitry Kovalev [Mon, 12 Aug 2013 22:23:47 +0000 (15:23 -0700)]
Quantization code cleanup.
Change-Id: I77b42418b852093f79260cbd880533a0bd86678f
Dmitry Kovalev [Mon, 12 Aug 2013 22:18:24 +0000 (15:18 -0700)]
Merge "Entropy context related cleanups."
Dmitry Kovalev [Mon, 12 Aug 2013 22:17:26 +0000 (15:17 -0700)]
Merge "Making scaling code more clear."
Dmitry Kovalev [Mon, 12 Aug 2013 21:28:00 +0000 (14:28 -0700)]
Removing unused convolve_avg_c function + cleanup.
Change-Id: Id2b126c6456627c25e4041a82e304d0151d951ba
Dmitry Kovalev [Mon, 12 Aug 2013 18:18:28 +0000 (11:18 -0700)]
Using MV* instead of int_mv* as argument of vp9_clamp_mv_min_max.
Change-Id: I3c45916a9059f11b41e9d798e34ffee052969a44
Dmitry Kovalev [Mon, 12 Aug 2013 20:54:13 +0000 (13:54 -0700)]
Removing foreach_predicted_block_uv function.
Adding function build_inter_predictors_for_planes to build inter
predictors for specified planes. This function allows to remove
condition "#if CONFIG_ALPHA" and use MAX_MB_PLANE for general case.
Renaming 'which_mv' local var to 'ref', and 'weight' argument to 'ref'.
Change-Id: I1a97160c9263006929d38953f266bc68e9c56c7d
Dmitry Kovalev [Mon, 12 Aug 2013 20:30:26 +0000 (13:30 -0700)]
Making scaling code more clear.
Reusing existing functions, using constants instead of magic numbers.
Change-Id: Idc689ffba52c9a8b203fcf26bd67110ecb5635f9
Paul Wilkins [Mon, 12 Aug 2013 18:46:47 +0000 (19:46 +0100)]
Broken loop filter case.
Loop filter level moved to common but this case missed.
Change-Id: I7fcb557e46ef4ed8e2b5e9c3e82cb042b55bbd7f
Jingning Han [Mon, 12 Aug 2013 18:41:09 +0000 (11:41 -0700)]
Fix a compile failure in vp9_get_compressed_data
The lf struct is now with VP9_COMMON, instead of MACROBLOCKD.
Change-Id: Idfdd4f91f78f486078a138322d58bb61e93e1bc9
Dmitry Kovalev [Mon, 12 Aug 2013 18:24:24 +0000 (11:24 -0700)]
Entropy context related cleanups.
Adding set_skip_context() function used from both encoder and decoder.
Change-Id: Ia22cfad3211a00a63eb294f64f857b78f4aa9b85
Mans Rullgard [Mon, 12 Aug 2013 14:37:48 +0000 (15:37 +0100)]
vp9: neon: optimise convolve8_vert functions
Invert loops to operate vertically in the inner loop. This allows
removing redundant loads.
Also add preloading of data.
Change-Id: I4fa85c0ab1735bcb1dd6ea58937efac949172bdc
Dmitry Kovalev [Sun, 11 Aug 2013 19:20:58 +0000 (12:20 -0700)]
Merge "Removing redundant code and function arguments."
Mans Rullgard [Sun, 11 Aug 2013 14:34:24 +0000 (15:34 +0100)]
vp9: neon: optimise convolve8_horiz functions
Each iteration of the horizontal loop reuses 7 of the 11 source
values. Loading only the 4 new values saves some time.
Also add preload for source data.
Overall 4% faster on Chromebook.
Change-Id: I8f69e749f2b7f79e9734620dcee51dbfcd716b44
Dmitry Kovalev [Sat, 10 Aug 2013 00:47:32 +0000 (17:47 -0700)]
Renaming BLOCK_SIZE_TYPES constant to BLOCK_SIZES.
There will be another change set to rename BLOCK_SIZE_TYPE enum to
BLOCK_SIZE.
Change-Id: I8d1dfc873d6186fa5e554262f5169e929978085e
Guillaume Martres [Sat, 10 Aug 2013 00:28:33 +0000 (17:28 -0700)]
Honor min_partition_size properly
It represents the minimum partition size, so don't split if
bsize == min_partition_size .
Change-Id: Id77c32d6afef7d2ddec0368eaae18fb13227d30e
Dmitry Kovalev [Sat, 10 Aug 2013 00:24:40 +0000 (17:24 -0700)]
Removing redundant code and function arguments.
Change-Id: Ia5cdda0f755befcd1e64397452c42cb7031ca574
Dmitry Kovalev [Sat, 10 Aug 2013 00:22:46 +0000 (17:22 -0700)]
Merge "Inlining 16 as a stride for BLOCK_OFFSET macro."
James Zern [Sat, 10 Aug 2013 00:13:32 +0000 (17:13 -0700)]
Merge "vp9_rd_pick_inter_mode_sb: fix uninitialized value"
Dmitry Kovalev [Fri, 9 Aug 2013 23:40:05 +0000 (16:40 -0700)]
Inlining 16 as a stride for BLOCK_OFFSET macro.
Change-Id: I7f23d174eb089e5500f268a10db09648634c1b82
James Zern [Fri, 9 Aug 2013 23:15:08 +0000 (16:15 -0700)]
vp9_rd_pick_inter_mode_sb: fix uninitialized value
'skippable' can remain unset and negatively affect later decisions
address one aspect of issue #599
Change-Id: Iffdf0ac2e49ac481c27dc27c87fa546d4167bb28
Dmitry Kovalev [Fri, 9 Aug 2013 22:33:08 +0000 (15:33 -0700)]
Merge "Using MV struct instead of int[2] array."
Dmitry Kovalev [Fri, 9 Aug 2013 22:26:51 +0000 (15:26 -0700)]
Merge "Removing plane_block_{width, height}_log2by4 functions."
Dmitry Kovalev [Fri, 9 Aug 2013 22:23:00 +0000 (15:23 -0700)]
Merge "Moving loopfilter struct to VP9_COMMON."
Dmitry Kovalev [Fri, 9 Aug 2013 21:41:51 +0000 (14:41 -0700)]
Moving loopfilter struct to VP9_COMMON.
Loop filter configuration doesn't belong to macroblock, so moving it from
MACROBLOCKD to VP9_COMMON. Also moving the declaration of loopfilter struct
from vp9_blockd.h to vp9_loopfilter.h.
Change-Id: I4b3e34be9623b47cda35f9b1f9951f8c5b1d5d28
Dmitry Kovalev [Fri, 9 Aug 2013 21:07:09 +0000 (14:07 -0700)]
Moving scale_factors and related code to separate files.
Change-Id: I531829e5aee2a4a7a112d528ecccbddf052d0e74
Scott LaVarnway [Fri, 9 Aug 2013 19:30:52 +0000 (12:30 -0700)]
Merge "Bug fix: call set_offsets before rd_auto_partition_range"
Dmitry Kovalev [Fri, 9 Aug 2013 18:50:58 +0000 (11:50 -0700)]
Merge "Using buf_2d struct instead of separate buffer and stride vars."
Scott LaVarnway [Fri, 9 Aug 2013 18:09:49 +0000 (14:09 -0400)]
Bug fix: call set_offsets before rd_auto_partition_range
The set_offsets call is necessary inorder to set the
mode_info_context ptr correctly.
Change-Id: I644910cc5bacc50ee9cd78458843274ad8ee636d
Adrian Grange [Fri, 9 Aug 2013 16:51:58 +0000 (09:51 -0700)]
Merge "Correct bug in loopfilter initialization"
Adrian Grange [Fri, 9 Aug 2013 16:21:15 +0000 (09:21 -0700)]
Correct bug in loopfilter initialization
The memset sets 16 bytes rather than the correct size of the
final array dimension (MAX_MODE_LF_DELTAS).
(In response to bug posted by Manjit Hota to codec-devel
and webm-discuss lists)
Change-Id: I8980f5aa71ddc9d7ef57c5b4700bc28ddf8651c7
Yaowu Xu [Wed, 7 Aug 2013 19:29:45 +0000 (12:29 -0700)]
Added lpf level picking using partial frame
Change-Id: I599ab1bd22b5f3f10d5962c609952abdef8ff67a
Yaowu Xu [Wed, 7 Aug 2013 17:54:20 +0000 (10:54 -0700)]
renamed vp8_yv12_copy_y to vpx_yv12_copy_y
Becuase the routine is used by both vp8 and vp9
Change-Id: I2d35b287b5bc2394865d931a27da61f4ce7edeeb
Yaowu Xu [Tue, 6 Aug 2013 22:46:26 +0000 (15:46 -0700)]
added a speed feature on lpf level picking
Change-Id: Id578f8afdeab3702fc8386969f2d832d8f1b5420
Yaowu Xu [Fri, 9 Aug 2013 14:19:59 +0000 (07:19 -0700)]
Merge "fix unit test failure on win32 vs2008 build"
Dmitry Kovalev [Fri, 9 Aug 2013 04:25:48 +0000 (21:25 -0700)]
Using buf_2d struct instead of separate buffer and stride vars.
Change-Id: Id5cc3566cc16d1e3030ddb4d1c58459320321dca
Dmitry Kovalev [Thu, 8 Aug 2013 21:52:39 +0000 (14:52 -0700)]
General code cleanup.
Removing redundant parenthesis and curly braces. Combining declarations
with initializations. Adding useful intermediate variables instead of
recalculating expressions every time.
Change-Id: I00106f404afd60bfc189905b0fded881684f941a
Yaowu Xu [Fri, 9 Aug 2013 01:25:03 +0000 (18:25 -0700)]
fix unit test failure on win32 vs2008 build
The mix use of double type and simd code caused invalid values stored
in double variables, further caused unit tests to fail. The failures
were only observed on x86-win32-vs9 build with vs2008.
Change-Id: If0131754a3bf217a5ace303b7963e8f5162c34b5
Dmitry Kovalev [Thu, 8 Aug 2013 21:59:38 +0000 (14:59 -0700)]
Merge "Cleanup inside vp9_reconinter.c."
Deb Mukherjee [Thu, 8 Aug 2013 19:26:55 +0000 (12:26 -0700)]
Merge "Adds a new subpel motion function"
Dmitry Kovalev [Thu, 8 Aug 2013 19:16:57 +0000 (12:16 -0700)]
Merge "Removing unneeded intermediate entropy_nodes_adapt var."
Dmitry Kovalev [Thu, 8 Aug 2013 19:01:56 +0000 (12:01 -0700)]
Using MV struct instead of int[2] array.
Change-Id: Iab951c555037e36b154f319f351c5e67f9abb931