vpx_temporal_svc_encoder.sh 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #!/bin/sh
  2. ##
  3. ## Copyright (c) 2014 The WebM project authors. All Rights Reserved.
  4. ##
  5. ## Use of this source code is governed by a BSD-style license
  6. ## that can be found in the LICENSE file in the root of the source
  7. ## tree. An additional intellectual property rights grant can be found
  8. ## in the file PATENTS. All contributing project authors may
  9. ## be found in the AUTHORS file in the root of the source tree.
  10. ##
  11. ## This file tests the libvpx vpx_temporal_svc_encoder example. To add new
  12. ## tests to this file, do the following:
  13. ## 1. Write a shell function (this is your test).
  14. ## 2. Add the function to vpx_tsvc_encoder_tests (on a new line).
  15. ##
  16. . $(dirname $0)/tools_common.sh
  17. # Environment check: $YUV_RAW_INPUT is required.
  18. vpx_tsvc_encoder_verify_environment() {
  19. if [ ! -e "${YUV_RAW_INPUT}" ]; then
  20. echo "Libvpx test data must exist in LIBVPX_TEST_DATA_PATH."
  21. return 1
  22. fi
  23. if [ "$(vpx_config_option_enabled CONFIG_TEMPORAL_DENOISING)" != "yes" ]; then
  24. elog "Warning: Temporal denoising is disabled! Spatial denoising will be " \
  25. "used instead, which is probably not what you want for this test."
  26. fi
  27. }
  28. # Runs vpx_temporal_svc_encoder using the codec specified by $1 and output file
  29. # name by $2. Additional positional parameters are passed directly to
  30. # vpx_temporal_svc_encoder.
  31. vpx_tsvc_encoder() {
  32. local encoder="${LIBVPX_BIN_PATH}/vpx_temporal_svc_encoder"
  33. encoder="${encoder}${VPX_TEST_EXE_SUFFIX}"
  34. local codec="$1"
  35. local output_file_base="$2"
  36. local output_file="${VPX_TEST_OUTPUT_DIR}/${output_file_base}"
  37. local timebase_num="1"
  38. local timebase_den="1000"
  39. local speed="6"
  40. local frame_drop_thresh="30"
  41. local max_threads="4"
  42. local error_resilient="1"
  43. shift 2
  44. if [ ! -x "${encoder}" ]; then
  45. elog "${encoder} does not exist or is not executable."
  46. return 1
  47. fi
  48. # TODO(tomfinegan): Verify file output for all thread runs.
  49. for threads in $(seq $max_threads); do
  50. if [ "$(vpx_config_option_enabled CONFIG_VP9_HIGHBITDEPTH)" != "yes" ]; then
  51. eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT}" \
  52. "${output_file}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \
  53. "${YUV_RAW_INPUT_HEIGHT}" "${timebase_num}" "${timebase_den}" \
  54. "${speed}" "${frame_drop_thresh}" "${error_resilient}" "${threads}" \
  55. "$@" ${devnull}
  56. else
  57. eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT}" \
  58. "${output_file}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \
  59. "${YUV_RAW_INPUT_HEIGHT}" "${timebase_num}" "${timebase_den}" \
  60. "${speed}" "${frame_drop_thresh}" "${error_resilient}" "${threads}" \
  61. "$@" "8" ${devnull}
  62. fi
  63. done
  64. }
  65. # Confirms that all expected output files exist given the output file name
  66. # passed to vpx_temporal_svc_encoder.
  67. # The file name passed to vpx_temporal_svc_encoder is joined with the stream
  68. # number and the extension .ivf to produce per stream output files. Here $1 is
  69. # file name, and $2 is expected number of files.
  70. files_exist() {
  71. local file_name="${VPX_TEST_OUTPUT_DIR}/$1"
  72. local num_files="$(($2 - 1))"
  73. for stream_num in $(seq 0 ${num_files}); do
  74. [ -e "${file_name}_${stream_num}.ivf" ] || return 1
  75. done
  76. }
  77. # Run vpx_temporal_svc_encoder in all supported modes for vp8 and vp9.
  78. vpx_tsvc_encoder_vp8_mode_0() {
  79. if [ "$(vp8_encode_available)" = "yes" ]; then
  80. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_0"
  81. vpx_tsvc_encoder vp8 "${output_basename}" 0 200 || return 1
  82. # Mode 0 produces 1 stream
  83. files_exist "${output_basename}" 1 || return 1
  84. fi
  85. }
  86. vpx_tsvc_encoder_vp8_mode_1() {
  87. if [ "$(vp8_encode_available)" = "yes" ]; then
  88. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_1"
  89. vpx_tsvc_encoder vp8 "${output_basename}" 1 200 400 || return 1
  90. # Mode 1 produces 2 streams
  91. files_exist "${output_basename}" 2 || return 1
  92. fi
  93. }
  94. vpx_tsvc_encoder_vp8_mode_2() {
  95. if [ "$(vp8_encode_available)" = "yes" ]; then
  96. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_2"
  97. vpx_tsvc_encoder vp8 "${output_basename}" 2 200 400 || return 1
  98. # Mode 2 produces 2 streams
  99. files_exist "${output_basename}" 2 || return 1
  100. fi
  101. }
  102. vpx_tsvc_encoder_vp8_mode_3() {
  103. if [ "$(vp8_encode_available)" = "yes" ]; then
  104. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_3"
  105. vpx_tsvc_encoder vp8 "${output_basename}" 3 200 400 600 || return 1
  106. # Mode 3 produces 3 streams
  107. files_exist "${output_basename}" 3 || return 1
  108. fi
  109. }
  110. vpx_tsvc_encoder_vp8_mode_4() {
  111. if [ "$(vp8_encode_available)" = "yes" ]; then
  112. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_4"
  113. vpx_tsvc_encoder vp8 "${output_basename}" 4 200 400 600 || return 1
  114. # Mode 4 produces 3 streams
  115. files_exist "${output_basename}" 3 || return 1
  116. fi
  117. }
  118. vpx_tsvc_encoder_vp8_mode_5() {
  119. if [ "$(vp8_encode_available)" = "yes" ]; then
  120. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_5"
  121. vpx_tsvc_encoder vp8 "${output_basename}" 5 200 400 600 || return 1
  122. # Mode 5 produces 3 streams
  123. files_exist "${output_basename}" 3 || return 1
  124. fi
  125. }
  126. vpx_tsvc_encoder_vp8_mode_6() {
  127. if [ "$(vp8_encode_available)" = "yes" ]; then
  128. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_6"
  129. vpx_tsvc_encoder vp8 "${output_basename}" 6 200 400 600 || return 1
  130. # Mode 6 produces 3 streams
  131. files_exist "${output_basename}" 3 || return 1
  132. fi
  133. }
  134. vpx_tsvc_encoder_vp8_mode_7() {
  135. if [ "$(vp8_encode_available)" = "yes" ]; then
  136. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_7"
  137. vpx_tsvc_encoder vp8 "${output_basename}" 7 200 400 600 800 1000 || return 1
  138. # Mode 7 produces 5 streams
  139. files_exist "${output_basename}" 5 || return 1
  140. fi
  141. }
  142. vpx_tsvc_encoder_vp8_mode_8() {
  143. if [ "$(vp8_encode_available)" = "yes" ]; then
  144. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_8"
  145. vpx_tsvc_encoder vp8 "${output_basename}" 8 200 400 || return 1
  146. # Mode 8 produces 2 streams
  147. files_exist "${output_basename}" 2 || return 1
  148. fi
  149. }
  150. vpx_tsvc_encoder_vp8_mode_9() {
  151. if [ "$(vp8_encode_available)" = "yes" ]; then
  152. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_9"
  153. vpx_tsvc_encoder vp8 "${output_basename}" 9 200 400 600 || return 1
  154. # Mode 9 produces 3 streams
  155. files_exist "${output_basename}" 3 || return 1
  156. fi
  157. }
  158. vpx_tsvc_encoder_vp8_mode_10() {
  159. if [ "$(vp8_encode_available)" = "yes" ]; then
  160. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_10"
  161. vpx_tsvc_encoder vp8 "${output_basename}" 10 200 400 600 || return 1
  162. # Mode 10 produces 3 streams
  163. files_exist "${output_basename}" 3 || return 1
  164. fi
  165. }
  166. vpx_tsvc_encoder_vp8_mode_11() {
  167. if [ "$(vp8_encode_available)" = "yes" ]; then
  168. local readonly output_basename="vpx_tsvc_encoder_vp8_mode_11"
  169. vpx_tsvc_encoder vp8 "${output_basename}" 11 200 400 600 || return 1
  170. # Mode 11 produces 3 streams
  171. files_exist "${output_basename}" 3 || return 1
  172. fi
  173. }
  174. vpx_tsvc_encoder_vp9_mode_0() {
  175. if [ "$(vp9_encode_available)" = "yes" ]; then
  176. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_0"
  177. vpx_tsvc_encoder vp9 "${output_basename}" 0 200 || return 1
  178. # Mode 0 produces 1 stream
  179. files_exist "${output_basename}" 1 || return 1
  180. fi
  181. }
  182. vpx_tsvc_encoder_vp9_mode_1() {
  183. if [ "$(vp9_encode_available)" = "yes" ]; then
  184. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_1"
  185. vpx_tsvc_encoder vp9 "${output_basename}" 1 200 400 || return 1
  186. # Mode 1 produces 2 streams
  187. files_exist "${output_basename}" 2 || return 1
  188. fi
  189. }
  190. vpx_tsvc_encoder_vp9_mode_2() {
  191. if [ "$(vp9_encode_available)" = "yes" ]; then
  192. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_2"
  193. vpx_tsvc_encoder vp9 "${output_basename}" 2 200 400 || return 1
  194. # Mode 2 produces 2 streams
  195. files_exist "${output_basename}" 2 || return 1
  196. fi
  197. }
  198. vpx_tsvc_encoder_vp9_mode_3() {
  199. if [ "$(vp9_encode_available)" = "yes" ]; then
  200. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_3"
  201. vpx_tsvc_encoder vp9 "${output_basename}" 3 200 400 600 || return 1
  202. # Mode 3 produces 3 streams
  203. files_exist "${output_basename}" 3 || return 1
  204. fi
  205. }
  206. vpx_tsvc_encoder_vp9_mode_4() {
  207. if [ "$(vp9_encode_available)" = "yes" ]; then
  208. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_4"
  209. vpx_tsvc_encoder vp9 "${output_basename}" 4 200 400 600 || return 1
  210. # Mode 4 produces 3 streams
  211. files_exist "${output_basename}" 3 || return 1
  212. fi
  213. }
  214. vpx_tsvc_encoder_vp9_mode_5() {
  215. if [ "$(vp9_encode_available)" = "yes" ]; then
  216. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_5"
  217. vpx_tsvc_encoder vp9 "${output_basename}" 5 200 400 600 || return 1
  218. # Mode 5 produces 3 streams
  219. files_exist "${output_basename}" 3 || return 1
  220. fi
  221. }
  222. vpx_tsvc_encoder_vp9_mode_6() {
  223. if [ "$(vp9_encode_available)" = "yes" ]; then
  224. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_6"
  225. vpx_tsvc_encoder vp9 "${output_basename}" 6 200 400 600 || return 1
  226. # Mode 6 produces 3 streams
  227. files_exist "${output_basename}" 3 || return 1
  228. fi
  229. }
  230. vpx_tsvc_encoder_vp9_mode_7() {
  231. if [ "$(vp9_encode_available)" = "yes" ]; then
  232. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_7"
  233. vpx_tsvc_encoder vp9 "${output_basename}" 7 200 400 600 800 1000 || return 1
  234. # Mode 7 produces 5 streams
  235. files_exist "${output_basename}" 5 || return 1
  236. fi
  237. }
  238. vpx_tsvc_encoder_vp9_mode_8() {
  239. if [ "$(vp9_encode_available)" = "yes" ]; then
  240. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_8"
  241. vpx_tsvc_encoder vp9 "${output_basename}" 8 200 400 || return 1
  242. # Mode 8 produces 2 streams
  243. files_exist "${output_basename}" 2 || return 1
  244. fi
  245. }
  246. vpx_tsvc_encoder_vp9_mode_9() {
  247. if [ "$(vp9_encode_available)" = "yes" ]; then
  248. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_9"
  249. vpx_tsvc_encoder vp9 "${output_basename}" 9 200 400 600 || return 1
  250. # Mode 9 produces 3 streams
  251. files_exist "${output_basename}" 3 || return 1
  252. fi
  253. }
  254. vpx_tsvc_encoder_vp9_mode_10() {
  255. if [ "$(vp9_encode_available)" = "yes" ]; then
  256. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_10"
  257. vpx_tsvc_encoder vp9 "${output_basename}" 10 200 400 600 || return 1
  258. # Mode 10 produces 3 streams
  259. files_exist "${output_basename}" 3 || return 1
  260. fi
  261. }
  262. vpx_tsvc_encoder_vp9_mode_11() {
  263. if [ "$(vp9_encode_available)" = "yes" ]; then
  264. local readonly output_basename="vpx_tsvc_encoder_vp9_mode_11"
  265. vpx_tsvc_encoder vp9 "${output_basename}" 11 200 400 600 || return 1
  266. # Mode 11 produces 3 streams
  267. files_exist "${output_basename}" 3 || return 1
  268. fi
  269. }
  270. vpx_tsvc_encoder_tests="vpx_tsvc_encoder_vp8_mode_0
  271. vpx_tsvc_encoder_vp8_mode_1
  272. vpx_tsvc_encoder_vp8_mode_2
  273. vpx_tsvc_encoder_vp8_mode_3
  274. vpx_tsvc_encoder_vp8_mode_4
  275. vpx_tsvc_encoder_vp8_mode_5
  276. vpx_tsvc_encoder_vp8_mode_6
  277. vpx_tsvc_encoder_vp8_mode_7
  278. vpx_tsvc_encoder_vp8_mode_8
  279. vpx_tsvc_encoder_vp8_mode_9
  280. vpx_tsvc_encoder_vp8_mode_10
  281. vpx_tsvc_encoder_vp8_mode_11
  282. vpx_tsvc_encoder_vp9_mode_0
  283. vpx_tsvc_encoder_vp9_mode_1
  284. vpx_tsvc_encoder_vp9_mode_2
  285. vpx_tsvc_encoder_vp9_mode_3
  286. vpx_tsvc_encoder_vp9_mode_4
  287. vpx_tsvc_encoder_vp9_mode_5
  288. vpx_tsvc_encoder_vp9_mode_6
  289. vpx_tsvc_encoder_vp9_mode_7
  290. vpx_tsvc_encoder_vp9_mode_8
  291. vpx_tsvc_encoder_vp9_mode_9
  292. vpx_tsvc_encoder_vp9_mode_10
  293. vpx_tsvc_encoder_vp9_mode_11"
  294. run_tests vpx_tsvc_encoder_verify_environment "${vpx_tsvc_encoder_tests}"