Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1862 → Rev 1863

/programs/media/webcam/trunk/webcam.asm
0,0 → 1,3076
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 64 bit Menuet Webcam
;
; Compile with FASM 1.60 or above
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
data1 equ image_end+0x100000*1 ; Timestamp data
data3 equ image_end+0x100000*2 ; Image data
data4 equ image_end+0x100000*10 ; Image data time order
data5 equ image_end+0x100000*11 ; Length data time order
data6 equ image_end+0x100000*12 ; Decoded image
data8 equ 0x100000*16 ; 7M*4 - Data return, 4k aligned
data9 equ 0x100000*52 ; 1M*4 - Data length return
data10 equ 0x100000*56 ; Save snap / avi - size 16M
 
scx equ 3 ; Scroll x pos
rby equ (220 shl 32+21) ; Ydim
b3y equ 0 ; B3y add
bys equ 21 ; Buttons y add
scl equ 0 ; Scroll length
 
use32
 
org 0x0
 
db 'MENUET64' ; Header identifier
dq 0x01 ; Version
dq START ; Start of code
dq image_end ; Size of image
dq data10+0x100000*16 ; Memory for app
dq image_end ; Stack
dq 0x00 ; Prm
dq 0x00 ; Icon
 
 
turn_camera_on:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Reserves, configures and turns camera on
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
cmp [camera_state],byte 1
je camera_on
 
; Camera present ?
 
mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx
cmp rax , 0
je camera_fail
 
; Configuration found ?
 
cmp [sconf],dword 0
je camera_fail
 
; Set configuration
 
mov rax , 128
mov rbx , 3
mov rcx , 1
mov rdx , [sconf]
int 0x60
 
; Start camera
 
mov rax , 128
mov rbx , 4
mov rcx , 1
mov rdx , 1
int 0x60
 
mov [camera_state],byte 1
 
camera_fail:
camera_on:
 
ret
 
 
turn_camera_off:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Turns camera off and clears the reservation
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
cmp [camera_state],byte 0
je camera_off
 
; Camera present ?
 
mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx
cmp rax , 0
je camera_off
 
; Stop camera
 
mov rax , 128
mov rbx , 4
mov rcx , 1
mov rdx , 0
int 0x60
 
; Set configuration 0
 
mov rax , 128
mov rbx , 3
mov rcx , 1
mov rdx , 0
int 0x60
 
camera_off:
 
mov [camera_state],byte 0
 
ret
 
 
 
server:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Server thread for webcam picture - port 8090
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov [serveronoff],byte 1
 
mov [datasent],dword 0
 
server_open:
 
; Open port
 
mov rax , 53
mov rbx , 5
mov rcx , 8090
mov rdx , 0
mov rsi , 0
mov rdi , 0 ; Passive mode
int 0x60
 
mov [server_socket],eax
 
mov r15 , 100*30
 
server_loop:
 
; Close server port and re-open every 30 seconds
 
dec r15
jz timeoutclose
 
;
 
mov rax , 5
mov rbx , 1
int 0x60
 
cmp [serveronoff],byte 2
je serveroff
 
; Server status ?
 
mov rax , 53
mov rbx , 6
mov rcx , [server_socket]
int 0x60
 
cmp rax , 4
jne server_loop
 
; Wait 0.50 seconds
 
mov rax , 5
mov rbx , 50
int 0x60
 
mov [picsend],byte 0
 
; Read all data
 
read_server_data:
 
mov rax , 53
mov rbx , 3
mov rcx , [server_socket]
int 0x60
 
shl r8 , 8
mov r8b , bl
 
mov r9 , 'pmb.egam'
cmp r8 , r9
jne nopicsend2
mov [picsend],byte 1
nopicsend2:
 
cmp rax , 0
jne read_server_data
 
; Wait 0.05 seconds
 
mov rax , 5
mov rbx , 5
int 0x60
 
; Send index htm file
 
cmp [picsend],byte 0
jne noindexsend
 
mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , h_i_len-html_header_index
mov rsi , html_header_index
int 0x60
 
jmp nopicsend
 
noindexsend:
 
; form picture to data10+
 
mov rax , [resx]
mov [sizex],rax
mov rax , [resy]
mov [sizey],rax
call form_picture
 
; send picture - html header
 
mov rax , '00230454' ; 320
cmp [resx],dword 160
jne nor160
mov rax , '00057654' ; 160
nor160:
cmp [resx],dword 640
jne nor640
mov rax , '00921654' ; 640
nor640:
mov [hsz],rax
 
mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , h_len-html_header
mov rsi , html_header
int 0x60
 
mov rax , 105
mov rbx , 100
int 0x60
 
; send picture - bmp header
 
mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , 54
mov rsi , data10
int 0x60
 
; send picture - bmp data
 
mov rsi , data10+54
 
mov r15 , 99999
call server_stats
mov r15 , 0
 
newdatasend:
 
mov rax , 53
mov rbx , 6
mov rcx , [server_socket]
int 0x60
cmp rax , 4
jne timeoutclose
 
mov rax , 53
mov rbx , 7
mov rcx , [server_socket]
mov rdx , 160*3
int 0x60
 
mov rax , 105
mov rbx , 3
int 0x60
 
; If camera is off, display the stats
 
call server_stats ; In:r15
 
add rsi , 160*3
 
mov [datasent],rsi
sub [datasent],dword data10+54
 
mov rbx , [resx_resy_3]
add rbx , data10+54
 
cmp rsi , rbx
jb newdatasend
 
timeoutclose:
nopicsend:
 
mov rax , 5
mov rbx , 5
int 0x60
 
; close port
 
mov rax , 53
mov rbx , 8
mov rcx , [server_socket]
int 0x60
 
mov [datasent],dword 0
 
mov r15 , 99999
call server_stats
 
; mov rax , 5
; mov rbx , 50
; int 0x60
 
jmp server_open
 
serveroff:
 
; Close port
 
mov rax , 53
mov rbx , 8
mov rcx , [server_socket]
int 0x60
 
mov [serveronoff],byte 3
 
mov rax , 512
int 0x60
 
 
server_stats:
;
; In: r15 - counter
;
cmp [camera_state],byte 1
je nodfps
inc r15
cmp r15 , 75
jb nodfps
mov [show_fps],byte 1
mov r15 , 0
nodfps:
 
ret
 
 
 
