diff --git a/Source/C++/Apps/Mp4Dump/Mp4Dump.cpp b/Source/C++/Apps/Mp4Dump/Mp4Dump.cpp index 3889aa07f..88f7dee85 100644 --- a/Source/C++/Apps/Mp4Dump/Mp4Dump.cpp +++ b/Source/C++/Apps/Mp4Dump/Mp4Dump.cpp @@ -34,6 +34,10 @@ #include "Ap4.h" +#ifdef __EMSCRIPTEN__ +#include "emscripten.h" +#endif + /*---------------------------------------------------------------------- | constants +---------------------------------------------------------------------*/ @@ -288,8 +292,25 @@ main(int argc, char** argv) return 1; } } else { +#ifdef __EMSCRIPTEN__ + // Emscripten has to "mount" the filesystem to a virtual directory. + EM_ASM(FS.mkdir('/working')); + EM_ASM(FS.mount(NODEFS, { root: '.' }, '/working')); + const char* const mount_name = "/working/%s"; + const int filename_size = snprintf(NULL, 0, mount_name, arg); + char* mounted_filename = (char*) malloc(filename_size + 1); + sprintf(mounted_filename, mount_name, arg); + filename = mounted_filename; +#else filename = arg; +#endif AP4_Result result = AP4_FileByteStream::Create(filename, AP4_FileByteStream::STREAM_MODE_READ, input); + +#ifdef __EMSCRIPTEN__ + free(mounted_filename); + mounted_filename = NULL; +#endif + if (AP4_FAILED(result)) { fprintf(stderr, "ERROR: cannot open input (%d)\n", result); return 1;