Slide 1

Slide 1 text

Interacting with C APIs shibuya.swift #4 @nakajijapan Use GIFLIB in Swift

Slide 2

Slide 2 text

About Me

Slide 3

Slide 3 text

@nakajijapan Software Engineer GMO PEPABO inc. iOS / Web / OS X

Slide 4

Slide 4 text

NKJMultiMovieCaptureView NKJMovieComposer NKJPagerViewController PhotoSlider Teiten

Slide 5

Slide 5 text

ϋϯυϝΠυ࡞඼Λ ചΕΔɺങ͑Δɻ ࠃ಺࠷େڃͷ ϋϯυϝΠυϚʔέοτ

Slide 6

Slide 6 text

࠷ۙ

Slide 7

Slide 7 text

Teiten Teiten is an app that fixed-point observation a lot earnestly yourself by using a PC camera. http://teiten.nakajijapan.net/

Slide 8

Slide 8 text

Sengiri " Sengiri " from the screen recording until the animated GIF file , you can create as soon as a simple operation . Sengiri, in English, is the shred. http://sengiri.nakajijapan.net/

Slide 9

Slide 9 text

Stop SFDPSE Crop Record

Slide 10

Slide 10 text

Sengiri is • OS X Application • ࠷খݶͷૢ࡞ͰGIFಈըΛ࡞੒͢Δ • ࢓ࣄޮ཰Խπʔϧ • OSS (coming soon…)

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

΋͏গ͠ؤுΖ͏

Slide 13

Slide 13 text

࣌ʑɺը࣭͕ ྼԽ ͯ͠͠·͏

Slide 14

Slide 14 text

΋͏গ͠ ਂງ͍͖͍ͯͨ͠

Slide 15

Slide 15 text

ௐࠪ • FFmpeg • GIFLIB

Slide 16

Slide 16 text

FFmpeg

Slide 17

Slide 17 text

FFmpeg • ༷ʑͳencode/decodeʹରԠ • ࢓༷Λ೺Ѳ͢Δ͜ͱ͔Β • ๲େ • ίʔυྔ͕ଟ͍ •

Slide 18

Slide 18 text

GIFLIB

Slide 19

Slide 19 text

GIFLIB • GIFͷencode/decodeʹಛԽ • ࢓༷Λ೺Ѳ͠΍͍͢ • ίʔυྔ͕গͳ͍ • FFmpegΑΓ͸গͳ͍

Slide 20

Slide 20 text

But

Slide 21

Slide 21 text

C

Slide 22

Slide 22 text

Use C API in Swift

Slide 23

Slide 23 text

Talk about

Slide 24

Slide 24 text

Interacting with C APIs Use giflib in Swift

Slide 25

Slide 25 text

Premise

Slide 26

Slide 26 text

C int number = 10; int *p; *p = 100; printf("%d %x \n", *p, p); p = &number; printf("%d %x \n", *p, p);

Slide 27

Slide 27 text

C 516918f8 p number 10 516918dc p = &number;

Slide 28

Slide 28 text

C char c[] = “abcd"; char *p; p = &c; printf("*p = %c\n",*p); printf("p = %s\n", p); printf("*(p + 1) = %c\n", *(c + 1)); printf("*p + 1 = %c\n", *c + 1); printf("c[1] = %c\n", c[1]); // *p = a // p = abcd // *(p + 1) = b // *p + 1 = b // c[1] = b

Slide 29

Slide 29 text

C 516918f8 p c[] 516918dc p = &c; a b c d *(c + 1) *(c + 2) *(c + 3)

Slide 30

Slide 30 text

C API -> Swift

Slide 31

Slide 31 text

Primitive Types

Slide 32

Slide 32 text

Primitive Types or Int8 or Int or Int32

Slide 33

Slide 33 text

$ 4XJGU 1PJOUFS DPOTU5ZQF 6OTBGF1PJOUFS5ZQF 5ZQF 6OTBGF.VUBCMF1PJOUFS5ZQF WPJE 6OTBGF.VUBCMF1PJOUFS7PJE Pointer

Slide 34

Slide 34 text

C int number = 10; int *p; *p = 100; printf("%d %x \n", *p, p); p = &number; printf("%d %x \n", *p, p);

Slide 35

Slide 35 text

Swift // int *p; var p:UnsafeMutablePointer

Slide 36

Slide 36 text

Swift // int *p; var p = UnsafeMutablePointer.alloc(1) // *p = 100; p.memory = 100

Slide 37

Slide 37 text

Swift // int *p; var p = UnsafeMutablePointer.alloc(1) // *p = 100; p.memory = 100

Slide 38

Slide 38 text

Swift // int *p; var p = UnsafeMutablePointer.alloc(1) // *p = 100; p.memory = 100

Slide 39

Slide 39 text

Swift // int *p; var p = UnsafeMutablePointer.alloc(1) // *p = 100; p.memory = 100 WBSNFNPSZ.FNPSZ\HFUOPONVUBUJOHTFU^ 6OTBGF.VUBCMF1PJOUFS

Slide 40

Slide 40 text

C unsigned char c[] = “abcd"; unsigned char *p; p = &c; printf("*p = %c\n",*p); printf("p = %s\n", p); printf("*(p + 1) = %c\n", *(c + 1)); printf("*p + 1 = %c\n", *c + 1); printf("c[1] = %c\n", c[1]); // *p = a // p = abcd // *(p + 1) = b // *p + 1 = b // c[1] = b

Slide 41

Slide 41 text

Swift let p = UnsafeMutablePointer.alloc(4) or let p = UnsafeMutablePointer.alloc(4)

