SlideShare a Scribd company logo
Playing with camera preview
buffers on BlackBerry10
Agenda
- Who am I
- BlackBerry 10 & Camera
- Preview buffers
- Viewfinder raw format
Who am I?
- Mobile Software Engineering Manager
at Imagination Technologies (@imgtec)
- BlackBerry Elite
@rrafols
http://blog.rafols.org
BlackBerry10 & Camera
Multiple options
Invoke Camera Card
Trivial
InvokeRequest req;
req.setTarget("sys.camera.card");
req.setMimeType("image/jpeg");
req.setAction("bb.action.CAPTURE");
req.setData("photo");
invokeManager->invoke(req);
QML
Easy & Simple
Page {
onCreationCompleted: {
camera.open(CameraUnit.Rear);
}
Camera {
id: camera
onTouch: {
camera.capturePhoto();
}
onCameraOpened: {
camera.startViewfinder();
}
}
}
Qt / Cascades
Slightly more complex
Image work on Qt/C++
init
fWin = ForeignWindowControl::create().windowId(QString("cam"));
QObject::connect(fWin,
SIGNAL(windowAttached(screen_window_t, QString&, QString&)),
this,
SLOT(onWindowAttached(screen_window_t, QString&, QString&)));
onWindowAttached
int i = (mCameraUnit == CAMERA_UNIT_FRONT);
screen_set_window_property_iv(win, SCREEN_PROPERTY_MIRROR, &i);
i = -1;
screen_set_window_property_iv(win, SCREEN_PROPERTY_ZORDER, &i);
screen_context_t screen_ctx;
screen_get_window_property_pv(win, SCREEN_PROPERTY_CONTEXT,
(void **)&screen_ctx);
screen_flush_context(screen_ctx, 0);
C APIs
With great power comes
great responsibility!
And lots of work to do...
What are preview buffers and
what can you do with them?
PreviewBuffers are
Viewfinder raw buffers
Can be used in read only mode
or read/write
Multiple options
again
Autocallback
Signal
Filter
Autocallback
Callback when viewfinder
buffer is available
if(camera_start_photo_viewfinder(
cameraHandle,
&previewBufferAvailable,
NULL,
NULL) == CAMERA_EOK)
{
...
}
Autocallback
Signal
Filter
Signal
Register previewFrameAvailable
signal
Multiple buffers can be added
(max 16)
Developer is responsible for:
- Allocating buffers
- Adding buffers as available
- Freeing buffers
Steps
1 – Register signal
cam = root->findChild<Camera*>("cam");
QObject::connect(cam,
SIGNAL(previewFrameAvailable(...)),
this,
SLOT(onPreviewFrameAvailable(...));
Steps
2 – Allocate buffers &
add them as available
quint64 size = cam->previewBufferSize();
for(int i = 0; i < N_BUFS; i++)
{
buf[i] = malloc(size * sizeof(char));
QSharedPointer<unsigned char>b (buf[i]);
cam->addPreviewBuffer(b, size);
}
Steps
3 – Implement slot
void onPreviewFrameAvailable(
SharedUCharPointer buffer,
quint64 size,
unsigned int width,
unsigned int height,
unsigned int stride)
{
…
…
cam->addPreviewBuffer(buffer, size)
}
Autocallback
Signal
Filter
Filter
Applying a filter (r/w)
or processing data (r/o)
Filter
Slightly more complex
than other methods
Steps
1 – Create image processor
thread
chid = ChannelCreate(0);
coid = ConnectAttach(0, 0, chid,
_NTO_SIDE_CHANNEL, 0);
SIGEV_PULSE_INIT(&sigev, coid,
SIGEV_PULSE_PRIO_INHERIT,
FILTER_PULSE_CODE,
0);
pthread_create(&tid, NULL,
processThread, NULL);
Steps
2 – Enable viewfinder and
register camera handle
if(camera_enable_viewfinder_event(
handle,
CAMERA_EVENTMODE_READWRITE,
&key,
&sigev) != CAMERA_EOK)
{
return NULL;
}
camera_register_resource(handle);
Steps
3 – Implement message loop
while (!filter_stop) {
rcvid = MsgReceivePulse(
chid, &pulse, sizeof pulse, NULL);
… check right pulse.code …
camera_get_viewfinder_buffers(
handle, key, &inbuf, &outbuf);
apply_filter(&inbuf, &outbuf);
camera_return_buffer(handle, &inbuf);
camera_return_buffer(handle, &outbuf);
}
Disclaimer
Those methods are
not mutually exclusive
Disclaimer - II
If user callbacks can not keep up,
frames will be dropped
Disclaimer - III
Viewfinder not impacted by frame
drops
Viewfinder raw format
NV12
Ok, but.. what about our RGB?
Wikipedia:
int convertYUVtoARGB(int y, int u, int v) {
u = u – 128;
v = v – 128;
int r = y + (int)(1.772f*v);
int g = y - (int)(0.344f*v + 0.714f*u);
int b = y + (int)(1.402f*u);
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (r<<16) | (g<<8) | b;
}
Qt:
yValue = ((*dataPtr++) - 16) * 1.164;
uValue = ((*uvDataPtr++) - 128);
vValue = ((*uvDataPtr) - 128);
bValue = yValue + 2.018 * uValue;
gValue = yValue - 0.813 * vValue - 0.391
* uValue;
rValue = yValue + 1.596 * vValue;
My implementation
int r = clip((int) ((y - 16) * 1.164 +
1.596 * (v – 128)));
int g = clip((int) ((y - 16) * 1.164 -
0.391 * (u - 128) - 0.813 * (v – 128)));
int b = clip((int) ((y - 16) * 1.164 +
2.018 * (u - 128)));
Optimization
As Y values share UV we can
generate multiple RGB pixels
with a single UV pair.
int r0 = clip((int) ((y0 - 16) * 1.164 ...
int g0 = clip((int) ((y0 - 16) * 1.164 ...
int b0 = clip((int) ((y0 - 16) * 1.164 ...
int r1 = clip((int) ((y1 - 16) * 1.164 ...
int g1 = clip((int) ((y1 - 16) * 1.164 ...
int b1 = clip((int) ((y1 - 16) * 1.164 ...
Optimization
Do not calculate already
calculated values
y0 = y0 – 16; y1 = y1 – 16;
u = u – 128; v = v – 128;
float y0v = y0 * 1.164;
float y1v = y1 * 1.164;
float chromaR = 1.596 * v;
float chromaG = -0.391 * u - 0.813 * v;
float chromaB = 2.018 * u;
r0 = clip((int) y0v + chromaR)
g0 = clip((int) y0v + chromaG)
b0 = clip((int) y0v + chromaB)
r1 = clip((int) y0v + chromaR)
g1 = clip((int) y1v + chromaG)
b1 = clip((int) y1v + chromaB)
Optimization
Avoid floating point operations!
Use fixed point arithmetic
(8 bits precision)
All floating point values have been
premultiplied by 256
u = u – 128; v = v – 128;
int y0v = (y0 – 16) * 298;
int y1v = (y1 – 16) * 298;
int chromaR = 408 * v;
int chromaG = -100 * u - 208 * v;
int chromaB = 517 * u;
int r0 = clip((y0v + chromaR) >> 8);
int g0 = clip((y0v + chromaG) >> 8);
int b0 = clip((y0v + chromaB) >> 8);
int r1 = clip((y1v + chromaR) >> 8);
int g1 = clip((y1v + chromaG) >> 8);
int b1 = clip((y1v + chromaB) >> 8);
Plain integer operations are
usually way faster!
Optimization
Precalculate!
void precalc() {
for(int i = 0; i < 256; i++) {
factorY[i] = ( 298 * (i - 16)) >> 8;
factorRV[i] = ( 408 * (i - 128)) >> 8;
factorGU[i] = (-100 * (i - 128)) >> 8;
factorGV[i] = (-208 * (i - 128)) >> 8;
factorBU[i] = ( 517 * (i - 128)) >> 8;
}
for(int i = 0; i < 256 + 300; i++) {
clipV[i] = min(max(i - 300, 0), 255);
}
}
We add 300 positions to clipping
values to avoid negative indexes
int chromaR = factorRV[v];
int chromaG = factorGU[u] + factorGV[v];
int chromaB = factorBU[v];
int r0 = clipV[y0 + chromaR + 300];
int g0 = clipV[y0 + chromaG + 300];
int b0 = clipV[y0 + chromaB + 300];
int r1 = clipV[y1 + chromaR + 300];
int g1 = clipV[y1 + chromaG + 300];
int b1 = clipV[y1 + chromaB + 300];
Optimization
Remove the +300
int *clipV_ = &clipV[300];
int chromaR = factorRV[v];
int chromaG = factorGU[u] + factorGV[v];
int chromaB = factorBU[v];
int r0 = clipV_[y0 + chromaR];
int g0 = clipV_[y0 + chromaG];
int b0 = clipV_[y0 + chromaB];
int r1 = clipV_[y1 + chromaR];
int g1 = clipV_[y1 + chromaG];
int b1 = clipV_[y1 + chromaB];
Optimization
Improve write operations
DON'T
out[wpos ] = b0;
out[wpos + 1] = g0;
out[wpos + 2] = r0;
out[wpos + 3] = 0xff;
out[wpos + 4] = b1;
out[wpos + 5] = g1;
out[wpos + 6] = r1;
out[wpos + 7] = 0xff;
wpos += 8;
Optimization
Precalc clip values with shift,
mask & alpha value
for(i = 0; i < 256 + 300; i++) {
int c = min(max(i - 300, 0), 255);
clipV[i] = c;
clipVR[i] = 0xFF000000 | c << 16);
clipVG[i] = c << 8;
clipVB[i] = c;
}
DO
out[wpos ] = clipVR_[y0 + chromaR] |
clipVG_[y0 + chromaG] |
clipVB_[y0 + chromaB];
out[wpos + 1] = clipVR_[y1 + chromaR] |
clipVG_[y1 + chromaG] |
clipVB_[y1 + chromaB];
wpos += 8;
Improvement
~500% speed improvement on a
Z10 device
from ~600ms to ~120ms per frame
References
http://en.wikipedia.org/wiki/YUV
http://developer.blackberry.com/native/ref
erence/core/com.qnx.doc.camera.lib_ref/top
ic/overview.html
https://qt.gitorious.org/qt/qtmultimedia/c
ommit/31b454b8d6d27dec0fb39987eb315fe93de7
eda1?format=patch
Paul Bernhardt Presentations (@Pbernhardt)
Sean McVeigh Presentations (@sdlmcveigh)
Contact
http://blog.rafols.org
twitter: @rrafols

More Related Content

What's hot

SE Computer, Programming Laboratory(210251) University of Pune
SE Computer, Programming Laboratory(210251) University of PuneSE Computer, Programming Laboratory(210251) University of Pune
SE Computer, Programming Laboratory(210251) University of Pune
Bhavesh Shah
 
Computer graphics lab assignment
Computer graphics lab assignmentComputer graphics lab assignment
Computer graphics lab assignment
Abdullah Al Shiam
 
Graphics point clipping c program
Graphics point clipping c programGraphics point clipping c program
Graphics point clipping c program
Dr.M.Karthika parthasarathy
 
COMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUALCOMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUAL
Vivek Kumar Sinha
 
Graphics programs
Graphics programsGraphics programs
Graphics programs
NAVYA RAO
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarking
Andrey Akinshin
 
Advance java
Advance javaAdvance java
Advance java
Vivek Kumar Sinha
 
Mobile Game and Application with J2ME
Mobile Gameand Application with J2MEMobile Gameand Application with J2ME
Mobile Game and Application with J2ME
Jenchoke Tachagomain
 
Mobile Game and Application with J2ME - Collision Detection
Mobile Gameand Application withJ2ME  - Collision DetectionMobile Gameand Application withJ2ME  - Collision Detection
Mobile Game and Application with J2ME - Collision Detection
Jenchoke Tachagomain
 
Vcs9
Vcs9Vcs9
ARM 7 LPC 2148 lecture
ARM 7 LPC 2148 lectureARM 7 LPC 2148 lecture
ARM 7 LPC 2148 lecture
anishgoel
 
Numerical Method Assignment
Numerical Method AssignmentNumerical Method Assignment
Numerical Method Assignment
ashikul akash
 
Tabela completa de derivadas e integrais
Tabela completa de derivadas e integraisTabela completa de derivadas e integrais
Tabela completa de derivadas e integrais
Diego Rodrigues Vaz
 
Assnt Answers Linear M
Assnt Answers   Linear MAssnt Answers   Linear M
Assnt Answers Linear M
gueste5efd8
 
Caropro
CaroproCaropro
Caropro
daquicaro
 
ES6(ES2015) is beautiful
ES6(ES2015) is beautifulES6(ES2015) is beautiful
ES6(ES2015) is beautiful
monikagupta18jan
 
Tabela derivadas-e-integrais
Tabela derivadas-e-integraisTabela derivadas-e-integrais
Tabela derivadas-e-integrais
mariasousagomes
 
Scala.io
Scala.ioScala.io
Scala.io
Steve Gury
 
ماترێکس به‌ کوردی ئارام
ماترێکس به‌ کوردی ئارامماترێکس به‌ کوردی ئارام
ماترێکس به‌ کوردی ئارام
Aram Jamal
 

What's hot (19)

SE Computer, Programming Laboratory(210251) University of Pune
SE Computer, Programming Laboratory(210251) University of PuneSE Computer, Programming Laboratory(210251) University of Pune
SE Computer, Programming Laboratory(210251) University of Pune
 
Computer graphics lab assignment
Computer graphics lab assignmentComputer graphics lab assignment
Computer graphics lab assignment
 
Graphics point clipping c program
Graphics point clipping c programGraphics point clipping c program
Graphics point clipping c program
 
COMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUALCOMPUTER GRAPHICS LAB MANUAL
COMPUTER GRAPHICS LAB MANUAL
 
Graphics programs
Graphics programsGraphics programs
Graphics programs
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarking
 
Advance java
Advance javaAdvance java
Advance java
 
Mobile Game and Application with J2ME
Mobile Gameand Application with J2MEMobile Gameand Application with J2ME
Mobile Game and Application with J2ME
 
Mobile Game and Application with J2ME - Collision Detection
Mobile Gameand Application withJ2ME  - Collision DetectionMobile Gameand Application withJ2ME  - Collision Detection
Mobile Game and Application with J2ME - Collision Detection
 
Vcs9
Vcs9Vcs9
Vcs9
 
ARM 7 LPC 2148 lecture
ARM 7 LPC 2148 lectureARM 7 LPC 2148 lecture
ARM 7 LPC 2148 lecture
 
Numerical Method Assignment
Numerical Method AssignmentNumerical Method Assignment
Numerical Method Assignment
 
Tabela completa de derivadas e integrais
Tabela completa de derivadas e integraisTabela completa de derivadas e integrais
Tabela completa de derivadas e integrais
 
Assnt Answers Linear M
Assnt Answers   Linear MAssnt Answers   Linear M
Assnt Answers Linear M
 
Caropro
CaroproCaropro
Caropro
 
ES6(ES2015) is beautiful
ES6(ES2015) is beautifulES6(ES2015) is beautiful
ES6(ES2015) is beautiful
 
Tabela derivadas-e-integrais
Tabela derivadas-e-integraisTabela derivadas-e-integrais
Tabela derivadas-e-integrais
 
Scala.io
Scala.ioScala.io
Scala.io
 
ماترێکس به‌ کوردی ئارام
ماترێکس به‌ کوردی ئارامماترێکس به‌ کوردی ئارام
ماترێکس به‌ کوردی ئارام
 

Viewers also liked

Acids And Alkali
Acids And AlkaliAcids And Alkali
Acids And Alkali
missing island
 
Acids and bases
Acids and basesAcids and bases
Acids and bases
biologica.edu
 
Buffers
BuffersBuffers
Buffers in the body
Buffers in the bodyBuffers in the body
Buffers in the body
Dr Kumar
 
Acids and bases ppt notes
Acids and bases ppt notesAcids and bases ppt notes
Acids and bases ppt notes
jsetsma
 
Acids Bases and Salts
Acids Bases and SaltsAcids Bases and Salts
Acids Bases and Salts
duncanpatti
 
Acids and Bases
Acids and BasesAcids and Bases
Acids and Bases
Sadman Ridoy
 

Viewers also liked (7)

Acids And Alkali
Acids And AlkaliAcids And Alkali
Acids And Alkali
 
Acids and bases
Acids and basesAcids and bases
Acids and bases
 
Buffers
BuffersBuffers
Buffers
 
Buffers in the body
Buffers in the bodyBuffers in the body
Buffers in the body
 
Acids and bases ppt notes
Acids and bases ppt notesAcids and bases ppt notes
Acids and bases ppt notes
 
Acids Bases and Salts
Acids Bases and SaltsAcids Bases and Salts
Acids Bases and Salts
 
Acids and Bases
Acids and BasesAcids and Bases
Acids and Bases
 

Similar to Playing with camera preview buffers on BlackBerry 10

Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
corehard_by
 
More than `po`: Debugging in lldb
More than `po`: Debugging in lldbMore than `po`: Debugging in lldb
More than `po`: Debugging in lldb
Michele Titolo
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscation
guest9006ab
 
Standford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, ViewsStandford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, Views
彼得潘 Pan
 
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docxCOMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
TashiBhutia12
 
RC6
RC6RC6
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
UVCE
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come From
Min-Yih Hsu
 
More Than po: Debugging in LLDB @ CocoaConf SJ 2015
More Than po: Debugging in LLDB @ CocoaConf SJ 2015More Than po: Debugging in LLDB @ CocoaConf SJ 2015
More Than po: Debugging in LLDB @ CocoaConf SJ 2015
Michele Titolo
 
Debugging TV Frame 0x02
Debugging TV Frame 0x02Debugging TV Frame 0x02
Debugging TV Frame 0x02
Dmitry Vostokov
 
More than po: Debugging in LLDB
More than po: Debugging in LLDBMore than po: Debugging in LLDB
More than po: Debugging in LLDB
Michele Titolo
 
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей ПаньгинАварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
odnoklassniki.ru
 
Python From Scratch (1).pdf
Python From Scratch  (1).pdfPython From Scratch  (1).pdf
Python From Scratch (1).pdf
NeerajChauhan697157
 
Java JIT Optimization Research
Java JIT Optimization Research Java JIT Optimization Research
Java JIT Optimization Research
Adam Feldscher
 
cocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装からcocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装から
Yuichi Higuchi
 
TC74VCX244FT PSpice Model (Free SPICE Model)
TC74VCX244FT PSpice Model (Free SPICE Model)TC74VCX244FT PSpice Model (Free SPICE Model)
TC74VCX244FT PSpice Model (Free SPICE Model)
Tsuyoshi Horigome
 
Closures
ClosuresClosures
Closures
alexisabril
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMP
Stephen Tallamy
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdf
contact32
 
Rkf
RkfRkf

Similar to Playing with camera preview buffers on BlackBerry 10 (20)

Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
 
More than `po`: Debugging in lldb
More than `po`: Debugging in lldbMore than `po`: Debugging in lldb
More than `po`: Debugging in lldb
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscation
 
Standford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, ViewsStandford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, Views
 
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docxCOMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
COMPAPPABCA49085rFunrAP__Practical Number 9 & 10.docx
 
RC6
RC6RC6
RC6
 
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
Pic programms FOR 8TH SEM STUDENTS BY LOHITH KUMAR | 11GUEE6018
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come From
 
More Than po: Debugging in LLDB @ CocoaConf SJ 2015
More Than po: Debugging in LLDB @ CocoaConf SJ 2015More Than po: Debugging in LLDB @ CocoaConf SJ 2015
More Than po: Debugging in LLDB @ CocoaConf SJ 2015
 
Debugging TV Frame 0x02
Debugging TV Frame 0x02Debugging TV Frame 0x02
Debugging TV Frame 0x02
 
More than po: Debugging in LLDB
More than po: Debugging in LLDBMore than po: Debugging in LLDB
More than po: Debugging in LLDB
 
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей ПаньгинАварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
 
Python From Scratch (1).pdf
Python From Scratch  (1).pdfPython From Scratch  (1).pdf
Python From Scratch (1).pdf
 
Java JIT Optimization Research
Java JIT Optimization Research Java JIT Optimization Research
Java JIT Optimization Research
 
cocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装からcocos2d 事例編 HungryMasterの実装から
cocos2d 事例編 HungryMasterの実装から
 
TC74VCX244FT PSpice Model (Free SPICE Model)
TC74VCX244FT PSpice Model (Free SPICE Model)TC74VCX244FT PSpice Model (Free SPICE Model)
TC74VCX244FT PSpice Model (Free SPICE Model)
 
Closures
ClosuresClosures
Closures
 
TechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMPTechShift: There’s light beyond LAMP
TechShift: There’s light beyond LAMP
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdf
 
Rkf
RkfRkf
Rkf
 

More from Raimon Ràfols

Rendering Art on the Web - A Performance compendium
Rendering Art on the Web - A Performance compendiumRendering Art on the Web - A Performance compendium
Rendering Art on the Web - A Performance compendium
Raimon Ràfols
 
The bytecode gobbledygook
The bytecode gobbledygookThe bytecode gobbledygook
The bytecode gobbledygook
Raimon Ràfols
 
The bytecode mumbo-jumbo
The bytecode mumbo-jumboThe bytecode mumbo-jumbo
The bytecode mumbo-jumbo
Raimon Ràfols
 
The Digital Evolution of Dinosaurs - MWCS 2017
The Digital Evolution of Dinosaurs - MWCS 2017The Digital Evolution of Dinosaurs - MWCS 2017
The Digital Evolution of Dinosaurs - MWCS 2017
Raimon Ràfols
 
Android Custom Views
Android Custom ViewsAndroid Custom Views
Android Custom Views
Raimon Ràfols
 
Iterate & Learn 2017
Iterate & Learn 2017Iterate & Learn 2017
Iterate & Learn 2017
Raimon Ràfols
 
Iterate & Learn 2017 (català)
Iterate & Learn 2017 (català)Iterate & Learn 2017 (català)
Iterate & Learn 2017 (català)
Raimon Ràfols
 
The bytecode hocus pocus - JavaOne 2016
The bytecode hocus pocus - JavaOne 2016The bytecode hocus pocus - JavaOne 2016
The bytecode hocus pocus - JavaOne 2016
Raimon Ràfols
 
Iterate + learn - February 2016
Iterate + learn - February 2016Iterate + learn - February 2016
Iterate + learn - February 2016
Raimon Ràfols
 
Improving Android Performance at Mobiconf 2014
Improving Android Performance at Mobiconf 2014Improving Android Performance at Mobiconf 2014
Improving Android Performance at Mobiconf 2014
Raimon Ràfols
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
Raimon Ràfols
 
Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015
Raimon Ràfols
 

More from Raimon Ràfols (12)

Rendering Art on the Web - A Performance compendium
Rendering Art on the Web - A Performance compendiumRendering Art on the Web - A Performance compendium
Rendering Art on the Web - A Performance compendium
 
The bytecode gobbledygook
The bytecode gobbledygookThe bytecode gobbledygook
The bytecode gobbledygook
 
The bytecode mumbo-jumbo
The bytecode mumbo-jumboThe bytecode mumbo-jumbo
The bytecode mumbo-jumbo
 
The Digital Evolution of Dinosaurs - MWCS 2017
The Digital Evolution of Dinosaurs - MWCS 2017The Digital Evolution of Dinosaurs - MWCS 2017
The Digital Evolution of Dinosaurs - MWCS 2017
 
Android Custom Views
Android Custom ViewsAndroid Custom Views
Android Custom Views
 
Iterate & Learn 2017
Iterate & Learn 2017Iterate & Learn 2017
Iterate & Learn 2017
 
Iterate & Learn 2017 (català)
Iterate & Learn 2017 (català)Iterate & Learn 2017 (català)
Iterate & Learn 2017 (català)
 
The bytecode hocus pocus - JavaOne 2016
The bytecode hocus pocus - JavaOne 2016The bytecode hocus pocus - JavaOne 2016
The bytecode hocus pocus - JavaOne 2016
 
Iterate + learn - February 2016
Iterate + learn - February 2016Iterate + learn - February 2016
Iterate + learn - February 2016
 
Improving Android Performance at Mobiconf 2014
Improving Android Performance at Mobiconf 2014Improving Android Performance at Mobiconf 2014
Improving Android Performance at Mobiconf 2014
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
 
Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015
 

Playing with camera preview buffers on BlackBerry 10