chromium/ash/webui/camera_app_ui/resources/js/lib/ffmpeg.patch

diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 18e768b386..359936744d 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -19,6 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <emscripten.h>
+
 #include <string.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -95,7 +97,7 @@ void exit_program(int ret)
     if (program_exit)
         program_exit(ret);
 
-    exit(ret);
+    emscripten_force_exit(ret);
 }
 
 double parse_number_or_die(const char *context, const char *numstr, int type,
diff --git a/lib.js b/lib.js
new file mode 100644
index 0000000000..b7f8092dbf
--- /dev/null
+++ b/lib.js
@@ -0,0 +1,8 @@
+mergeInto(LibraryManager.library, {
+  // Returns 0 if the processing is canceled.
+  wait_readable: function() {
+    return Asyncify.handleSleep(function(wakeUp) {
+      Module["waitReadable"](wakeUp);
+    });
+  }
+});
\ No newline at end of file
diff --git a/libavformat/file.c b/libavformat/file.c
index 98c9e81bcb..a7ec30252d 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -19,6 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <emscripten.h>
+
 #include "config_components.h"
 
 #include "libavutil/avstring.h"
@@ -108,11 +110,17 @@ static const AVClass pipe_class = {
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
+extern int wait_readable(void);
+
 static int file_read(URLContext *h, unsigned char *buf, int size)
 {
     FileContext *c = h->priv_data;
     int ret;
     size = FFMIN(size, c->blocksize);
+    if (wait_readable() == 0) {
+        // Quit ffmpeg if the processing is canceled.
+        emscripten_force_exit(0);
+    }
     ret = read(c->fd, buf, size);
     if (ret == 0 && c->follow)
         return AVERROR(EAGAIN);
@@ -395,6 +403,10 @@ static int pipe_open(URLContext *h, const char *filename, int flags)
 #endif
     c->fd = fd;
     h->is_streamed = 1;
+
+    // increase the packet size since file operations in WASM is emulated in
+    // JavaScript, and the context switching is expensive.
+    h->max_packet_size = 256 << 10;
     return 0;
 }
 
diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c
index 17649bc077..38b5d80f90 100644
--- a/libavformat/rawdec.c
+++ b/libavformat/rawdec.c
@@ -86,6 +86,8 @@ int ff_raw_video_read_header(AVFormatContext *s)
 
     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
     st->codecpar->codec_id = s->iformat->raw_codec_id;
+    st->codecpar->width  = s1->width;
+    st->codecpar->height = s1->height;
     sti->need_parsing = AVSTREAM_PARSE_FULL_RAW;
 
     sti->avctx->framerate = s1->framerate;
@@ -124,6 +126,7 @@ static int raw_data_read_header(AVFormatContext *s)
 static const AVOption rawvideo_options[] = {
     { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC},
     { "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC},
+    { "video_size", "set frame size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, DEC },
     { NULL },
 };
 #undef OFFSET
diff --git a/libavformat/rawdec.h b/libavformat/rawdec.h
index f843fe5a2e..152663145e 100644
--- a/libavformat/rawdec.h
+++ b/libavformat/rawdec.h
@@ -31,6 +31,7 @@ typedef struct FFRawVideoDemuxerContext {
     char *video_size;         /**< String describing video size, set by a private option. */
     char *pixel_format;       /**< Set by a private option. */
     AVRational framerate;     /**< AVRational describing framerate, set by a private option. */
+    int width, height;        /**< Integers describing video size, set by a private option. */
 } FFRawVideoDemuxerContext;
 
 typedef struct FFRawDemuxerContext {