START:
 
mov rax , 141
mov rbx , 1
mov rcx , 1
mov rdx , 5 shl 32 + 5
mov r8 , 9 shl 32 + 12
int 0x60
 
; 320x240 as default
 
mov r12, 010b
call scan_for_configuration
mov [sconf],r12
 
call grey_default
 
; Draw window
 
call draw_window
 
still:
 
mov rax , 123 ; Check for event
mov rbx , 1
int 0x60
 
test rax , 0x1 ; Window redraw
jnz window_event
test rax , 0x2 ; Keyboard press
jnz key_event
test rax , 0x4 ; Button press
jnz button_event
 
call check_camera_state
 
call read_data
 
cmp [show_fps],byte 1
jne nosfps
call display_frames_per_second
mov [show_fps],byte 0
nosfps:
 
jmp still
 
 
window_event:
 
call draw_window
jmp still
 
key_event:
 
mov rax , 0x2 ; Read the key and ignore
int 0x60
 
jmp still
 
button_event:
 
mov rax , 0x11
int 0x60
 
; rax = status
; rbx = button id
 
cmp rbx , 0x10000001
jne no_application_terminate_button
call turn_camera_off
mov rax , 0x200
int 0x60
no_application_terminate_button:
 
cmp rbx , 0x102
jb no_stats
cmp rbx , 0x103
ja no_stats
sub rbx , 0x102
mov [sta1+1],byte ' '
mov [sta2+1],byte ' '
imul rbx , 14
mov [sta1+1+rbx],byte '>'
call fps_background
call display_frames_per_second
jmp still
no_stats:
 
cmp rbx , 0x109
jne no_application_terminate_menu
call turn_camera_off
mov rax , 0x200
int 0x60
no_application_terminate_menu:
 
cmp rbx , 0x105
jb no_effect
cmp rbx , 0x107
ja no_effect
sub rbx , 0x105
mov [eo+1],byte ' '
mov [eb+1],byte ' '
mov [en+1],byte ' '
imul ebx , 12
mov [eo+1+rbx],byte '>'
jmp still
no_effect:
 
cmp rbx , 121
jb nomodechange
cmp rbx , 123
ja nomodechange
 
; Turn camera off
 
push rbx
call turn_camera_off
pop rbx
 
; Turn server off
 
push rax rbx
cmp [serveronoff],byte 1
jne noserveron2
mov [serveronoff],byte 2
mov rax , 5
mov rbx , 20
int 0x60
call server_button
noserveron2:
pop rbx rax
 
;
 
cmp rbx , 123 ; 640 & 800
jne screenresxfine
call get_data_boot_info
cmp [data_boot_info+4*8],dword 800
jae screenresxfine
mov rax , 4
mov rbx , string_screen_req
mov rcx , 15+5
mov rdx , 49+5
mov rsi , 0xffffff
mov r9 , 1
int 0x60
mov rax , 5
mov rbx , 200
int 0x60
call display_image_yuv
jmp still
screenresxfine:
 
mov r11 , [xpos]
 
sub rbx , 121
 
mov r8 , [xr+rbx*8]
mov r9 , [yr+rbx*8]
mov r10, [xp+rbx*8]
 
mov r12, [cb+rbx*8]
call scan_for_configuration
 
cmp r8 , [resx] ; already selected
je still
 
mov [resx],r8
mov [resy],r9
mov [xpos],r10
mov [sconf],r12
 
imul r8 , r9
mov r9 , r8
add r8 , r9
mov [resx_resy_2],r8
add r8 , r9
mov [resx_resy_3],r8
add r8 , r9
mov [resx_resy_4],r8
 
cmp r11 , [xpos] ; redraw needed
jne redraw
mov rax , 13
mov rbx , 15 shl 32 + 320
mov rcx , 49 shl 32 + 240
mov rdx , 0xffffff
int 0x60
call display_image_yuv
mov [camera_connection_status],dword 2
call check_camera_state
jmp still
redraw:
 
mov rax , 67
mov rbx , -1
mov rcx , -1
 
mov rdx , [resx]
cmp rdx , 320
jae rdxfine
mov rdx , 320
rdxfine:
mov r8 , [resy]
cmp r8 , 240
jae r8fine
mov r8 , 240
r8fine:
add rdx , 160
add r8 , 70
 
cmp r11 , [xpos]
jae noupleft
mov rbx , 0
mov rcx , 0
mov r8 , 561 ; 640x480 picture
noupleft:
 
int 0x60
 
jmp still
 
scan_for_configuration:
 
mov rdx , 1
 
newconftest:
 
mov rax , 128
mov rbx , 2
mov rcx , 1
int 0x60
shr rbx , 16
and rbx , 0xff
cmp rbx , r12
je cfound
 
inc rdx
cmp rdx , 3
jbe newconftest
 
mov r12 , 0 ; conf not found
ret
 
cfound:
 
mov r12 , rdx ; conf found
ret
 
nomodechange:
 
cmp rbx , 101
jne no_on
call turn_camera_on
jmp still
no_on:
 
cmp rbx , 102
jne no_off
mov [record_state],byte 0
cmp [serveronoff],byte 1
jne noserveron
mov [serveronoff],byte 2
mov rax , 5
mov rbx , 20
int 0x60
noserveron:
call turn_camera_off
call display_image_yuv
call server_button
jmp still
no_off:
 
cmp rbx , 103
jne no_snap
call save_snap
jmp still
no_snap:
 
cmp rbx , 104
jne no_clip
cmp [camera_state], byte 1
jne still
cmp [resx],dword 320
je resolutionfine
mov rax , 4
mov rbx , string_resolution_320
mov rcx , 15+5
mov rdx , 49+5
mov rsi , 0xffffff
mov r9 , 1
int 0x60
mov rax , 5
mov rbx , 100
int 0x60
call display_image_yuv
jmp still
resolutionfine:
mov [record_state],byte 1
mov [record_position], dword data10+1208
mov rax , data10+(avi_end-avi_start)
mov [record_position],rax
jmp still
no_clip:
 
