Skip to content

Commit

Permalink
webcam
Browse files Browse the repository at this point in the history
  • Loading branch information
sechshelme committed Aug 5, 2023
1 parent 8ebb670 commit d493d46
Show file tree
Hide file tree
Showing 8 changed files with 274 additions and 123 deletions.
81 changes: 38 additions & 43 deletions Webcam/Webcam-SDL2-master/Lazarus/project1.lpr
Original file line number Diff line number Diff line change
Expand Up @@ -11,39 +11,22 @@

const
device = '/dev/video0';
IMAGE_WIDTH = 640;
IMAGE_HEIGHT = 480;


type
TFramehandler = procedure(pframe: Pointer; len: cint);

TStreamHandle = record
fd: cint;
framehandler: TFramehandler;
end;

var
video_fildes: longint;
sH: TStreamHandle;

sdlTexture: PSDL_Texture;
sdlRenderer: PSDL_Renderer;
sdlRect: TSDL_Rect;
sdlScreen: PSDL_Window;
e: TSDL_Event;

quit: boolean = False;
fds: TFDSet;

tv: TTimeVal = (tv_sec: 1; tv_usec: 0);
buf:Tv4l2_buffer;

procedure frame_handler(pframe: Pointer; len: cint);
begin
SDL_UpdateTexture(sdlTexture, @sdlRect, pframe, IMAGE_WIDTH * 2);
SDL_RenderClear(sdlRenderer);
SDL_RenderCopy(sdlRenderer, sdlTexture, nil, @sdlRect);
SDL_RenderPresent(sdlRenderer);
end;
buf: Tv4l2_buffer;

begin
video_fildes := v4l2_open(device);
Expand All @@ -57,7 +40,7 @@ TStreamHandle = record
Halt(1);
end;

if v4l2_sfmt(video_fildes, 1448695129) = -1 then begin // ??????
if v4l2_sfmt(video_fildes, V4L2_PIX_FMT_YUYV) = -1 then begin
WriteLn('v4l2_sfmt');
Halt(1);
end;
Expand All @@ -67,7 +50,7 @@ TStreamHandle = record
Halt(1);
end;

if v4l2_sfmt(video_fildes, 30) = -1 then begin
if v4l2_sfps(video_fildes, 30) = -1 then begin
WriteLn('v4l2_sfmt()');
Halt(1);
end;
Expand All @@ -82,12 +65,9 @@ TStreamHandle = record
Halt(1);
end;

sH.fd := video_fildes;
sH.framehandler := @frame_handler;

SDL_Init(SDL_INIT_VIDEO or SDL_INIT_TIMER);

sdlScreen := SDL_CreateWindow('webcam', SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
sdlScreen := SDL_CreateWindow('webcam', SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, IMAGE_WIDTH, IMAGE_HEIGHT, SDL_WINDOW_SHOWN);
if sdlScreen = nil then begin
WriteLn('Kann SDL nicht öffnen');
end;
Expand All @@ -97,37 +77,52 @@ TStreamHandle = record
Write('Kann Renderer nicht öffnen');
end;

sdlTexture := SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, 640, 480);

sdlRect.w := 640;
sdlRect.h := 480;

// #define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer)
// #define VIDIOC_EXPBUF _IOWR('V', 16, struct v4l2_exportbuffer)
// #define VIDIOC_DQBUF _IOWR('V', 17, struct v4l2_buffer)
sdlTexture := SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, IMAGE_WIDTH, IMAGE_HEIGHT);

sdlRect.w := IMAGE_WIDTH;
sdlRect.h := IMAGE_HEIGHT;

repeat
fpFD_ZERO(fds);
fpFD_SET(video_fildes, fds);

fpSelect(video_fildes + 1, @fds, nil, nil, @tv);

buf._type:=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory:=V4L2_MEMORY_MMAP;
buf._type := V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory := V4L2_MEMORY_MMAP;
FpIOCtl(video_fildes, VIDIOC_DQBUF, @buf);

buf._type:=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory:=V4L2_MEMORY_MMAP;
buf._type := V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory := V4L2_MEMORY_MMAP;
FpIOCtl(video_fildes, VIDIOC_QBUF, @buf);

//////////////77


while SDL_PollEvent(@e) <> 0 do begin
case e.type_ of
SDL_KEYDOWN: begin
case e.key.keysym.sym of
SDLK_ESCAPE: begin
quit := True;
end;
end;
end;
SDL_QUITEV: begin
quit := True;
end;
end;
end;

SDL_UpdateTexture(sdlTexture, @sdlRect, v4l2_ubuffers[buf.index].start, IMAGE_WIDTH * 2);
// SDL_UpdateYUVTexture
SDL_RenderClear(sdlRenderer);
SDL_RenderCopy(sdlRenderer, sdlTexture, nil, @sdlRect);
SDL_RenderPresent(sdlRenderer);
until quit;

