xref: /haiku/src/add-ons/media/media-add-ons/usb_webcam/addons/uvc/UVCDeframer.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 /*
2  * Copyright 2011, Gabriel Hartmann, gabriel.hartmann@gmail.com.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "UVCDeframer.h"
8 
9 #include "CamDebug.h"
10 #include "CamDevice.h"
11 
12 #include <Autolock.h>
13 
14 
15 #define MAX_TAG_LEN CAMDEFRAMER_MAX_TAG_LEN
16 #define MAXFRAMEBUF CAMDEFRAMER_MAX_QUEUED_FRAMES
17 
18 
19 UVCDeframer::UVCDeframer(CamDevice* device)
20 	: CamDeframer(device),
21 	fFrameCount(0),
22 	fID(0)
23 {
24 }
25 
26 
27 UVCDeframer::~UVCDeframer()
28 {
29 }
30 
31 
32 ssize_t
33 UVCDeframer::Write(const void* buffer, size_t size)
34 {
35 	const uint8* buf = (const uint8*)buffer;
36 	int payloadSize = size - buf[0]; // total length - header length
37 
38 	// This packet is just a header
39 	if (size == buf[0])
40 		return 0;
41 
42 	// Allocate frame
43 	if (!fCurrentFrame) {
44 		BAutolock l(fLocker);
45 		if (fFrames.CountItems() < MAXFRAMEBUF)
46 			fCurrentFrame = AllocFrame();
47 		else {
48 			printf("Dropped %ld bytes. Too many queued frames.)\n", size);
49 			return size;
50 		}
51 	}
52 
53 	// Write payload to buffer
54 	fInputBuffer.Write(&buf[buf[0]], payloadSize);
55 
56 	// If end of frame add frame to list of frames
57 	if ((buf[1] & 2) || (buf[1] & 1) != fID) {
58 		fID = buf[1] & 1;
59 		fFrameCount++;
60 		buf = (uint8*)fInputBuffer.Buffer();
61 		fCurrentFrame->Write(buf, fInputBuffer.BufferLength());
62 		fFrames.AddItem(fCurrentFrame);
63 		release_sem(fFrameSem);
64 		fCurrentFrame = NULL;
65 	}
66 
67 	return size;
68 }
69 
70 
71 void
72 UVCDeframer::_PrintBuffer(const void* buffer, size_t size)
73 {
74 	uint8* b = (uint8*)buffer;
75 	for (size_t i = 0; i < size; i++)
76 		printf("0x%x\t", b[i]);
77 	printf("\n");
78 }
79 
80