cmp rbx , 105
jne no_server
cmp [serveronoff],byte 3
je startserver
mov [serveronoff],byte 2
waitmore:
mov rax , 5
mov rbx , 10
int 0x60
call read_data
cmp [serveronoff],byte 2
je waitmore
call server_button
jmp still
startserver:
; Start server thread
mov rax , 51
mov rbx , 1
mov rcx , server
mov rdx , server_stack
int 0x60
mov rax , 5
mov rbx , 10
int 0x60
call server_button
jmp still
no_server:
 
 
cmp rbx , 10000
jb noscroll1
cmp rbx , 11000
ja noscroll1
mov [scroll_value_1],rbx
call draw_scroll_1
call draw_scroll_values
jmp still
noscroll1:
 
cmp rbx , 20000
jb noscroll2
cmp rbx , 21000
ja noscroll2
mov [scroll_value_2],rbx
call draw_scroll_2
call draw_scroll_values
jmp still
noscroll2:
 
cmp rbx , 30000
jb noscroll3
cmp rbx , 31000
ja noscroll3
mov [scroll_value_3],rbx
call draw_scroll_3
call draw_scroll_values
jmp still
noscroll3:
 
jmp still
 
 
 
grey_default:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Grey default picture
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rdi , data6
mov rcx , [resx]
imul rcx , [resy]
imul rcx , 4
mov rax , 0xe0
cld
rep stosb
 
ret
 
 
get_data_boot_info:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Screen resolution
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push rax rbx rcx rdx
mov rax , 26
mov rbx , 3
mov rcx , data_boot_info
mov rdx , 8*20
int 0x60
pop rdx rcx rbx rax
 
ret
 
 
 
check_camera_state:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays text message if camera is disconnected
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 128
mov rbx , 1
int 0x60
add rax , rbx
 
cmp rax , [camera_connection_status]
je no_camera_change
 
mov [camera_connection_status],rax
 
push rax
call grey_default
call display_image_yuv
pop rax
 
cmp rax , 0
jne camera_connected
 
mov rax , 4
mov rbx , string_camera_disconnected
mov rcx , 114
mov rdx , 162
mov rcx , [resx]
shr rcx , 1
add rcx , 15
sub rcx , 62
mov rdx , [resy]
shr rdx , 1
add rdx , 43
mov rsi , 0xb8b8b8
mov r9 , 1
int 0x60
 
camera_connected:
 
no_camera_change:
 
ret
 
 
 
fps_delay:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Waits for next time to read from device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
fps_wait:
 
mov rax , 11
int 0x60
cmp rax , 0
jne fps_wait_event
 
mov rax , 105
mov rbx , 1
int 0x60
 
mov rax , 26
mov rbx , 1
mov rcx , fps_data
mov rdx , 1024
int 0x60
 
call check_framerate
 
mov rax , [fps_data+384]
 
cmp [thread_running],byte 0
jne yes_fps_wait
mov [fps_add],dword 34 ; assume 30fps
jmp no_fps_wait
yes_fps_wait:
 
cmp rax , [fps_next]
jb fps_wait
 
no_fps_wait:
 
add rax , [fps_add]
mov [fps_next],rax
 
no_fps_add:
 
fps_wait_event:
 
ret
 
 
 
check_framerate:
 
; Display FPS and adjust display rate delay
 
mov rax , [fps_data+384]
cmp rax , [fps_n]
jb nofps
add rax , 1000
mov [fps_n],rax
;
cmp [frames_per_second],dword 5
jae nofrpsz
mov [frames_per_second],dword 5
nofrpsz:
cmp [frames_per_second],dword 30
jbe nofrpst
mov [frames_per_second],dword 30
nofrpst:
call display_frames_per_second
mov rax , 1000
xor rdx , rdx
mov rbx , [frames_per_second]
div rbx
;
cmp rax , [fps_add]
jae nofaster
inc dword [fastercount]
cmp [fastercount],dword 2
jb nofasterset
mov [frames_per_second],dword 30
mov rax , 1000/30
nofaster:
mov [fastercount],dword 0
nofasterset:
;
mov [fps_add],rax
mov [frames_per_second],dword 0
mov [frames_per_second_missed],dword 0
nofps:
 
ret
 
 
 
display_frames_per_second:
 
cmp [sta2+1],byte '>'
jne nodispstats
 
fpsy equ 24
 
call fps_background
;
mov rax , 47
mov rbx , 6 * 65536
mov rcx , [datasent]
mov rdx , [fpsx]
add rdx , 2+6*5
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
;
mov rax , 47
mov rbx , 2 * 65536
mov rcx , [frames_per_second]
sub rcx , [frames_per_second_missed]
mov rdx , [fpsx]
add rdx , 2+6*16
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
mov rax , 47
mov rbx , 2 * 65536
mov rcx , [frames_per_second]
mov rdx , (fpsx+2+19*6) shl 32 + fpsy+4
mov rdx , [fpsx]
add rdx , 2+19*6
shl rdx , 32
add rdx , fpsy+4
mov rsi , 0xb0b0b0
int 0x60
mov rax , 0x4
mov rbx , string_fps
mov rcx , [fpsx]
add rcx , 2
mov rdx , fpsy+4
mov rsi , 0xb0b0b0
mov r9 , 1
int 0x60
 
nodispstats:
 
ret
 
fps_background:
 
mov rax , [xpos]
sub rax , 8
mov [fpsx],rax
 
mov rax , 13
mov rbx , [fpsx]
sub rbx , 3
shl rbx , 32
add rbx , 22*6+5
mov rcx , fpsy shl 32 + 14
mov rdx , 0xe8e8e8
int 0x60
 
ret
 
 
 
 
read_block:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Starts the read thread
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
cmp [thread_running],byte 0
jne nostartthread
 
; Start thread
 
mov [thread_running],byte 1
 
mov rax , 51
mov rbx , 1
mov rcx , read_thread
mov rdx , thread_stack
int 0x60
 
mov rax , 5
mov rbx , 20
int 0x60
 
nostartthread:
 
ret
 
read_thread:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Read data block in a separate thread.
; Doesn't block main process.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
newth:
 
inc dword [threadpos]
and dword [threadpos],dword 3
 
mov rax , 128
mov rbx , 5
mov rcx , 1
 
mov rdx , [threadpos]
imul rdx , 0x100000*7
add rdx , data8
 
mov r8 , [threadpos]
imul r8 , 0x100000
add r8 , data9
 
mov r9 , 256
 
int 0x60
 
cmp [camera_state],byte 1
je newth
 
mov [thread_running],byte 0
 
