Webcam Code Overview
Defined in webcam.h
struct references the picture that gets streamed
| struct webcam_buffer
| unsigned char *ptr
|| This is a pointer to the jpeg encodes images which is being streamed as the next mjpeg frame
| int ref
|| Need to find out
| long size
|| Size of the jpeg image
struct contains the info related to ONE connected client. It is used as part of a chain that points to the next and previous client. Each camera thread has a webcam struct member in the global cnt
structure. Ie. the syntax is often
| struct webcam
| int socket
|| the socket on which the webcam listens for incoming clients
| FILE *fwrite
|| a file handle linked to the outbound socket
| struct webcam_buffer *tmpbuffer
|| See sbove struct
References the picture that gets streamed
| long filepos
|| Position in the buffer
| int nr
|| Number of the client connected
| unsigned long int last
|| Timestamp of last sent frame
| struct webcam *prev
|| Pointer to previous client in chain. If none it is NULL
| struct webcam *next
|| Pointer to next client in chain. If none it is NULL
int webcam_init(struct context *cnt)
Is run from motion.c during the long init of the motion_loop before it enters the main loop. The following happens.
- cnt->webcam.socket gets assigned to the incoming socket handle given by http_bindsock()
- setup socket handle (socket)
- link socket to localhost or any interface (as given by config)
- bind socket
- listen to socket (wait for incoming requests from clients)
- Return handle to socket
- cnt->webcam.next and cnt->webcam.prev gets assigned to NULL indicating that there is only one struct in the chain and no clients connected.
- Return the socket. motion_loop uses this only to check that all went well.
- event_stop_webcam() is called when motion_loop terminates and calls event(EVENT_STOP...)
- webcam_stop() is called if webcam port is not 0 = disabled
- cnt->webcam.next is the entry point to the chain of clients and the function now runs through each webcam struct in the chain (each client)
- if there is a picture buffer it is freed
- Any open outbound file handle (linked to socket) is closed
- The client socket is closed.
- The client struct in the chain is freed
The webcam loop
The webcam loop is a subloop of the motion_loop.
The starting point of the webcam subloop is the function webcam_put
int webcam_put(struct context *cnt, unsigned char *image)
The motion_loop initiates the webcam_put according to these rules.
- In setup mode the webcam_put is called each time a new frame is grabbed from camera. It is the special setup mode which is fed to the webcam_put.
- In normal mode Motion always calls webcam_put once per second.
- If the config option webcam_motion is on motion detected frames (which is not already sent from previous rule) are sent to the webcam_put.
- If the config option webcam_motion is not on all grabbed images are sent to webcam_put.
The following section explains what happens in the webcam_put loop.
Topic not finished. I take a little at a time
- Check to see if we have reached the maximum number of allowed clients per camera.
- If OK to add more we
- Call http_acceptsock() to check for clients and get create a socket for him. Note that we only add one new client for each picture frame. http_acceptsock() returns a socket handle that we can use to send data to the client.
- Call webcam_add_client() to create the webcam struct for the new client and add it to the chain of webcam structs.
- cnt->stream_count in incremented. This variable keeps track of how many clients are connected to the webcam stream.
- We now call webcam_flush() the first time.
- webcam_check_write runs though the chain until it finds a tmpbuffer pointer which is NULL. If it finds a webcam struct with no tmpbuffer then ...
- webcam_tmpbuffer() is called which initializes and mallocs the tmpbuffer. The size reserved for the image is the YUV420P, or greyscale given picture size (H x W x 1.5 or H x W). The returned value is a pointer to the tmpbuffer struct and gets assigned to the tmpbuffer
- put_picture_memory() function is called which converts the current image to a jpeg frame. The size if this frame is returned and assigned to tmpbuffer->size. &tmpbuffer->ptr points to the jpeg image.
- \r\n is appended to the buffer and its size increased by 2 bytes.
- webcam_add_write() is called
- 12 Jul 2005