wasm-av1.patch 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. diff --git a/Makefile b/Makefile
  2. index c39fff6..4682d43 100644
  3. --- a/Makefile
  4. +++ b/Makefile
  5. @@ -59,11 +59,13 @@ $(TARGET): $(DEPS) blob-api.c yuv-to-rgb.c $(EMLIBAV1)
  6. ]" \
  7. blob-api.c yuv-to-rgb.c $(SRCS) $(INC) -L $(LIBDIR) -l$(LIB)
  8. -$(TESTTARGET): test.c $(DEPS) $(X86LIBAV1)
  9. - cc -o $@ -O3 test.c $(SRCS) $(INC) -L $(X86LIBDIR) -l$(LIB)
  10. +$(TESTTARGET): test.c $(DEPS) $(EMLIBAV1)
  11. + emcc -o $@.wasm -O3 test.c $(SRCS) $(INC) -L $(LIBDIR) -l$(LIB) \
  12. + -s TOTAL_MEMORY=104857600 -s ERROR_ON_UNDEFINED_SYMBOLS=0
  13. -$(TESTTARGET)g: test.c $(DEPS) $(X86LIBAV1)
  14. - cc -o $@ -g test.c $(SRCS) $(INC) -L $(X86LIBDIR) -l$(LIB)
  15. +$(TESTTARGET)g: test.c $(DEPS) $(EMLIBAV1)
  16. + emcc -o $@.wasm -g test.c $(SRCS) $(INC) -L $(LIBDIR) -l$(LIB) \
  17. + -s TOTAL_MEMORY=104857600 -s ERROR_ON_UNDEFINED_SYMBOLS=0
  18. clean:
  19. -rm $(TARGET) $(TESTTARGET) $(TESTTARGET)g
  20. @@ -80,7 +82,7 @@ $(EMLIBAV1): $(LIBDIR)
  21. -DCONFIG_RUNTIME_CPU_DETECT=0 \
  22. -DCONFIG_UNIT_TESTS=0 \
  23. -DCONFIG_WEBM_IO=0 \
  24. - -DCMAKE_TOOLCHAIN_FILE=`../../get-emcmake.sh`; \
  25. + -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake; \
  26. make \
  27. )
  28. diff --git a/test.c b/test.c
  29. index df2d44b..cb270de 100644
  30. --- a/test.c
  31. +++ b/test.c
  32. @@ -18,6 +18,9 @@
  33. #include "decode-av1-priv.h"
  34. +size_t
  35. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  36. +
  37. static void
  38. dump_raw_frame(AVX_Video_Frame *avf, int id) {
  39. FILE *f;
  40. @@ -26,12 +29,13 @@ dump_raw_frame(AVX_Video_Frame *avf, int id) {
  41. void *buf;
  42. sprintf(name, "frame%04d.yuv", id);
  43. + printf("writing %s ..\n", name);
  44. if ((f = fopen(name, "wb")) == NULL) {
  45. return;
  46. }
  47. buf = AVX_Video_Frame_get_buffer(avf);
  48. size = AVX_Video_Frame_get_size(avf);
  49. - fwrite(buf, size, 1, f);
  50. + emcc_fwrite(buf, size, 1, f);
  51. fclose(f);
  52. }
  53. @@ -63,9 +67,12 @@ main(int argc, char *argv[]) {
  54. static int i = 0;
  55. ++i;
  56. + printf("##decode raw frame %d\n", i);
  57. if (30 <= i && i < 40) {
  58. dump_raw_frame(af, i);
  59. }
  60. + if (i >= 1000)
  61. + break;
  62. }
  63. /*
  64. * Run the decoder every time, so that we keep
  65. diff --git a/third_party/aom/CMakeLists.txt b/third_party/aom/CMakeLists.txt
  66. index 9dbe301..20c7be4 100644
  67. --- a/third_party/aom/CMakeLists.txt
  68. +++ b/third_party/aom/CMakeLists.txt
  69. @@ -56,6 +56,10 @@ option(BUILD_SHARED_LIBS "CMake should generate a shared library build." OFF)
  70. project(AOM C CXX)
  71. +set(CMAKE_C_FLAGS "-msimd128 -msse2 -msse3 -msse4.1 -msse4.2 ${CMAKE_C_FLAGS}")
  72. +set(CMAKE_CXX_FLAGS "-msimd128 -msse2 -msse3 -msse4.1 -msse4.2 ${CMAKE_CXX_FLAGS}")
  73. +set(CMAKE_VERBOSE_MAKEFILE on)
  74. +
  75. set(AOM_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
  76. set(AOM_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  77. set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include"
  78. @@ -347,7 +351,7 @@ if(CONFIG_AV1_DECODER AND ENABLE_EXAMPLES)
  79. em_link_post_js(inspect "${AOM_ROOT}/tools/inspect-post.js")
  80. # Force generation of Wasm instead of asm.js
  81. append_link_flag_to_target("inspect" "-s WASM=1")
  82. - append_compiler_flag("-s WASM=1")
  83. + append_compiler_flag("-O3 -s WASM=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0")
  84. endif()
  85. endif()
  86. diff --git a/third_party/aom/aom/src/aom_codec.c b/third_party/aom/aom/src/aom_codec.c
  87. index dbd6fa5..a8d2a49 100644
  88. --- a/third_party/aom/aom/src/aom_codec.c
  89. +++ b/third_party/aom/aom/src/aom_codec.c
  90. @@ -132,6 +132,7 @@ void aom_internal_error(struct aom_internal_error_info *info,
  91. info->detail[sz - 1] = '\0';
  92. }
  93. + printf("##aom internal error: %s\n", info->detail);
  94. if (info->setjmp) longjmp(info->jmp, info->error_code);
  95. }
  96. diff --git a/third_party/aom/aom_dsp/grain_table.c b/third_party/aom/aom_dsp/grain_table.c
  97. index 0d6a73f..4b05833 100644
  98. --- a/third_party/aom/aom_dsp/grain_table.c
  99. +++ b/third_party/aom/aom_dsp/grain_table.c
  100. @@ -293,6 +293,9 @@ aom_codec_err_t aom_film_grain_table_read(
  101. return error_info->error_code;
  102. }
  103. +size_t
  104. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  105. +
  106. aom_codec_err_t aom_film_grain_table_write(
  107. const aom_film_grain_table_t *t, const char *filename,
  108. struct aom_internal_error_info *error_info) {
  109. @@ -305,7 +308,7 @@ aom_codec_err_t aom_film_grain_table_write(
  110. return error_info->error_code;
  111. }
  112. - if (!fwrite(kFileMagic, 8, 1, file)) {
  113. + if (!emcc_fwrite(kFileMagic, 8, 1, file)) {
  114. aom_internal_error(error_info, AOM_CODEC_ERROR,
  115. "Unable to write file magic");
  116. fclose(file);
  117. diff --git a/third_party/aom/aomdec.c b/third_party/aom/aomdec.c
  118. index 4addee8..f850147 100644
  119. --- a/third_party/aom/aomdec.c
  120. +++ b/third_party/aom/aomdec.c
  121. @@ -274,6 +274,9 @@ static void update_image_md5(const aom_image_t *img, const int planes[3],
  122. }
  123. }
  124. +size_t
  125. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  126. +
  127. static void write_image_file(const aom_image_t *img, const int *planes,
  128. const int num_planes, FILE *file) {
  129. int i, y;
  130. @@ -287,7 +290,7 @@ static void write_image_file(const aom_image_t *img, const int *planes,
  131. const int h = aom_img_plane_height(img, plane);
  132. for (y = 0; y < h; ++y) {
  133. - fwrite(buf, bytes_per_sample, w, file);
  134. + emcc_fwrite(buf, bytes_per_sample, w, file);
  135. buf += stride;
  136. }
  137. }
  138. diff --git a/third_party/aom/aomenc.c b/third_party/aom/aomenc.c
  139. index 64155b0..3ed5080 100644
  140. --- a/third_party/aom/aomenc.c
  141. +++ b/third_party/aom/aomenc.c
  142. @@ -59,9 +59,12 @@ static size_t wrap_fread(void *ptr, size_t size, size_t nmemb, FILE *stream) {
  143. }
  144. #define fread wrap_fread
  145. +size_t
  146. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  147. +
  148. static size_t wrap_fwrite(const void *ptr, size_t size, size_t nmemb,
  149. FILE *stream) {
  150. - return fwrite(ptr, size, nmemb, stream);
  151. + return emcc_fwrite(ptr, size, nmemb, stream);
  152. }
  153. #define fwrite wrap_fwrite
  154. diff --git a/third_party/aom/aomstats.c b/third_party/aom/aomstats.c
  155. index 0cfeea2..6833776 100644
  156. --- a/third_party/aom/aomstats.c
  157. +++ b/third_party/aom/aomstats.c
  158. @@ -80,9 +80,12 @@ void stats_close(stats_io_t *stats, int last_pass) {
  159. }
  160. }
  161. +size_t
  162. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  163. +
  164. void stats_write(stats_io_t *stats, const void *pkt, size_t len) {
  165. if (stats->file) {
  166. - (void)fwrite(pkt, 1, len, stats->file);
  167. + (void)emcc_fwrite(pkt, 1, len, stats->file);
  168. } else {
  169. if (stats->buf.sz + len > stats->buf_alloc_sz) {
  170. size_t new_sz = stats->buf_alloc_sz + 64 * 1024;
  171. diff --git a/third_party/aom/av1/common/debugmodes.c b/third_party/aom/av1/common/debugmodes.c
  172. index 868f341..c44258c 100644
  173. --- a/third_party/aom/av1/common/debugmodes.c
  174. +++ b/third_party/aom/av1/common/debugmodes.c
  175. @@ -89,10 +89,13 @@ void av1_print_modes_and_motion_vectors(AV1_COMMON *cm, const char *file) {
  176. fclose(mvs);
  177. }
  178. +size_t
  179. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  180. +
  181. void av1_print_uncompressed_frame_header(const uint8_t *data, int size,
  182. const char *filename) {
  183. FILE *hdrFile = fopen(filename, "w");
  184. - fwrite(data, size, sizeof(uint8_t), hdrFile);
  185. + emcc_fwrite(data, size, sizeof(uint8_t), hdrFile);
  186. fclose(hdrFile);
  187. }
  188. diff --git a/third_party/aom/av1/encoder/encoder.c b/third_party/aom/av1/encoder/encoder.c
  189. index a557380..d709d26 100644
  190. --- a/third_party/aom/av1/encoder/encoder.c
  191. +++ b/third_party/aom/av1/encoder/encoder.c
  192. @@ -2799,6 +2799,9 @@ AV1_COMP *av1_create_compressor(AV1EncoderConfig *oxcf,
  193. snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V))
  194. #endif // CONFIG_INTERNAL_STATS
  195. +size_t
  196. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  197. +
  198. void av1_remove_compressor(AV1_COMP *cpi) {
  199. AV1_COMMON *cm;
  200. unsigned int i;
  201. @@ -2814,7 +2817,7 @@ void av1_remove_compressor(AV1_COMP *cpi) {
  202. if (cpi->oxcf.pass != 1) {
  203. fprintf(stderr, "Writing counts.stt\n");
  204. FILE *f = fopen("counts.stt", "wb");
  205. - fwrite(&aggregate_fc, sizeof(aggregate_fc), 1, f);
  206. + emcc_fwrite(&aggregate_fc, sizeof(aggregate_fc), 1, f);
  207. fclose(f);
  208. }
  209. #endif // CONFIG_ENTROPY_STATS
  210. @@ -3013,7 +3016,7 @@ void aom_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) {
  211. int h = s->y_height;
  212. do {
  213. - fwrite(src, s->y_width, 1, f);
  214. + emcc_fwrite(src, s->y_width, 1, f);
  215. src += s->y_stride;
  216. } while (--h);
  217. @@ -3021,7 +3024,7 @@ void aom_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) {
  218. h = s->uv_height;
  219. do {
  220. - fwrite(src, s->uv_width, 1, f);
  221. + emcc_fwrite(src, s->uv_width, 1, f);
  222. src += s->uv_stride;
  223. } while (--h);
  224. @@ -3029,7 +3032,7 @@ void aom_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) {
  225. h = s->uv_height;
  226. do {
  227. - fwrite(src, s->uv_width, 1, f);
  228. + emcc_fwrite(src, s->uv_width, 1, f);
  229. src += s->uv_stride;
  230. } while (--h);
  231. }
  232. @@ -3121,7 +3124,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  233. uint16_t *src16 = CONVERT_TO_SHORTPTR(s->y_buffer);
  234. do {
  235. - fwrite(src16, s->y_width, 2, yuv_rec_file);
  236. + emcc_fwrite(src16, s->y_width, 2, yuv_rec_file);
  237. src16 += s->y_stride;
  238. } while (--h);
  239. @@ -3129,7 +3132,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  240. h = s->uv_height;
  241. do {
  242. - fwrite(src16, s->uv_width, 2, yuv_rec_file);
  243. + emcc_fwrite(src16, s->uv_width, 2, yuv_rec_file);
  244. src16 += s->uv_stride;
  245. } while (--h);
  246. @@ -3137,7 +3140,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  247. h = s->uv_height;
  248. do {
  249. - fwrite(src16, s->uv_width, 2, yuv_rec_file);
  250. + emcc_fwrite(src16, s->uv_width, 2, yuv_rec_file);
  251. src16 += s->uv_stride;
  252. } while (--h);
  253. @@ -3146,7 +3149,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  254. }
  255. do {
  256. - fwrite(src, s->y_width, 1, yuv_rec_file);
  257. + emcc_fwrite(src, s->y_width, 1, yuv_rec_file);
  258. src += s->y_stride;
  259. } while (--h);
  260. @@ -3154,7 +3157,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  261. h = s->uv_height;
  262. do {
  263. - fwrite(src, s->uv_width, 1, yuv_rec_file);
  264. + emcc_fwrite(src, s->uv_width, 1, yuv_rec_file);
  265. src += s->uv_stride;
  266. } while (--h);
  267. @@ -3162,7 +3165,7 @@ void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  268. h = s->uv_height;
  269. do {
  270. - fwrite(src, s->uv_width, 1, yuv_rec_file);
  271. + emcc_fwrite(src, s->uv_width, 1, yuv_rec_file);
  272. src += s->uv_stride;
  273. } while (--h);
  274. @@ -3241,16 +3244,16 @@ static int dump_one_image(AV1_COMMON *cm,
  275. // --- Y ---
  276. for (h = 0; h < cm->height; ++h) {
  277. - fwrite(&ref_buf->y_buffer[h * ref_buf->y_stride], 1, cm->width, f_ref);
  278. + emcc_fwrite(&ref_buf->y_buffer[h * ref_buf->y_stride], 1, cm->width, f_ref);
  279. }
  280. // --- U ---
  281. for (h = 0; h < (cm->height >> 1); ++h) {
  282. - fwrite(&ref_buf->u_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
  283. + emcc_fwrite(&ref_buf->u_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
  284. f_ref);
  285. }
  286. // --- V ---
  287. for (h = 0; h < (cm->height >> 1); ++h) {
  288. - fwrite(&ref_buf->v_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
  289. + emcc_fwrite(&ref_buf->v_buffer[h * ref_buf->uv_stride], 1, (cm->width >> 1),
  290. f_ref);
  291. }
  292. @@ -4692,17 +4695,17 @@ static void dump_filtered_recon_frames(AV1_COMP *cpi) {
  293. // --- Y ---
  294. for (h = 0; h < cm->height; ++h) {
  295. - fwrite(&recon_buf->y_buffer[h * recon_buf->y_stride], 1, cm->width,
  296. + emcc_fwrite(&recon_buf->y_buffer[h * recon_buf->y_stride], 1, cm->width,
  297. f_recon);
  298. }
  299. // --- U ---
  300. for (h = 0; h < (cm->height >> 1); ++h) {
  301. - fwrite(&recon_buf->u_buffer[h * recon_buf->uv_stride], 1, (cm->width >> 1),
  302. + emcc_fwrite(&recon_buf->u_buffer[h * recon_buf->uv_stride], 1, (cm->width >> 1),
  303. f_recon);
  304. }
  305. // --- V ---
  306. for (h = 0; h < (cm->height >> 1); ++h) {
  307. - fwrite(&recon_buf->v_buffer[h * recon_buf->uv_stride], 1, (cm->width >> 1),
  308. + emcc_fwrite(&recon_buf->v_buffer[h * recon_buf->uv_stride], 1, (cm->width >> 1),
  309. f_recon);
  310. }
  311. diff --git a/third_party/aom/av1/encoder/firstpass.c b/third_party/aom/av1/encoder/firstpass.c
  312. index bb73fde..b963043 100644
  313. --- a/third_party/aom/av1/encoder/firstpass.c
  314. +++ b/third_party/aom/av1/encoder/firstpass.c
  315. @@ -476,6 +476,9 @@ static double raw_motion_error_stdev(int *raw_motion_err_list,
  316. return raw_err_stdev;
  317. }
  318. +size_t
  319. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  320. +
  321. #define UL_INTRA_THRESH 50
  322. #define INVALID_ROW -1
  323. void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) {
  324. @@ -1077,7 +1080,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) {
  325. else
  326. recon_file = fopen(filename, "ab");
  327. - (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file);
  328. + (void)emcc_fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file);
  329. fclose(recon_file);
  330. }
  331. diff --git a/third_party/aom/build/cmake/aom_configure.cmake b/third_party/aom/build/cmake/aom_configure.cmake
  332. index 9220a32..fb8bf9f 100644
  333. --- a/third_party/aom/build/cmake/aom_configure.cmake
  334. +++ b/third_party/aom/build/cmake/aom_configure.cmake
  335. @@ -260,7 +260,7 @@ if(MSVC)
  336. add_compiler_flag_if_supported("/WX")
  337. endif()
  338. else()
  339. - require_c_flag("-std=c99" YES)
  340. + #require_c_flag("-std=c99" YES)
  341. add_compiler_flag_if_supported("-Wall")
  342. add_compiler_flag_if_supported("-Wdisabled-optimization")
  343. add_compiler_flag_if_supported("-Wextra")
  344. diff --git a/third_party/aom/examples/resize_util.c b/third_party/aom/examples/resize_util.c
  345. index 5485691..e60ed86 100644
  346. --- a/third_party/aom/examples/resize_util.c
  347. +++ b/third_party/aom/examples/resize_util.c
  348. @@ -45,6 +45,9 @@ static int parse_dim(char *v, int *width, int *height) {
  349. return 1;
  350. }
  351. +size_t
  352. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  353. +
  354. int main(int argc, char *argv[]) {
  355. char *fin, *fout;
  356. FILE *fpin, *fpout;
  357. @@ -111,7 +114,7 @@ int main(int argc, char *argv[]) {
  358. av1_resize_frame420(inbuf, width, inbuf_u, inbuf_v, width / 2, height,
  359. width, outbuf, target_width, outbuf_u, outbuf_v,
  360. target_width / 2, target_height, target_width);
  361. - fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout);
  362. + emcc_fwrite(outbuf, target_width * target_height * 3 / 2, 1, fpout);
  363. f++;
  364. }
  365. printf("%d frames processed\n", f);
  366. diff --git a/third_party/aom/examples/scalable_encoder.c b/third_party/aom/examples/scalable_encoder.c
  367. index 10d647e..fcf31e1 100644
  368. --- a/third_party/aom/examples/scalable_encoder.c
  369. +++ b/third_party/aom/examples/scalable_encoder.c
  370. @@ -91,6 +91,9 @@ void usage_exit(void) {
  371. exit(EXIT_FAILURE);
  372. }
  373. +size_t
  374. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  375. +
  376. static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img,
  377. int frame_index, int flags, FILE *outfile) {
  378. int got_pkts = 0;
  379. @@ -105,7 +108,7 @@ static int encode_frame(aom_codec_ctx_t *codec, aom_image_t *img,
  380. if (pkt->kind == AOM_CODEC_CX_FRAME_PKT) {
  381. const int keyframe = (pkt->data.frame.flags & AOM_FRAME_IS_KEY) != 0;
  382. - if (fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile) !=
  383. + if (emcc_fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile) !=
  384. pkt->data.frame.sz) {
  385. die_codec(codec, "Failed to write compressed frame");
  386. }
  387. diff --git a/third_party/aom/ivfenc.c b/third_party/aom/ivfenc.c
  388. index 80f4d14..d0e4e34 100644
  389. --- a/third_party/aom/ivfenc.c
  390. +++ b/third_party/aom/ivfenc.c
  391. @@ -14,6 +14,9 @@
  392. #include "aom/aom_encoder.h"
  393. #include "aom_ports/mem_ops.h"
  394. +size_t
  395. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  396. +
  397. void ivf_write_file_header(FILE *outfile, const struct aom_codec_enc_cfg *cfg,
  398. unsigned int fourcc, int frame_cnt) {
  399. char header[32];
  400. @@ -32,7 +35,7 @@ void ivf_write_file_header(FILE *outfile, const struct aom_codec_enc_cfg *cfg,
  401. mem_put_le32(header + 24, frame_cnt); // length
  402. mem_put_le32(header + 28, 0); // unused
  403. - fwrite(header, 1, 32, outfile);
  404. + emcc_fwrite(header, 1, 32, outfile);
  405. }
  406. void ivf_write_frame_header(FILE *outfile, int64_t pts, size_t frame_size) {
  407. @@ -41,12 +44,12 @@ void ivf_write_frame_header(FILE *outfile, int64_t pts, size_t frame_size) {
  408. mem_put_le32(header, (int)frame_size);
  409. mem_put_le32(header + 4, (int)(pts & 0xFFFFFFFF));
  410. mem_put_le32(header + 8, (int)(pts >> 32));
  411. - fwrite(header, 1, 12, outfile);
  412. + emcc_fwrite(header, 1, 12, outfile);
  413. }
  414. void ivf_write_frame_size(FILE *outfile, size_t frame_size) {
  415. char header[4];
  416. mem_put_le32(header, (int)frame_size);
  417. - fwrite(header, 1, 4, outfile);
  418. + emcc_fwrite(header, 1, 4, outfile);
  419. }
  420. diff --git a/third_party/aom/test/decode_perf_test.cc b/third_party/aom/test/decode_perf_test.cc
  421. index 3c93e7d..2d364ae 100644
  422. --- a/third_party/aom/test/decode_perf_test.cc
  423. +++ b/third_party/aom/test/decode_perf_test.cc
  424. @@ -24,6 +24,11 @@
  425. using ::testing::make_tuple;
  426. +extern "C" {
  427. + size_t
  428. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  429. +}
  430. +
  431. namespace {
  432. #define VIDEO_NAME 0
  433. @@ -153,7 +158,7 @@ class AV1NewEncodeDecodePerfTest
  434. // Write frame header and data.
  435. ivf_write_frame_header(outfile_, out_frames_, pkt->data.frame.sz);
  436. - ASSERT_EQ(fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_),
  437. + ASSERT_EQ(emcc_fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_),
  438. pkt->data.frame.sz);
  439. }
  440. diff --git a/third_party/aom/test/film_grain_table_test.cc b/third_party/aom/test/film_grain_table_test.cc
  441. index 0688146..dbb8e6b 100644
  442. --- a/third_party/aom/test/film_grain_table_test.cc
  443. +++ b/third_party/aom/test/film_grain_table_test.cc
  444. @@ -5,6 +5,11 @@
  445. #include "av1/encoder/grain_test_vectors.h"
  446. #include "test/video_source.h"
  447. +extern "C" {
  448. + size_t
  449. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  450. +}
  451. +
  452. void grain_equal(const aom_film_grain_t *expected,
  453. const aom_film_grain_t *actual) {
  454. EXPECT_EQ(expected->apply_grain, actual->apply_grain);
  455. @@ -168,7 +173,7 @@ TEST_F(FilmGrainTableIOTest, ReadTruncatedFile) {
  456. std::string grain_file;
  457. FILE *file = libaom_test::GetTempOutFile(&grain_file);
  458. - fwrite("deadbeef", 8, 1, file);
  459. + emcc_fwrite("deadbeef", 8, 1, file);
  460. fclose(file);
  461. ASSERT_EQ(AOM_CODEC_ERROR,
  462. aom_film_grain_table_read(&table, grain_file.c_str(), &error_));
  463. diff --git a/third_party/aom/test/resize_test.cc b/third_party/aom/test/resize_test.cc
  464. index e1c4e9f..9c2bce8 100644
  465. --- a/third_party/aom/test/resize_test.cc
  466. +++ b/third_party/aom/test/resize_test.cc
  467. @@ -22,6 +22,11 @@
  468. // Enable(1) or Disable(0) writing of the compressed bitstream.
  469. #define WRITE_COMPRESSED_STREAM 0
  470. +extern "C" {
  471. + size_t
  472. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  473. +}
  474. +
  475. namespace {
  476. #if WRITE_COMPRESSED_STREAM
  477. @@ -55,13 +60,13 @@ static void write_ivf_file_header(const aom_codec_enc_cfg_t *const cfg,
  478. mem_put_le32(header + 24, frame_cnt); /* length */
  479. mem_put_le32(header + 28, 0); /* unused */
  480. - (void)fwrite(header, 1, 32, outfile);
  481. + (void)emcc_fwrite(header, 1, 32, outfile);
  482. }
  483. static void write_ivf_frame_size(FILE *const outfile, const size_t size) {
  484. char header[4];
  485. mem_put_le32(header, static_cast<unsigned int>(size));
  486. - (void)fwrite(header, 1, 4, outfile);
  487. + (void)emcc_fwrite(header, 1, 4, outfile);
  488. }
  489. static void write_ivf_frame_header(const aom_codec_cx_pkt_t *const pkt,
  490. @@ -76,7 +81,7 @@ static void write_ivf_frame_header(const aom_codec_cx_pkt_t *const pkt,
  491. mem_put_le32(header + 4, pts & 0xFFFFFFFF);
  492. mem_put_le32(header + 8, pts >> 32);
  493. - (void)fwrite(header, 1, 12, outfile);
  494. + (void)emcc_fwrite(header, 1, 12, outfile);
  495. }
  496. #endif // WRITE_COMPRESSED_STREAM
  497. @@ -309,7 +314,7 @@ class ResizeInternalTestLarge : public ResizeTest {
  498. // Write frame header and data.
  499. write_ivf_frame_header(pkt, outfile_);
  500. - (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
  501. + (void)emcc_fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
  502. }
  503. #endif
  504. @@ -608,7 +613,7 @@ class ResizeCspTest : public ResizeTest {
  505. // Write frame header and data.
  506. write_ivf_frame_header(pkt, outfile_);
  507. - (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
  508. + (void)emcc_fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_);
  509. }
  510. #endif
  511. diff --git a/third_party/aom/test/y4m_test.cc b/third_party/aom/test/y4m_test.cc
  512. index ad901d9..f24093f 100644
  513. --- a/third_party/aom/test/y4m_test.cc
  514. +++ b/third_party/aom/test/y4m_test.cc
  515. @@ -19,6 +19,11 @@
  516. #include "test/util.h"
  517. #include "test/y4m_video_source.h"
  518. +extern "C" {
  519. + size_t
  520. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  521. +}
  522. +
  523. namespace {
  524. using std::string;
  525. @@ -68,7 +73,7 @@ static void write_image_file(const aom_image_t *img, FILE *file) {
  526. (plane ? (img->d_w + img->x_chroma_shift) >> img->x_chroma_shift
  527. : img->d_w);
  528. for (y = 0; y < h; ++y) {
  529. - fwrite(buf, bytes_per_sample, w, file);
  530. + emcc_fwrite(buf, bytes_per_sample, w, file);
  531. buf += stride;
  532. }
  533. }
  534. diff --git a/third_party/aom/third_party/googletest/src/googletest/src/gtest.cc b/third_party/aom/third_party/googletest/src/googletest/src/gtest.cc
  535. index 5a8932c..ac2c435 100644
  536. --- a/third_party/aom/third_party/googletest/src/googletest/src/gtest.cc
  537. +++ b/third_party/aom/third_party/googletest/src/googletest/src/gtest.cc
  538. @@ -146,6 +146,11 @@
  539. # define vsnprintf _vsnprintf
  540. #endif // GTEST_OS_WINDOWS
  541. +extern "C" {
  542. + size_t
  543. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  544. +}
  545. +
  546. namespace testing {
  547. using internal::CountIf;
  548. @@ -3867,7 +3872,7 @@ class ScopedPrematureExitFile {
  549. // errors are ignored as there's nothing better we can do and we
  550. // don't want to fail the test because of this.
  551. FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
  552. - fwrite("0", 1, 1, pfile);
  553. + emcc_fwrite("0", 1, 1, pfile);
  554. fclose(pfile);
  555. }
  556. }
  557. diff --git a/third_party/aom/third_party/libwebm/mkvmuxer/mkvwriter.cc b/third_party/aom/third_party/libwebm/mkvmuxer/mkvwriter.cc
  558. index 84655d8..0004093 100644
  559. --- a/third_party/aom/third_party/libwebm/mkvmuxer/mkvwriter.cc
  560. +++ b/third_party/aom/third_party/libwebm/mkvmuxer/mkvwriter.cc
  561. @@ -14,6 +14,11 @@
  562. #include <share.h> // for _SH_DENYWR
  563. #endif
  564. +extern "C" {
  565. + size_t
  566. + emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  567. +}
  568. +
  569. namespace mkvmuxer {
  570. MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
  571. @@ -32,7 +37,7 @@ int32 MkvWriter::Write(const void* buffer, uint32 length) {
  572. if (buffer == NULL)
  573. return -1;
  574. - const size_t bytes_written = fwrite(buffer, 1, length, file_);
  575. + const size_t bytes_written = emcc_fwrite(buffer, 1, length, file_);
  576. return (bytes_written == length) ? 0 : -1;
  577. }
  578. diff --git a/third_party/aom/tools_common.c b/third_party/aom/tools_common.c
  579. index 7abc20c..fbc30bc 100644
  580. --- a/third_party/aom/tools_common.c
  581. +++ b/third_party/aom/tools_common.c
  582. @@ -185,6 +185,9 @@ const AvxInterface *get_aom_decoder_by_fourcc(uint32_t fourcc) {
  583. }
  584. #endif // CONFIG_AV1_DECODER
  585. +size_t
  586. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  587. +
  588. void aom_img_write(const aom_image_t *img, FILE *file) {
  589. int plane;
  590. @@ -197,7 +200,7 @@ void aom_img_write(const aom_image_t *img, FILE *file) {
  591. int y;
  592. for (y = 0; y < h; ++y) {
  593. - fwrite(buf, 1, w, file);
  594. + emcc_fwrite(buf, 1, w, file);
  595. buf += stride;
  596. }
  597. }
  598. diff --git a/third_party/aom/video_writer.c b/third_party/aom/video_writer.c
  599. index 4e072c7..6b1ca54 100644
  600. --- a/third_party/aom/video_writer.c
  601. +++ b/third_party/aom/video_writer.c
  602. @@ -66,10 +66,13 @@ void aom_video_writer_close(AvxVideoWriter *writer) {
  603. }
  604. }
  605. +size_t
  606. +emcc_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  607. +
  608. int aom_video_writer_write_frame(AvxVideoWriter *writer, const uint8_t *buffer,
  609. size_t size, int64_t pts) {
  610. ivf_write_frame_header(writer->file, pts, size);
  611. - if (fwrite(buffer, 1, size, writer->file) != size) return 0;
  612. + if (emcc_fwrite(buffer, 1, size, writer->file) != size) return 0;
  613. ++writer->frame_count;