mov rax , 512
int 0x60
 
 
 
 
read_data:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Reads and analyzes data blocks from device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;
; Camera enabled ?
;
 
cmp [camera_state],byte 1
je continue_read
ret
continue_read:
 
;
; Start thread
;
 
call read_block
 
mov rcx , [threadposprev]
waitforread:
mov rax , 105
mov rbx , 1
int 0x60
cmp rcx , [threadpos]
je waitforread
 
mov rcx , [threadpos]
mov [threadposprev],rcx
 
mov rdx , [threadpos]
dec rdx
and rdx , 0x3
imul rdx , 0x100000*7
add rdx , data8
 
mov r8 , [threadpos]
dec r8
and r8 , 0x3
 
imul r8 , 0x100000
add r8 , data9
 
mov [pdata82],rdx ; data - 1024*3 4k aligned
mov [pdata92],r8 ; length - qword
 
;
; Analyze
;
 
;
; Arrange data to data1+ for faster cache access
;
 
mov rsi , [pdata82]
mov rdi , data1
newarr:
xor rax , rax
mov al , [rsi]
xor rbx , rbx
mov ebx , [rsi+rax-6]
mov [rdi],rbx
add rsi , 1024*3
add rdi , 8
cmp rdi , data1+8*256*8
jbe newarr
 
;
; Timestamp order
;
 
mov r12 , data4 ; data position
mov r10 , data5 ; length position
 
newdataorder2:
 
; Search for lowest timestamp count
 
mov rax , 0xfffffffff ; timestamp
 
mov r11 , data1
mov r15 , data1 + 8*256*8
 
lowsearch2:
 
; Timestamp position
 
cmp [r11+7],byte 1 ; used ?
je nolowfound2
cmp eax , [r11] ; smaller ?
jb nolowfound2
 
mov r14 , r11 ; save position
mov eax , [r11] ; save packet num
 
nolowfound2:
 
add r11 , 8
 
cmp r11 , r15
jbe lowsearch2
 
mov r13 , 0xfffffffff
cmp rax , r13
jae dataintimeorder2
 
mov rdx , r14
sub rdx , data1
 
mov rbx , rdx
add rbx , [pdata92]
mov [r10],rbx ; save length position to line
add r10 , 8
 
imul rdx , 1024*3/8
add rdx , [pdata82]
mov [r12], rdx ; save data position to line
add r12 , 8
 
mov [r14+7],byte 1
 
jmp newdataorder2
 
dataintimeorder2:
 
markdone:
 
; Mark end of list
 
mov [r12+00],dword 0xfffffff
mov [r12+08],dword 0xfffffff
mov [r12+16],dword 0xfffffff
mov [r12+24],dword 0xfffffff
 
;
; Display frames in sent data
;
 
mov r12 , data4
call display_frame_yuv
call record_picture
 
mov r15 , 0
yesnewframe:
push r15
mov r12 , [framebegin]
add r12 , 8
call display_frame_yuv
call record_picture
pop r15
inc r15
cmp r15 , 50
ja nonewframes
cmp rsi , 0
je yesnewframe
nonewframes:
 
inc dword [frames_per_second]
inc dword [frames_per_second_missed]
 
ret
 
 
 
display_number:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays scroll values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push rax rbx rcx rdx rsi
 
push rcx rdx
mov rax , 13
mov rbx , rdx
sub rbx , 2
mov rcx , rdx
sub rcx , 2
mov bx , 6*3
shl rcx , 32
add rcx , 11
mov rdx , 0xffffff
int 0x60
pop rdx rcx
 
mov rax , 47
mov rbx , 3 * 65536 + 0*256
mov rsi , 0x000000
int 0x60
 
pop rsi rdx rcx rbx rax
 
ret
 
 
get_frame_size:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Counts the number of bytes in frame
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 0
 
mov r12 , [framebegin]
 
mov rsi , [r12]
 
cmp rsi , 0xfffffff
jae cfrl2
 
; rsi = data area
 
mov rcx , [rsi+1]
and rcx , 1
 
mov r10 , r12
add r10 , data5
sub r10 , data4
mov r10 , [r10]
 
; r10 = data count area
 
movzx rax , word [r10]
and rax , 0xfff
 
movzx rbx , byte [rsi]
and rbx , 0x7f
sub rax , rbx
 
cfrl1:
 
add r12 , 8
 
mov rsi , [r12]
cmp rsi , 0xfffffff
jae cfrl2
 
; rsi = data area
 
mov rdx , [rsi+1]
and rdx , 1
 
; last block found -> exit
 
cmp rcx , rdx
jne cfrl2
 
mov r10 , r12
add r10 , data5
sub r10 , data4
mov r10 , [r10]
 
; r10 = data count area
 
movzx rbx , word [r10]
and rbx , 0xfff
 
movzx r8 , byte [rsi]
and r8 , 0x7f
 
cmp rbx , r8
jbe cfrl1
 
add rax , rbx
sub rax , r8
 
jmp cfrl1
 
cfrl2:
 
ret
 
 
 
separate_data:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Separates picture data from received packets
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov r14 , [framebegin]
 
mov rdi , data3
 
testnewline:
 
mov r10 , [r14] ; data content position
 
mov rsi , r14
add rsi , data5
sub rsi , data4
mov rsi , [rsi] ; data length position
 
cmp [r14], dword 0xfffffff
je nothisdata
cmp r14 , data4 + 8*256*8
jae nothisdata
 
mov rcx , [rsi]
and rcx , 0xfff
 
movzx rdx , byte [r10]
and rdx , 0x7f
 
cmp rcx , rdx
jbe nothisc
 
mov rsi , r10
add rsi , rdx
 
sub rcx , rdx
and rcx , 4096-1
 
cld
rep movsb
 
mov rcx , [resx_resy_2]
add rcx , data3
 
cmp rdi , rcx
ja nothisdata
 
nothisc:
 
add r14 , 8
 
jmp testnewline
 
nothisdata:
 
ret
 
 
 
display_frame_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays wanted frame at data from video device
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;
; Search for beginning of frame
;
 
mov [framebegin],dword data4
 
jmp frbl32
 
newframesearch2:
 
mov rsi , [r12]
 
cmp rsi , 0xfffffff
jae frbl312
 
mov rcx , [rsi+1]
and rcx , 1
 
frbl12:
 
add r12 , 8
mov rsi , [r12]
 