Slide 42

Slide 42 text

C unsigned char c[] = “abcd"; unsigned char *p; p = &c; printf("*p = %c\n",*p); printf("p = %s\n", p); printf("*(p + 1) = %c\n", *(c + 1)); printf("*p + 1 = %c\n", *c + 1); printf("c[1] = %c\n", c[1]); // *p = a // p = abcd // *(p + 1) = b // *p + 1 = b // c[1] = b

Slide 43

Slide 43 text

Swift let p = UnsafeMutablePointer.alloc(4) p.advancedBy(1).memory

Slide 44

Slide 44 text

Swift let p = UnsafeMutablePointer.alloc(4) p.advancedBy(1).memory TVCTDSJQU @J*OU .FNPSZ\HFUOPONVUBUJOHTFU^

Slide 45

Slide 45 text

Swift let p = UnsafeMutablePointer.alloc(4) p[1]

Slide 46

Slide 46 text

Swift for i in 0..<256 { colorTypes.advancedBy(i).memory.Red = pixelColorMaps.advancedBy(i).memory.red colorTypes.advancedBy(i).memory.Green = pixelColorMaps.advancedBy(i).memory.green colorTypes.advancedBy(i).memory.Blue = pixelColorMaps.advancedBy(i).memory.blue }

Slide 47

Slide 47 text

Swift for i in 0..<256 { colorTypes[i].Red = pixelColorMaps[i].red colorTypes[i].Green = pixelColorMaps[i].green colorTypes[i].Blue = pixelColorMaps[i].blue }

Slide 48

Slide 48 text

Swift unsigned char controlExtension[3] = {0x04, 0x00, 0x00, 0xff};

Slide 49

Slide 49 text

Swift let controlExtension = UnsafeMutablePointer.alloc(4) controlExtension[0] = 0x04 controlExtension[1] = 0x00 controlExtension[2] = 0x00 controlExtension[3] = 0xff

Slide 50

Slide 50 text

Type Casting

Slide 51

Slide 51 text

Type Casting UnsafeMutablePointer.self UnsafeMutablePointer.self

Slide 52

Slide 52 text

Type Casting let address = baseAddress as UnsafeMutablePointer

Slide 53

Slide 53 text

Type Casting let address = baseAddress as UnsafeMutablePointer

Slide 54

Slide 54 text

Type Casting /// Returns the bits of `x`, interpreted as having type `U`. /// /// - Warning: Breaks the guarantees of Swift's type system; use /// with extreme care. There's almost always a better way to do /// anything. /// @warn_unused_result public func unsafeBitCast(x: T, _: U.Type) -> U

Slide 55

Slide 55 text

Swift let address = CVPixelBufferGetBaseAddress(imageBuffer!) let address2 = unsafeBitCast( baseAddress, UnsafeMutablePointer.self )

Slide 56

Slide 56 text

Type Casting /// Returns the bits of `x`, interpreted as having type `U`. /// /// - Warning: Breaks the guarantees of Swift's type system; use /// with extreme care. There's almost always a better way to do /// anything. /// @warn_unused_result public func unsafeBitCast(x: T, _: U.Type) -> U

Slide 57

Slide 57 text

Memory Management

Slide 58

Slide 58 text

Memory Management • SwiftͰCͷؔ਺͕ར༻Ͱ͖Δ • ࢖͍ํ͸ಉ͡ • UnsafeMutablePointerͰಉ༷ͷϝιου͕༻ ҙ͞Ε͍ͯΔ

Slide 59

Slide 59 text

Memory Management /* ANSI-C */ public func memchr(_: UnsafePointer, _: Int32, _: Int) -> UnsafeMutablePointer public func memcmp(_: UnsafePointer, _: UnsafePointer, _: Int) -> Int32 public func memcpy(_: UnsafeMutablePointer, _: UnsafePointer, _: Int) -> UnsafeMutablePointer public func memmove(_: UnsafeMutablePointer, _: UnsafePointer, _: Int) -> UnsafeMutablePointer public func memset(_: UnsafeMutablePointer, _: Int32, _: Int) -> UnsafeMutablePointer

Slide 60

Slide 60 text

Swift let buffer = UnsafeMutablePointer.alloc( width * height * 4 ) memset(buffer, 0, width * height * 4) (…snip…) free(buffer)

Slide 61

Slide 61 text

Swift let buffer = UnsafeMutablePointer.alloc( width * height * 4 ) memset(buffer, 0, width * height * 4) (…snip…) free(buffer) buffer.destroy()

Slide 62

Slide 62 text

C APIs

Slide 63

Slide 63 text

C APIs • Swift͸C APIʹΞΫηεग़དྷΔे෼ͳ ػೳΛ࣋ͪ߹Θ͍ͤͯΔ௿ϨΠϠʔ ͳϞδϡʔϧʹ௚઀Ͱ͖Δͷศར • ϙΠϯλɺϝϞϦ؅ཧͷ஌ࣝ͸ඞਢ

Slide 64

Slide 64 text

UnsafeMutablePointer IUUQTEFWFMPQFSBQQMFDPNMJCSBSZXBUDIPTEPDVNFOUBUJPO4XJGU [email protected]@4USVDUVSFJOEFYIUNM

Slide 65

Slide 65 text

GIFLIBΛ࢖͍͍ͨ

Slide 66

Slide 66 text

• ࢓༷೺Ѳෆ଍… • ΧϥʔϚοϓ • ؔ਺

Slide 67

Slide 67 text

ࠂ஌

Slide 68

Slide 68 text

iOSDC

Slide 69

Slide 69 text

Thanks.