Closed GoogleCodeExporter closed 8 years ago
Original comment by fbarch...@chromium.org
on 1 Sep 2015 at 10:45
I420ToARGB implemented with matrix at low level.
ideally all low levels accept matrix, but arm may be hard. so first step was
wrapper.
These are the current reference versions
static void YUVToRGBReference(int y, int u, int v, int* r, int* g, int* b) {
*r = RoundToByte((y - 16) * 1.164 - (v - 128) * -1.596);
*g = RoundToByte((y - 16) * 1.164 - (u - 128) * 0.391 - (v - 128) * 0.813);
*b = RoundToByte((y - 16) * 1.164 - (u - 128) * -2.018);
}
static void YUVJToRGBReference(int y, int u, int v, int* r, int* g, int* b) {
*r = RoundToByte(y - (v - 128) * -1.40200);
*g = RoundToByte(y - (u - 128) * 0.34414 - (v - 128) * 0.71414);
*b = RoundToByte(y - (u - 128) * -1.77200);
}
Original comment by fbarch...@chromium.org
on 2 Sep 2015 at 10:10
Todo list
C version of matrix code.
Neon code use YuvConstants. Different constants, or make YUV setup shuffle
values?
H420ToARGB using matrix
Original comment by fbarch...@chromium.org
on 2 Sep 2015 at 11:12
r1478 J420ToABGR implemented via I420ToABGRMatrixRow_SSSE3
Todo: all YUV to RGB functions take YuvConstants struct.
-row functions take YuvConstants
-convert functions pass constants
-any functions pass constants
Original comment by fbarch...@chromium.org
on 3 Sep 2015 at 6:08
roll attempt fails on chrome bots
[2/3] TabCaptureApiPixelTest.EndToEndWithoutRemoting (TIMED OUT)
Still waiting for the following processes to finish:
"..\out\Release\browser_tests.exe" --allow-file-access --enable-gpu --gtest_also_run_disabled_tests --gtest_filter=TabCaptureApiPixelTest.EndToEndThroughWebRTC --single_process --test-launcher-bot-mode --test-launcher-jobs=1 --test-launcher-summary-output="c:\users\chrome~1\appdata\local\temp\isolated_out67p2wm\output.json" --user-data-dir="C:\Users\CHROME~1\AppData\Local\Temp\scoped_dir3396_6258\d3396_14993"
[ RUN ] TabCaptureApiPixelTest.EndToEndThroughWebRTC
[2108:2844:0904/194659:WARNING:webrtcvoiceengine.cc(467)] Unexpected codec:
ISAC/48000/1 (105)
[2108:2844:0904/194659:WARNING:webrtcvoiceengine.cc(467)] Unexpected codec:
PCMU/8000/2 (110)
[2108:2844:0904/194659:WARNING:webrtcvoiceengine.cc(467)] Unexpected codec:
PCMA/8000/2 (118)
[2108:2844:0904/194659:WARNING:webrtcvoiceengine.cc(467)] Unexpected codec:
G722/8000/2 (119)
[960:3212:0904/194700:ERROR:gpu_video_decode_accelerator.cc(280)] HW video
decode not available for profile 11
[2108:2844:0904/194700:WARNING:webrtcvoiceengine.cc(1294)] webrtc:
(rtp_packet_history.cc:43): Purging packet history in order to re-set status.
[2108:2844:0904/194700:WARNING:webrtcvoiceengine.cc(2833)]
SetOutputVolumePan(1, 1, 1) failed, err=8040
[2108:2844:0904/194700:WARNING:webrtcvoiceengine.cc(1294)] webrtc:
(rtp_packet_history.cc:43): Purging packet history in order to re-set status.
[2108:2844:0904/194700:WARNING:webrtcvoiceengine.cc(1294)] webrtc:
(rtp_packet_history.cc:43): Purging packet history in order to re-set status.
[2108:2844:0904/194700:WARNING:webrtcvoiceengine.cc(1294)] webrtc:
(rtp_packet_history.cc:43): Purging packet history in order to re-set status.
[2108:2736:0904/194700:WARNING:webrtcsession.cc(1665)] Candidate has unknown
component: Cand[2543930320:2:udp:2122260222:192.168.140.63:55996:local::0::]
for content: audio
Backtrace:
I422ToARGBMatrixRow_AVX2 [0x052EBBDA+202]
I422ToARGBRow_AVX2 [0x052E93CC+28]
I420ToARGB [0x052E5FB9+233]
media::SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels [0x0501A5B2+514]
media::VideoImageGenerator::onGetPixels [0x0501B4B1+17]
SkImageGenerator::getPixels [0x023C70DD+125]
SkDiscardablePixelRef::onNewLockPixels [0x02407EAC+268]
SkPixelRef::lockPixelsInsideMutex [0x0233FE81+161]
SkPixelRef::onRequestLock [0x0233FF4B+11]
Original comment by fbarch...@chromium.org
on 8 Sep 2015 at 5:40
H420 support has landed in chrome.
Original comment by fbarch...@chromium.org
on 11 Sep 2015 at 12:48
J422ToARGB ported to Neon 32 bit. (but not 64 bit)
32 bit
GYP_DEFINES="OS=ios target_arch=armv7 target_subarch=both" GYP_CROSSCOMPILE=1
GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv -f ninja --depth=.
libyuv_test.gyp
ninja -j7 -C out_ios/Debug-iphoneos libyuv_unittest
ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
64 bit
GYP_DEFINES="OS=ios target_arch=armv7 target_subarch=both" GYP_CROSSCOMPILE=1
GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv -f ninja --depth=.
libyuv_test.gyp
ninja -j7 -C out_ios/Debug-iphoneos libyuv_unittest
ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
Original comment by phthor...@gmail.com
on 15 Sep 2015 at 10:36
Original comment by fbarch...@google.com
on 17 Sep 2015 at 8:08
instances of yuv conversion:
row_gcc.cc:#define YUVTORGB(YuvConstants)
row_gcc.cc: YUVTORGB(YuvConstants)
row_gcc.cc: YUVTORGB(YuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(YuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc: YUVTORGB(kYuvConstants)
row_gcc.cc:#define YUVTORGB_AVX2(YuvConstants)
\
row_gcc.cc: YUVTORGB_AVX2(kYuvConstants)
row_gcc.cc: YUVTORGB_AVX2(kYuvConstants)
row_gcc.cc: YUVTORGB_AVX2(kYuvConstants)
row_gcc.cc: YUVTORGB_AVX2(kYuvConstants)
row_win.cc:#define YUVTORGB(YuvConstants)
\
row_win.cc: YUVTORGB(YuvConstants)
row_win.cc: YUVTORGB(YuvConstants)
row_win.cc:#define YUVTORGB_AVX2(YuvConstants) __asm {
\
row_win.cc: YUVTORGB_AVX2(ebp)
row_win.cc: YUVTORGB_AVX2(ebp)
row_win.cc: YUVTORGB_AVX2(ebp)
row_win.cc: YUVTORGB_AVX2(kYuvConstants)
row_win.cc: YUVTORGB_AVX2(kYuvConstants)
row_win.cc: YUVTORGB_AVX2(kYvuConstants)
row_win.cc: YUVTORGB_AVX2(kYuvConstants)
row_win.cc: YUVTORGB_AVX2(kYuvConstants)
row_win.cc: YUVTORGB_AVX2(ebp)
row_win.cc:#define YUVTORGB(YuvConstants) __asm {
\
row_win.cc: YUVTORGB(ebp)
row_win.cc: YUVTORGB(ebp)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(ebp)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(kYvuConstants)
row_win.cc: YUVTORGB(kYuvConstants)
row_win.cc: YUVTORGB(ebp)
row_win.cc: YUVTORGB(kYuvConstants)
and neon versions
row_neon.cc:#define YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon.cc: YUV422TORGB_SETUP_REG
row_neon64.cc:#define YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
row_neon64.cc: YUV422TORGB_SETUP_REG
Original comment by fbarch...@google.com
on 21 Sep 2015 at 6:26
All functions converted with following caveats
I400 does not use matrix
neon64 and mips ignore yuvconstants
Original comment by fbarch...@google.com
on 22 Sep 2015 at 10:51
YUY2 implemented as direct asm with yuvconstants
Old profile
YUY2ToARGB_Opt (563 ms)
72.46% libyuv_unittest libyuv_unittest [.] I422ToARGBMatrixRow_SSSE3
16.50% libyuv_unittest libyuv_unittest [.] YUY2ToUV422Row_SSE2
7.02% libyuv_unittest libyuv_unittest [.] YUY2ToYRow_SSE2
New profile
YUY2ToARGB_Opt (396 ms)
97.17% libyuv_unittest libyuv_unittest [.] YUY2ToARGBRow_SSSE3
Original comment by fbarch...@google.com
on 22 Sep 2015 at 10:52
r1490
AVX2 YUY2ToARGB_Opt (280 ms)
SSSE3 YUY2ToARGB_Opt (397 ms)
C YUY2ToARGB_Opt (4484 ms)
Original comment by fbarch...@google.com
on 23 Sep 2015 at 6:29
Closing this bug, as basic matrix functionality is done.
Followup needed for aarch64
Original comment by fbarch...@google.com
on 25 Sep 2015 at 12:35
Original comment by fbarch...@chromium.org
on 17 Nov 2015 at 10:16
Original issue reported on code.google.com by
fbarch...@chromium.org
on 27 Aug 2015 at 7:22