cmp rsi , 0xfffffff
jae frbl312
 
mov rdx , [rsi+1]
and rdx , 1
 
cmp rdx , rcx
je frbl12
 
frbl32:
 
mov [framebegin],r12
 
;
; Check framesize
;
 
call get_frame_size
cmp rax , [resx_resy_2]
je framesizefine
 
; If framesize if not acceptable, search for next frame
 
mov r12 , [framebegin]
add r12 , 8
jmp newframesearch2
 
framesizefine:
 
jmp displayframe
 
;
 
frbl312:
 
mov rsi , 1 ; no more frames
ret
 
displayframe:
 
mov r12 , [framebegin]
mov [found_frame],r12
 
;
 
call separate_data
 
;
; Form picture YUV -> RGB
;
 
mov rsi , data3
 
mov rdi , data6
mov r15 , [resx_resy_4]
add r15 , data6
 
npixell1:
 
; Effect: none
 
cmp [eo+1],byte '>'
jne noeffectoff
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
mov [rdi+0],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
mov [rdi+4],edx
jmp pixelsdone
noeffectoff:
 
; Effect: Blur
 
cmp [eb+1],byte '>'
jne noeffectblur
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
shr edx , 1
and edx , 0x7f7f7f
shr dword [rdi],byte 1
and dword [rdi],dword 0x7f7f7f
add [rdi],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
shr edx , 1
and edx , 0x7f7f7f
shr dword [rdi+4],byte 1
and dword [rdi+4],dword 0x7f7f7f
add [rdi+4],edx
jmp pixelsdone
noeffectblur:
 
; Effect: Negative
 
cmp [en+1],byte '>'
jne noeffectnegative
movzx r8 , byte [rsi]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
not edx
mov [rdi+0],edx
movzx r8 , byte [rsi+2]
movzx r9 , byte [rsi+1]
movzx r10 , byte [rsi+3]
call calculate_yuv
not edx
mov [rdi+4],edx
jmp pixelsdone
noeffectnegative:
 
pixelsdone:
 
add rdi , 8
 
add rsi , 4
 
cmp rdi , r15
jbe npixell1
 
call fps_delay
 
call display_image_yuv
 
display_exit:
 
inc dword [frames_per_second]
 
mov rsi , 0
ret
 
 
 
 
display_image_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Displays image
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 7
mov rbx , 15 shl 32
mov rcx , (49) shl 32
add rbx , [resx]
add rcx , [resy]
mov rdx , data6
mov r8 , 0
mov r9 , 0x1000000
mov r10 , 4
int 0x60
 
ret
 
 
calculate_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Calculates RGB from YUV
;
; In: r8,r9,r10 - YUV
;
; Out: rdx - RGB
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push rbx rcx r11
 
mov rcx , r8
sub rcx , 16 ; ?!
mov rdx , r9
sub rdx , 128
mov r8 , r10
sub r8 , 128
 
; For all components
 
imul rcx , 298
 
;
 
mov r9 , 0 ; limit low
mov r10 , 255 ; limit high
 
; Red
 
push rcx r8
 
imul r8 , 409
 
add rcx , r8
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_1_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
cmovae rcx , r9
cmp rcx , r10
cmova rcx , r10
 
mov r11 , rcx
 
pop r8 rcx
 
; Green
 
push rcx rdx
 
imul rdx , 100
imul r8 , 208
 
sub rcx , rdx
sub rcx , r8
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_2_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
cmovae rcx , r9
cmp rcx , r10
cmova rcx , r10
 
shl r11 , 8
mov r11b , cl
 
pop rdx rcx
 
; Blue
 
imul rdx , 516
 
add rcx , rdx
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_3_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
cmovae rcx , r9
cmp rcx , r10
cmova rcx , r10
 
shl r11 , 8
mov r11b , cl
 
mov rdx , r11
 
pop r11 rcx rbx
 
ret
 
 
 
acalculate_yuv:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; YUV to RGB
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push rax rbx rcx r8
 
mov rcx , r8
sub rcx , 16
mov rdx , r9
sub rdx , 128
mov r8 , r10
sub r8 , 128
 
; Red
 
push rcx rdx r8
 
imul rcx , 298
imul r8 , 409
 
add rcx , r8
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_1_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
jb norcxzero1
mov rcx , 0
norcxzero1:
cmp rcx , 255
jbe rcxfine
mov rcx , 255
rcxfine:
mov [red],cl
 
pop r8 rdx rcx
 
; Green
 
push rcx rdx r8
 
imul rcx , 298
imul rdx , 100
imul r8 , 208
 
sub rcx , rdx
sub rcx , r8
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_2_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
jb norcxzero2
mov rcx , 0
norcxzero2:
cmp rcx , 255
jbe rcxfine2
mov rcx , 255
rcxfine2:
mov [green],cl
 
pop r8 rdx rcx
 
; Blue
 
push rcx rdx r8
 
imul rcx , 298
imul rdx , 516
add rcx , rdx
add rcx , 128
shr rcx , 8
 
imul rcx , [scroll_value_3_multiply]
shr rcx , 7
 
cmp rcx , 0xfffffff
jb norcxzero3
mov rcx , 0
norcxzero3:
cmp rcx , 255
jbe rcxfine3
mov rcx , 255
rcxfine3:
mov [blue],cl
 
pop r8 rdx rcx
 
;
 
mov rdx , [red]
shl rdx , 8
add rdx , [green]
shl rdx , 8
add rdx , [blue]
 
pop r8 rcx rbx rax
 
ret
 
 
form_picture:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Forms BMP picture to data10+
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Header
 
mov rsi , bmpheader
mov rdi , data10
mov rcx , 54
cld
rep movsb
 
mov rax , [sizex]
mov [data10+0x12],eax
 
mov rbx , [sizey]
mov [data10+0x16],ebx
 
; Picture data
 
mov rdi , data10+54
mov rsi , [sizex]
imul rsi , [sizey]
imul rsi , 4
add rsi , data6
mov rcx , 0
newpicdata:
 
sub rsi , [sizex]
sub rsi , [sizex]
sub rsi , [sizex]
sub rsi , [sizex]
 
push rcx rsi
mov rcx , [sizex]
datamovel1:
mov eax , [rsi]
mov [rdi],eax
add rsi , 4
add rdi , 3
loop datamovel1
pop rsi rcx
 
