file seek support, new test cases, AVI use file seek

This commit is contained in:
2021-02-25 07:42:27 +01:00
parent f04742a1b0
commit c89f599112
6 changed files with 189 additions and 38 deletions

View File

@@ -45,13 +45,13 @@
//};
class Simu {
class SimuBlockDev {
uint8_t* data;
public:
Simu(const char* image) {
SimuBlockDev(const char* image) {
FILE* f = fopen(image, "rw");
if (!f) {throw std::runtime_error("failed to open");}
fseek(f, 0L, SEEK_END);
@@ -76,26 +76,96 @@ public:
};
class SimuFile {
FILE* f;
public:
SimuFile(const char* image) {
f = fopen(image, "rw");
if (!f) {throw std::runtime_error("failed to open");}
}
uint32_t curPos() const {
return ftell(f);
}
void seekTo(uint32_t pos) {
fseek(f, pos, SEEK_SET);
}
uint32_t read(uint32_t bytes, uint8_t* dst) {
return fread(dst, bytes, 1, f) * bytes;
}
uint32_t write(uint32_t bytes, const uint8_t* src) {
return fwrite(src, bytes, 1, f) * bytes;
}
};
#include <gtest/gtest.h>
//#define logInfo(fmt, ...) std::string s = fmt::format(FMT_STRING(fmt), __VA_ARGS__);
#include "/apps/ESP8266lib/data/formats/avi/Demuxer.h"
#define __LINUX__
#include "/apps/ESP8266lib/data/formats/jpeg/JPEGDEC.h"
#include "/apps/ESP8266lib/data/formats/jpeg/JPEGDEC.cpp"
//#include "/apps/ESP8266lib/data/formats/jpeg/jpeg.c"
int drawJPEG(JPEGDRAW* pDraw) {
return 1;
}
int main(int argc, char** argv) {
{
if (1==0) {
// ffmpeg -i '/mnt/ssss/anime/Toaru Majutsu no Index/[Eclipse] Toaru Majutsu no Index - 07 (1280x720 h264) [0255D83A].mkv' -r 15 -ss 30 -vf scale=480x320 -c:v mjpeg -c:a mp3 -ar 44100 /tmp/ram/1.avi
Simu simu("/tmp/ram/1.avi");
AccessHelper<Simu> ah(simu);
AVI::Demuxer demux(ah);
SimuFile simu("/tmp/ram/1.avi");
AVI::Demuxer demux(simu);
bool valid = demux.isValid();
std::cout << "valid: " << valid << std::endl;
uint8_t buf[64*1024];
std::ofstream outV("/tmp/ram/1.mjpeg");
std::ofstream outA("/tmp/ram/1.mp3");
JPEGDEC jpeg;
for (int i = 0; i < 1024; ++i) {
AVI::NextChunk nc = demux.getNextChunk();
std::cout << (int)nc.type << " : " << nc.size << std::endl;
demux.read(nc, buf);
if (nc.type == AVI::NextChunkType::VIDEO) {
outV.write((const char*)buf, nc.size);
int res = jpeg.openRAM(buf, nc.size, drawJPEG);
std::cout << "jpeg: " << res << std::endl;
if (res) {
jpeg.setPixelType(RGB565_BIG_ENDIAN);
jpeg.decode(0, 0, 0);//40, 100, JPEG_SCALE_QUARTER | JPEG_EXIF_THUMBNAIL);
jpeg.close();
}
} else if (nc.type == AVI::NextChunkType::AUDIO) {
outA.write((const char*)buf, nc.size);
}
}
return 0;
}
@@ -106,15 +176,15 @@ int main(int argc, char** argv) {
//std::string s = fmt::format(FMT_STRING("{:s}"), "I am not a number");
::testing::InitGoogleTest(&argc, argv);
::testing::GTEST_FLAG(filter) = "*TestCreate*";
::testing::GTEST_FLAG(filter) = "*TestSeek*";
return RUN_ALL_TESTS();
// diff /tmp/ram/TETRIS.GB /apps/workspace/gbemu/tests/tetris.gb
Simu simu("/tmp/ram/1.dat");
AccessHelper<Simu> ah(simu);
SimuBlockDev simu("/tmp/ram/1.dat");
AccessHelper<SimuBlockDev> ah(simu);
MBR<AccessHelper<Simu>> mbr(ah);
MBR<AccessHelper<SimuBlockDev>> mbr(ah);
if (mbr.isPresent() && mbr.isValid()) {
@@ -122,7 +192,7 @@ int main(int argc, char** argv) {
std::cout << (int) mbr.getPartition(i).getType() << " - " << mbr.getPartition(i).getFirstSector() << " - " << mbr.getPartition(i).getNumSectors() << std::endl;
}
using FAT32FS = FAT32::FS<AccessHelper<Simu>>;
using FAT32FS = FAT32::FS<AccessHelper<SimuBlockDev>>;
FAT32FS fat(ah, mbr.getPartition(0).getFirstSector() * 512);