adding files

main
Steffen Pohle 2 months ago
parent 13448b19c0
commit 07e4e01c94

@ -11,14 +11,22 @@ DEFAULT_SERVERPORT=20010
CXX=g++ CXX=g++
CXXFLAGS= -ggdb -fPIC -Wall -std=c++11 -I/usr/local/include CXXFLAGS= -ggdb -fPIC -Wall -std=c++11 -I/usr/local/include
LDFLAGS= -lUDPTCPNetwork -L/usr/local/lib -ljpeg LDFLAGS= -lUDPTCPNetwork -L/usr/local/lib -ljpeg -larchive
OBJFILES= webserver.o configuration.o main.o inmemoryfile.o \ OBJFILES= webserver.o configuration.o main.o inmemoryfile.o inmemorytar.o \
convert.o debayer.o videoframe.o \ convert.o debayer.o videoframe.o \
video.o videodevice_v4l2.o videodevice_dump.o video.o videodevice_v4l2.o videodevice_dump.o
all: dep miniwebcam all: dep miniwebcam
miniwebcam: $(OBJFILES) assets.obj:
$(CXX) $(OBJFILES) -o $@ -L./ -I./ $(LDFLAGS) tar cvf assets.tar www/*
# objcopy -I binary assets.tar assets.obj
objcopy -I binary -O elf64-littleaarch64 -B aarch64 assets.tar assets.obj
# objcopy -I binary -O elf64-x86-64 -B i386:x86-64 assets.tar assets.obj
rm -rf assets.tar
miniwebcam: $(OBJFILES) assets.obj
$(CXX) $(OBJFILES) -o $@ assets.obj -L./ -I./ $(LDFLAGS)
rm -rf assets.obj
install: miniwebcam install: miniwebcam
cp -rf miniwebcam $(PREFIX)/bin cp -rf miniwebcam $(PREFIX)/bin
@ -50,6 +58,8 @@ keygen:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ssl-key.pem -out ssl-cert.pem openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout ssl-key.pem -out ssl-cert.pem
clean: clean:
rm *.obj -rf
rm *.tar -rf
rm *.s -rf rm *.s -rf
rm *.o -rf rm *.o -rf
rm *.oo -rf rm *.oo -rf

@ -4,6 +4,7 @@
#include "inmemoryfile.h" #include "inmemoryfile.h"
InMemoryFile::InMemoryFile() { InMemoryFile::InMemoryFile() {
filename = "";
mem = malloc (INMEMORYFILE_ALLOCATEBLOCK); mem = malloc (INMEMORYFILE_ALLOCATEBLOCK);
memallocsize = INMEMORYFILE_ALLOCATEBLOCK; memallocsize = INMEMORYFILE_ALLOCATEBLOCK;
memsize = 0; memsize = 0;
@ -11,6 +12,7 @@ InMemoryFile::InMemoryFile() {
InMemoryFile::~InMemoryFile() { InMemoryFile::~InMemoryFile() {
if (mem != NULL) free (mem); if (mem != NULL) free (mem);
filename = "";
mem = NULL; mem = NULL;
memallocsize = 0; memallocsize = 0;
memsize = 0; memsize = 0;
@ -41,6 +43,7 @@ InMemoryFile InMemoryFile::operator=(InMemoryFile rightside) {
exit (1); exit (1);
} }
memcpy (mem, rightside.mem, memsize); memcpy (mem, rightside.mem, memsize);
filename = rightside.filename;
return *this; return *this;
}; };

@ -9,6 +9,7 @@ class InMemoryFile {
public: public:
void *mem; void *mem;
size_t memsize; size_t memsize;
std::string filename;
InMemoryFile operator=(InMemoryFile rightside); InMemoryFile operator=(InMemoryFile rightside);

@ -0,0 +1,60 @@
#include "miniwebcam.h"
#include "inmemorytar.h"
#include "inmemoryfile.h"
InMemoryTar::InMemoryTar() {
struct archive *a;
struct archive_entry *entry;
size_t tar_size = _binary_assets_tar_end - _binary_assets_tar_start;
int r;
debug ("");
a = archive_read_new();
archive_read_support_format_tar(a);
if (a == NULL) ErrorExit("error on archive new", -1);
r = archive_read_open_memory(a, _binary_assets_tar_start, tar_size);
if (r != ARCHIVE_OK) ErrorExit("bindary asset could not been found in memory", -1);
while (archive_read_next_header(a, &entry) == ARCHIVE_OK) {
debug ("found file %s\n", archive_entry_pathname(entry));
InMemoryFile *imf = new InMemoryFile();
size_t size = archive_entry_size(entry);
imf->filename = archive_entry_pathname(entry);
imf->Allocate(size);
archive_read_data(a, imf->mem, size);
files.push_back(imf);
}
archive_read_free(a);
};
InMemoryTar::~InMemoryTar() {
std::list<InMemoryFile*>::iterator f;
f = files.begin();
while (f != files.end()) {
InMemoryFile *imf = *f;
delete imf;
f = files.begin();
}
};
/// @brief
/// @param file
/// @param imf - do not free the pointer!!!!
/// @return
int InMemoryTar::FindFile(std::string file, InMemoryFile **imf) {
std::list<InMemoryFile*>::iterator f;
for (f = files.begin(); f != files.end(); f++) {
if (file.compare ((*f)->filename) == 0) {
*imf = *f;
return 1;
}
}
return 0;
}

@ -0,0 +1,31 @@
#ifndef _INMEMORYTAR_H_
#define _INMEMORYTAR_H_
#include <string>
#include <list>
#include <stdio.h>
#include <archive.h>
#include <archive_entry.h>
#include "inmemoryfile.h"
// Symbole vom Linker/objcopy
extern unsigned char _binary_assets_tar_start[];
extern unsigned char _binary_assets_tar_end[];
/*
* this class will always read the assets_tar structure
*/
class InMemoryTar {
private:
std::list<InMemoryFile*> files;
protected:
public:
InMemoryTar();
~InMemoryTar();
int FindFile(std::string file, InMemoryFile **imf);
};
#endif