inc rcx
cmp rcx , [sizey]
jb newpicdata
 
ret
 
 
save_snap:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Saves BMP snap
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push qword [camera_state]
 
mov rax , 5
mov rbx , 10
int 0x60
 
call turn_camera_off
 
; Saving BMP text
 
mov rbx , textsaving2
call display_text
 
mov rax , [resx]
mov [sizex],rax
mov rax , [resy]
mov [sizey],rax
 
; Form picture to data10+
 
call form_picture
 
; Snap count
 
mov rax , [snapcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [filesave+12],dl
mov [filesave+11],al
add [filesave+11],word '00'
 
; Delete file if persent
 
mov rax , 58
mov rbx , 2
mov r9 , filesave
int 0x60
 
; Save file
 
mov rax , 58
mov rbx , 1
mov rcx , 0
mov rdx , [sizex]
imul rdx , [sizey]
imul rdx , 3
add rdx , 54
mov r8 , data10
mov r9 , filesave
int 0x60
 
; Increase snap counter
 
inc dword [snapcount]
 
; Draw button
 
call draw_snap_button
 
; Draw image
 
call display_image_yuv
 
pop rax
cmp rax , 1
jne noturnbackon
mov rax , 5
mov rbx , 10
int 0x60
call turn_camera_on
noturnbackon:
 
ret
 
 
display_text:
 
mov rax , 0x4
mov rcx , 20
mov rdx , 54
mov rsi , 0xffffff
mov r9 , 0x1
int 0x60
 
ret
 
 
 
record_picture:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Records picture for AVI
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
cmp [record_state],byte 1
jne recl2
 
; 10 fps
 
mov rbx , textrec
call display_text
 
mov rax , 26
mov rbx , 1
mov rcx , fps_data
mov rdx , 1024
int 0x60
mov rax , [fps_data+384]
cmp rax , [record_next]
jb recl2
add rax , 100
mov [record_next],rax
 
; All recorded ?
 
mov rax , [resx_resy_4]
add rax , 4*2
imul rax , 50
add rax , data10+(avi_end-avi_start)
 
cmp [record_position], rax
jb recfine
mov [record_state],byte 0
 
call display_image_yuv
 
; Saving text
 
mov rbx , textsaving
call display_text
 
call save_clip
 
call display_image_yuv
 
ret
recfine:
 
call display_image_yuv
 
mov rax , [record_position]
sub rax , data10
xor rdx , rdx
mov rbx , [resx_resy_4]
imul rbx , 10
div rbx
add rax , 48+1
mov [textrec+5],al
 
mov rbx , textrec
call display_text
 
mov rdi , [record_position]
mov [rdi], dword '00db'
 
mov rsi, [resx_resy_4]
 
mov [rdi+4], esi
 
add rdi , 8
mov rsi , data6
add rsi , [resx_resy_4]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
recl1:
 
push rsi rdi
mov rcx , [resx]
shl rcx , 2
cld
rep movsb
pop rdi rsi
 
add rdi , [resx]
add rdi , [resx]
add rdi , [resx]
add rdi , [resx]
 
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
sub rsi , [resx]
 
cmp rsi , data6
jae recl1
 
mov rsi , [resx_resy_4]
add rsi , 8
 
add [record_position],esi
 
recl2:
 
ret
 
 
save_clip:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Saves AVI clip
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push qword [camera_state]
 
mov rax , 5
mov rbx , 10
int 0x60
 
call turn_camera_off
 
; Header
 
mov rsi , avi_start
mov rdi , data10
mov rcx , avi_end-avi_start
cld
rep movsb
 
; idx1
 
mov rsi , idx1_start
mov rdi , data10 + (avi_end-avi_start) + ((4*2+320*240*4)*50)
mov rcx , idx1_end-idx1_start
cld
rep movsb
 
; Filecount
 
mov rax , [clipcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [filesaveavi+12],dl
mov [filesaveavi+11],al
add [filesaveavi+11],word '00'
 
; Delete file if persent
 
mov rax , 58
mov rbx , 2
mov r9 , filesaveavi
int 0x60
 
; Save file
 
mov rax , 58
mov rbx , 1
mov rcx , 0
mov rdx , (avi_end-avi_start)+(4*2+320*240*4)*50+(idx1_end-idx1_start)
mov r8 , data10
mov r9 , filesaveavi
int 0x60
 
; Increase snap counter
 
inc dword [clipcount]
 
; Draw button
 
call draw_clip_button
 
pop rax
cmp rax , 1
jne noturnbackonavi
mov rax , 5
mov rbx , 10
int 0x60
call turn_camera_on
noturnbackonavi:
 
ret
 
 
 
draw_window:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws window
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 0xC ; Beginning of window draw
mov rbx , 0x1
int 0x60
 
; Draw window
 
mov rax , 0x0
mov rbx , 150 shl 32 + 480
mov rcx , 80 shl 32 + 310
mov rdx , 0x0000000000FFFFFF
mov r8 , 0x0000000000000001
mov r9 , window_label
mov r10 , menu_struct
int 0x60
 
; Start camera button
 
mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (247+21-21) shl 32 + 21
mov rdx , 101
mov r8 , 0
mov r9 , string_start_camera
int 0x60
 
; Stop camera button
 
mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (247+21+21-21) shl 32 + 21
mov rdx , 102
mov r8 , 0
mov r9 , string_stop_camera
int 0x60
 
; Server button
 
call server_button
 
; Snap picture button
 
call draw_snap_button
 
; Clip button
 
call draw_clip_button
 
; Resolution buttons
 
call resolution_buttons
 
; Display image
 
call display_image_yuv
 
; Display text
 
mov rax , 0x4
mov rbx , text
mov rcx , [xpos]
add rcx , 4+scx-6
mov rdx , 132
mov rsi , 0x0
mov r9 , 0x1
newline:
int 0x60
add rbx , 0x1F
add rdx , 13-2
cmp [rbx],byte 'x'
jne newline
 
; Scrolls
 
call draw_scroll_1
call draw_scroll_2
call draw_scroll_3
call draw_scroll_values
 
; Camera status
 
mov [camera_connection_status],dword 2
call check_camera_state
 
; FPS
 
call display_frames_per_second
 
mov rax , 0xC
mov rbx , 0x2
int 0x60
 
ret
 
 
server_button:
 
; Server button
 
mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (173-20+4+b3y) shl 32 + bys
mov rdx , 105
mov r8 , 0
mov r9 , string_server_off
cmp [serveronoff],byte 3
je serverl1
mov r9 , string_server_on
serverl1:
int 0x60
 
ret
 
 
resolution_buttons:
 
; Resolution buttons
 
mov rax , 8
mov rbx , [xpos] ; shl 32 + 116/3+1
shl rbx , 32
add rbx , 116/3+1
mov rcx , rby ; 236-20-2) shl 32 + bys
mov rdx , 121
mov r8 , 0
mov r9 , string_res_160
int 0x60
 
mov rax , 8
mov rbx , [xpos]
add rbx , 116/3+1
shl rbx , 32
add rbx , 116/3
mov rcx , rby ; (236-20-2) shl 32 + bys
mov rdx , 122
mov r8 , 0
mov r9 , string_res_320
int 0x60
 
mov rax , 8
mov rbx , [xpos]
add rbx , 116/3*2+1
shl rbx , 32
add rbx , 116/3+1
mov rcx , rby ; (236-20-2) shl 32 + bys
mov rdx , 123
mov r8 , 0
mov r9 , string_res_640
int 0x60
 
ret
 
 
draw_snap_button:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws snap button
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Snap count
 
mov rax , [snapcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [string_snap_save+12],dl
mov [string_snap_save+11],al
add [string_snap_save+11],word '00'
 
; Save snap button
 
mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (194-18+2+b3y) shl 32 + bys
mov rdx , 103
mov r8 , 0
mov r9 , string_snap_save
int 0x60
 
ret
 
 
draw_clip_button:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws video clip button
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Clip count
 
mov rax , [clipcount]
xor rdx , rdx
mov rbx , 10
div rbx
mov [string_clip_save+12],dl
mov [string_clip_save+11],al
add [string_clip_save+11],word '00'
 
; Save clip button
 
mov rax , 8
mov rbx , [xpos]
shl rbx , 32
add rbx , 116
mov rcx , (215-16+b3y) shl 32 + bys
mov rdx , 104
mov r8 , 0
mov r9 , string_clip_save
int 0x60
 
ret
 
 
draw_scroll_values:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Draws scroll RGB values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rbx , [scroll_value_1]
sub rbx , 10000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_1_multiply], r8
mov rdx , [xpos]
add rdx , 4+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number
 
mov rbx , [scroll_value_2]
sub rbx , 20000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_2_multiply], r8
mov rdx , [xpos]
add rdx , 4+7*6+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number
 