v4l2_streamoff(video_fildes);
v4l2_munmap;
v4l2_close(video_fildes);

SDL_Quit();


WriteLn('io.');
WriteLn('ende.');
end.
14 changes: 10 additions & 4 deletions Webcam/Webcam-SDL2-master/Lazarus/v4l2_driver.pas
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ interface
IMAGE_HEIGHT: longint; cvar;external;

// ---- von /usr/include/linux/videodev2.h
const
// #define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer)
// #define VIDIOC_EXPBUF _IOWR('V', 16, struct v4l2_exportbuffer)
// #define VIDIOC_DQBUF _IOWR('V', 17, struct v4l2_buffer)


VIDIOC_DQBUF = 3227014673;
VIDIOC_QBUF = 3227014671;
V4L2_PIX_FMT_YUYV = 1448695129;


const
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1;
Expand Down Expand Up @@ -111,11 +121,9 @@ Tv4l2_ubuffer = record
v4l2_ubuffers: Pv4l2_ubuffer; cvar;external;

{ functions }
(* Const before type ignored *)

function v4l2_open(device: PChar): longint; cdecl; external;
function v4l2_close(fd: longint): longint; cdecl; external;
(* Const before type ignored *)
function v4l2_querycap(fd: longint; device: PChar): longint; cdecl; external;
function v4l2_sfmt(fd: longint; pfmt: uint32): longint; cdecl; external;
function v4l2_gfmt(fd: longint): longint; cdecl; external;
Expand All @@ -124,9 +132,7 @@ function v4l2_munmap: longint; cdecl; external;
function v4l2_sfps(fd: longint; fps: longint): longint; cdecl; external;
function v4l2_streamon(fd: longint): longint; cdecl; external;
function v4l2_streamoff(fd: longint): longint; cdecl; external;
//{$endif}

implementation


end.
23 changes: 13 additions & 10 deletions Webcam/Webcam-SDL2-master/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,39 +19,40 @@ SDL_Rect sdlRect;

int video_fildes;

static void *v4l2_streaming() {
void v4l2_streaming() {
// SDL2 begins
memset(&sdlRect, 0, sizeof(sdlRect));
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)) {
printf("Could not initialize SDL - %s\n", SDL_GetError());
return NULL;
exit(1);
}

sdlScreen = SDL_CreateWindow("Simple YUV Window", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, IMAGE_WIDTH,
IMAGE_HEIGHT, SDL_WINDOW_SHOWN);

if (!sdlScreen) {
fprintf(stderr, "SDL: could not create window - exiting:%s\n",
SDL_GetError());
return NULL;
fprintf(stderr, "SDL: could not create window - exiting:%s\n", SDL_GetError());
exit(1);
}

sdlRenderer = SDL_CreateRenderer(
sdlScreen, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (sdlRenderer == NULL) {
fprintf(stderr, "SDL_CreateRenderer Error\n");
return NULL;
exit(1);
}
sdlTexture =
SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_YUY2,
SDL_TEXTUREACCESS_STREAMING, IMAGE_WIDTH, IMAGE_HEIGHT);

sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_YUY2, SDL_TEXTUREACCESS_STREAMING, IMAGE_WIDTH, IMAGE_HEIGHT);
sdlRect.w = IMAGE_WIDTH;
sdlRect.h = IMAGE_HEIGHT;

fd_set fds;
struct v4l2_buffer buf;

printf("VIDIOC_DQBUF: %lu\n", VIDIOC_DQBUF);
printf("VIDIOC_QBUF: %lu\n", VIDIOC_QBUF);

while (1) {
FD_ZERO(&fds);
FD_SET(video_fildes, &fds);
Expand Down Expand Up @@ -92,7 +93,9 @@ int main(int argc, char const *argv[]) {
goto exit_;
}

printf("----- %d\n", V4L2_PIX_FMT_YUYV);
printf("V4L2_PIX_FMT_YUYV: %d\n", V4L2_PIX_FMT_YUYV);
printf("width : %d\n", IMAGE_WIDTH);
printf("height : %d\n", IMAGE_HEIGHT);

// most of devices support YUYV422 packed.
if (v4l2_sfmt(video_fildes, V4L2_PIX_FMT_YUYV) == -1) {
Expand Down
Binary file modified Webcam/Webcam-SDL2-master/src/simple_cam
Binary file not shown.
66 changes: 0 additions & 66 deletions codeblocks/Texturen/main.c

This file was deleted.

Loading

0 comments on commit d493d46

Please sign in to comment.