@ -3,25 +3,21 @@
#include "miniwebcam.h" #include "miniwebcam.h"
#include "UDPTCPNetwork.h" #include "UDPTCPNetwork.h"
#include "inmemorytar.h"
std::string GenerateHtmlFile(); std::string GenerateHtmlFile();
InMemoryFile GenerateJpgFile(VideoFrame *vf); InMemoryFile GenerateJpgFile(VideoFrame *vf);
InMemoryTar assets;
int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClient *webclient) { int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClient *webclient) {
if (requestbuffer == NULL || webclient == NULL) return 0; if (requestbuffer == NULL || webclient == NULL) return 0;
std::string request = requestbuffer->GetRequest(); std::string request = requestbuffer->GetRequest();
printf ("SimpleWebServerClient::HandleRequest() Request:%s\n", request.c_str());
if (request.compare ("/") == 0) request = "/index.html"; if (request.compare ("/") == 0) request = "/index.html";
if (request.find("/index.html") != std::string::npos) { InMemoryFile *imf_do_not_free = NULL;
std::string htmlfile = GenerateHtmlFile(); if (request.find("/snapshot.jpg") != std::string::npos) {
if (webclient->SendResponseFileFromMemory(requestbuffer, request, "",
(void*) htmlfile.c_str(),
strlen(htmlfile.c_str())) != 1) return 0;
}
else if (request.find("/snapshot.jpg") != std::string::npos) {
InMemoryFile jpgfile; InMemoryFile jpgfile;
Lock(); Lock();
currentimage.ConvertToJpeg(&jpgfile, 99); currentimage.ConvertToJpeg(&jpgfile, 99);
@ -39,6 +35,18 @@ int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClien
(void*) jpgfile.mem, (void*) jpgfile.mem,
jpgfile.memsize) != 1) return 0; jpgfile.memsize) != 1) return 0;
} }
else if (assets.FindFile("www"+request, &imf_do_not_free)) {
if (imf_do_not_free == NULL) return 0;
if (webclient->SendResponseFileFromMemory(requestbuffer, request, "",
(void*) imf_do_not_free->mem,
imf_do_not_free->memsize) != 1) return 0;
}
else if (request.find("/index.html") != std::string::npos) {
std::string htmlfile = GenerateHtmlFile();
if (webclient->SendResponseFileFromMemory(requestbuffer, request, "",
(void*) htmlfile.c_str(),
strlen(htmlfile.c_str())) != 1) return 0;
}
else { else {
return 0; return 0;
} }
@ -50,23 +58,7 @@ int WebCamServer::HandleRequest (WebRequestBuffer *requestbuffer, WebServerClien
std::string GenerateHtmlFile() { std::string GenerateHtmlFile() {
std::string res; std::string res;
res = "<html><head><title>MiniWebCam</title></head><body>"; res = "<html><head><title>MiniWebCam</title></head><body>ERROR";
res += "<img id=\"myimage1\" src=\"snapshot.jpg\"></img><br>";
res += "<img id=\"myimage2\" src=\"snapshot-float.jpg\"></img>";
res += "<script>\n";
res += " function reloadImage() {\n";
res += " const img1 = document.getElementById('myimage1');\n";
res += " let src1 = img1.src.split('?')[0];\n";
res += " src1 = src1 + '?' + new Date().getTime();\n";
res += " img1.src = src1;\n";
res += " const img2 = document.getElementById('myimage2');\n";
res += " let src2 = img2.src.split('?')[0];\n";
res += " src2 = src2 + '?' + new Date().getTime();\n";
res += " img2.src = src2;\n";
res += "}\n\n";
res += "setInterval(reloadImage, "+to_string(config.web_imagerefresh)+");\n";
res += "\n\n";
res += "</script>\n";
res += "</body></html>"; res += "</body></html>";
return res; return res;
}; };

@ -0,0 +1,28 @@
<html>
<head>
<title>MiniWebCam</title>
</head>
<body>
<img id="myimage1" src="snapshot.jpg"></img>
<br>
<img id="myimage2" src="snapshot-float.jpg"></img>
</body>
<script>
function reloadImage() {
const img1 = document.getElementById('myimage1');
let src1 = img1.src.split('?')[0];
src1 = src1 + '?' + new Date().getTime();
img1.src = src1;
const img2 = document.getElementById('myimage2');
let src2 = img2.src.split('?')[0];
src2 = src2 + '?' + new Date().getTime();
img2.src = src2;
}
setInterval(reloadImage, 250);
</script>
</html>
Loading…
Cancel
Save