mov rbx , [scroll_value_3]
sub rbx , 30000
mov rcx , 200
sub rcx , rbx
call get_multiplier
mov [scroll_value_3_multiply], r8
mov rdx , [xpos]
add rdx , 4+14*6+scx
shl rdx , 32
add rdx , 140-14+6+scl
call display_number
 
ret
 
 
get_multiplier:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Multiplier for colour values
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
push rax rbx rcx rdx
 
shl rcx , 7
mov rax , rcx
xor rdx , rdx
mov rbx , 100
div rbx
mov r8 , rax
 
pop rdx rcx rbx rax
 
ret
 
 
draw_scroll_1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 113
mov rbx , 1
mov rcx , 10000
mov rdx , 201
mov r8 ,[scroll_value_1]
mov r9 , [xpos]
add r9 , 7+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60
 
ret
 
 
draw_scroll_2:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 2
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 113
mov rbx , 1
mov rcx , 20000
mov rdx , 201
mov r8 ,[scroll_value_2]
mov r9 , [xpos]
add r9 , 7+7*6+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60
 
ret
 
 
draw_scroll_3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Scroll 3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov rax , 113
mov rbx , 1
mov rcx , 30000
mov rdx , 201
mov r8 ,[scroll_value_3]
mov r9 , [xpos]
add r9 , 7+14*6+scx
mov r10 , 50
mov r11 , 80-12+6+scl
int 0x60
 
ret
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Data area
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
scroll_value_1: dq 10100
scroll_value_2: dq 20100
scroll_value_3: dq 30100
 
scroll_value_1_multiply: dq 10100
scroll_value_2_multiply: dq 20100
scroll_value_3_multiply: dq 30100
 
text:
 
db ' xxx% xxx% xxx% ',0
db ' Red Green Blue ',0
db 'x'
 
string_res_160: db '160',0
string_res_320: db '320',0
string_res_640: db '640',0
 
picsend: dq 0x0
show_fps: dq 0x0
fastercount: dq 0x0
 
string_start_camera: db 'START',0
string_stop_camera: db 'STOP',0
string_snap_save: db '/USB/1/SNAPXX.BMP',0
string_clip_save: db '/USB/1/CLIPXX.AVI',0
 
string_server_off: db 'SERVER: OFF',0
string_server_on: db 'PORT 8090 OPEN',0
string_resolution_320: db '320x240 required.',0
string_fps: db 'Sent: FPS: / ',0
string_screen_req: db '800x600 screen resolution required.',0
 
 
string_camera_disconnected:
 
db 'Camera disconnected.',0
 
read_wait: dq 0x0
 
pdata82: dq data8
pdata92: dq data9
 
scanstart: dq 0x0
threadpos: dq 0x0
fps_n: dq 0x0
 
threadposprev: dq 0x0
frames_per_second: dq 0x0
 
fpsx: dq 0x0
record_next: dq 0x0
 
camera_connection_status: dq 0x2
frames_per_second_missed: dq 0x0
 
xr: dq 160,320,640
yr: dq 120,240,480
xp: dq 346,346,666
cb: dq 001b,010b,100b
 
serveronoff: dq 3 ; 1=on-2=closing-3=closed
 
server_socket: dq 0x0
 
resx: dq 320
resy: dq 240
xpos: dq 346
 
resx_resy_2: dq 320*240*2
resx_resy_3: dq 320*240*3
resx_resy_4: dq 320*240*4
 
sconf: dq 0x0
sizex: dq 0x0
sizey: dq 0x0
 
filesaveavi: db '/usb/1/clipxx.avi',0
record_state: dq 0x0
clipcount: dq 0x0
filesave: db '/usb/1/snapxx.bmp',0
snapcount: dq 0x0
 
textrec: db 'REC (1/5s)',0
textsaving: db 'Saving AVI-file, which might take a minute...',0
textsaving2: db 'Saving BMP-file...',0
 
record_position: dq data10 + 1208
 
red: dq 0x0
green: dq 0x0
blue: dq 0x0
 
framebegin: dq 0x0
found_frame: dq 0x0
 
framestart: dq 0x0
framenumber: dq 0x0
timedifference: dq 0x0
headerstart: dq 0x0
next_update: dq 0x0
thread_running: dq 0x0
read_position: dq 0x0
 
pre_read_block: dq 0x1
analyze_block: dq 0x0
analyze_block_position: dq 0x0
 
readon: dq 0x1
camera_state: dq 0x0
 
tsc_base: dq 0x0
fps_next: dq 0x0
fps_add: dq 34 ; 30fps
tsc_next: dq 0x0
 
color: dq 0x0
ypos: dq 0x0
maxcount: dq 0x0
framec: dq 0x0
datapos: dq 0x0
savecount: dq 0x0
 
framecount: dq 0x0
currentframe: dq 0x0
bytesperframe: dq 0x0
jpgheaders: dq 0x0
jpgheadersmem: dq 0x0
bytesperframejpg: dq 0x0
bytespersecond: dq 0x0
framesinsample: dq 0x0
 
data_amount: dq 0x0
data_valid: dq 0x0
data_pre: dq 0x0
data_unavailable: dq 0x0
datasent: dq 0x0
 
window_label:
 
db 'WEBCAM',0 ; Window label
 
menu_struct: ; Menu Struct
 
dq 0 ; Version
 
dq 0x100 ; Start value of ID to return ( ID + Line )
; Returned when menu closes and
; user made no selections.
 
db 0,'SETUP',0
 
sta1: db 1,'> Stats Off ',0
sta2: db 1,' Stats On ',0
 
db 1,'-',0
 
eo: db 1,'> Normal ',0
eb: db 1,' Blur ',0
en: db 1,' Negative',0
 
db 1,'-',0
 
db 1,'Quit',0
 
db 255 ; End of Menu Struct
 
 
html_header_index:
 
db 'HTTP/1.1 200 OK',13,10
db 'Server: Menuet',13,10
db 'Connection: close',13,10
db 'Content-Length: 47',13,10
db 'Content-Type: text/html',13,10
db 13,10
db '<html><body><img src=image.bmp></body></html>',13,10
 
h_i_len:
 
 
 
html_header:
 
db 'HTTP/1.1 200 OK',13,10
db 'Server: Menuet',13,10
db 'Connection: close',13,10
db 'Content-Length: '
hsz: db '00230454'
db 13,10
db 'Content-Type: image/bmp',13,10,13,10
 
h_len:
 
 
bmpheader:
 
db 66
db 77
db 54
db 12
db 0
db 0
db 0
db 0
db 0
db 0
db 54
db 0
db 0
db 0
db 40
db 0
db 0
db 0
db 32 ; x
db 0
db 0
db 0
db 32 ; y
db 0
db 0
db 0
db 1
db 0
db 24
db 0
db 0
db 0
db 0
db 0
db 0
db 12
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
 
numframes equ 50
 
avi_start:
 
db 'RIFF'
dd 15361432-8
 
db 'AVI '
 
db 'LIST'
dd l4_end-l4
l4:
db 'hdrl'
dd 'avih'
dd 0x38
dd 100000 ; microseconds between frames
dd 0x320000 ; maxbytespersec
dd 0x200 ; paddinggranularity
dd 0x810 ; flags
dd numframes ; total frames
dd 0x00 ; zero for non-interleaved
dd 0x01 ; number of streams
dd 330*240*4 ; suggested buffer size
dd 320 ; image size x
dd 240 ; image size y
dd 0,0,0,0
 
db 'LIST'
dd l6_end-l6
l6:
db 'strl'
db 'strh'
dd 0x38
db 'vids'
db 'DIB ' ; handler
dd 0x0 ; flags
dd 0x0 ; priority and language
dd 0x0 ; initial frames
dd 01000000 ; scale
dd 10000000 ; rate
dd 0x0 ; start
dd numframes ; number of frames
dd 320*240*4 ; 0x4b008 ; suggested buffer size
dd 0x0 ; quality
dd 4 ; sample size
dd 0x0 ; rect struct
dd 0x0
 
db 'strf'
dd 0x28 ; length
dd 0x28 ; length II
dd 320 ; width
dd 240 ; height
dd 0x200001 ; planes and bitcount
dd 0x0 ; compression
dd 320*240*4 ; image size
dd 0x0 ; xpelspermeter
dd 0x0 ; ypelspermeter
dd 0x0 ; clrused
dd 0x0 ; clrimportant
 
l4_end:
l6_end:
 
db 'LIST'
dd 4+(2*4+320*240*4)*50
l5:
db 'movi'
 
avi_end:
 
idx1_start:
 
db 'idx1'
dd indx12-indx11
indx11:
db '00db'
dd 16
dd 0x4+(320*240*4+8)*0
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*1
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*2
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*3
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*4
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*5
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*6
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*7
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*8
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*9
dd 320*240*4
 
db '00db'
dd 16
dd 0x4+(320*240*4+8)*10
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*11
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*12
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*13
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*14
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*15
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*16
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*17
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*18
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*19
dd 320*240*4
 
db '00db'
dd 16
dd 0x4+(320*240*4+8)*20
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*21
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*22
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*23
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*24
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*25
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*26
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*27
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*28
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*29
dd 320*240*4
 
db '00db'
dd 16
dd 0x4+(320*240*4+8)*30
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*31
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*32
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*33
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*34
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*35
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*36
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*37
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*38
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*39
dd 320*240*4
 
db '00db'
dd 16
dd 0x4+(320*240*4+8)*40
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*41
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*42
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*43
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*44
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*45
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*46
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*47
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*48
dd 320*240*4
db '00db'
dd 16
dd 0x4+(320*240*4+8)*49
dd 320*240*4
 
indx12:
 
idx1_end:
 
 
data_boot_info: times 8*30 db ?
 
 
fps_data:
 
times 2048 db ?
 
;
 
times 1024 db ? ; Stack server
 
server_stack:
 
times 1024 db ? ; Stack read
 
thread_stack:
 
times 1024 db ? ; Stack main
 
image_end:
 
 
 
 
 
 
 
 
/programs/media/webcam/trunk
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/media/webcam
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property