delta-mjpeg-dec.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) STMicroelectronics SA 2013
  4. * Author: Hugues Fruchet <hugues.fruchet@st.com> for STMicroelectronics.
  5. */
  6. #include <linux/slab.h>
  7. #include "delta.h"
  8. #include "delta-ipc.h"
  9. #include "delta-mjpeg.h"
  10. #include "delta-mjpeg-fw.h"
  11. #define DELTA_MJPEG_MAX_RESO DELTA_MAX_RESO
  12. struct delta_mjpeg_ctx {
  13. /* jpeg header */
  14. struct mjpeg_header header_struct;
  15. struct mjpeg_header *header;
  16. /* ipc */
  17. void *ipc_hdl;
  18. struct delta_buf *ipc_buf;
  19. /* decoded output frame */
  20. struct delta_frame *out_frame;
  21. unsigned char str[3000];
  22. };
  23. #define to_ctx(ctx) ((struct delta_mjpeg_ctx *)(ctx)->priv)
  24. static char *ipc_open_param_str(struct jpeg_video_decode_init_params_t *p,
  25. char *str, unsigned int len)
  26. {
  27. char *b = str;
  28. if (!p)
  29. return "";
  30. b += snprintf(b, len,
  31. "jpeg_video_decode_init_params_t\n"
  32. "circular_buffer_begin_addr_p 0x%x\n"
  33. "circular_buffer_end_addr_p 0x%x\n",
  34. p->circular_buffer_begin_addr_p,
  35. p->circular_buffer_end_addr_p);
  36. return str;
  37. }
  38. static char *ipc_decode_param_str(struct jpeg_decode_params_t *p,
  39. char *str, unsigned int len)
  40. {
  41. char *b = str;
  42. if (!p)
  43. return "";
  44. b += snprintf(b, len,
  45. "jpeg_decode_params_t\n"
  46. "picture_start_addr_p 0x%x\n"
  47. "picture_end_addr_p 0x%x\n"
  48. "decoding_mode %d\n"
  49. "display_buffer_addr.display_decimated_luma_p 0x%x\n"
  50. "display_buffer_addr.display_decimated_chroma_p 0x%x\n"
  51. "main_aux_enable %d\n"
  52. "additional_flags 0x%x\n"
  53. "field_flag %x\n"
  54. "is_jpeg_image %x\n",
  55. p->picture_start_addr_p,
  56. p->picture_end_addr_p,
  57. p->decoding_mode,
  58. p->display_buffer_addr.display_decimated_luma_p,
  59. p->display_buffer_addr.display_decimated_chroma_p,
  60. p->main_aux_enable, p->additional_flags,
  61. p->field_flag,
  62. p->is_jpeg_image);
  63. return str;
  64. }
  65. static inline bool is_stream_error(enum jpeg_decoding_error_t err)
  66. {
  67. switch (err) {
  68. case JPEG_DECODER_UNDEFINED_HUFF_TABLE:
  69. case JPEG_DECODER_BAD_RESTART_MARKER:
  70. case JPEG_DECODER_BAD_SOS_SPECTRAL:
  71. case JPEG_DECODER_BAD_SOS_SUCCESSIVE:
  72. case JPEG_DECODER_BAD_HEADER_LENGTH:
  73. case JPEG_DECODER_BAD_COUNT_VALUE:
  74. case JPEG_DECODER_BAD_DHT_MARKER:
  75. case JPEG_DECODER_BAD_INDEX_VALUE:
  76. case JPEG_DECODER_BAD_NUMBER_HUFFMAN_TABLES:
  77. case JPEG_DECODER_BAD_QUANT_TABLE_LENGTH:
  78. case JPEG_DECODER_BAD_NUMBER_QUANT_TABLES:
  79. case JPEG_DECODER_BAD_COMPONENT_COUNT:
  80. return true;
  81. default:
  82. return false;
  83. }
  84. }
  85. static inline const char *err_str(enum jpeg_decoding_error_t err)
  86. {
  87. switch (err) {
  88. case JPEG_DECODER_NO_ERROR:
  89. return "JPEG_DECODER_NO_ERROR";
  90. case JPEG_DECODER_UNDEFINED_HUFF_TABLE:
  91. return "JPEG_DECODER_UNDEFINED_HUFF_TABLE";
  92. case JPEG_DECODER_UNSUPPORTED_MARKER:
  93. return "JPEG_DECODER_UNSUPPORTED_MARKER";
  94. case JPEG_DECODER_UNABLE_ALLOCATE_MEMORY:
  95. return "JPEG_DECODER_UNABLE_ALLOCATE_MEMORY";
  96. case JPEG_DECODER_NON_SUPPORTED_SAMP_FACTORS:
  97. return "JPEG_DECODER_NON_SUPPORTED_SAMP_FACTORS";
  98. case JPEG_DECODER_BAD_PARAMETER:
  99. return "JPEG_DECODER_BAD_PARAMETER";
  100. case JPEG_DECODER_DECODE_ERROR:
  101. return "JPEG_DECODER_DECODE_ERROR";
  102. case JPEG_DECODER_BAD_RESTART_MARKER:
  103. return "JPEG_DECODER_BAD_RESTART_MARKER";
  104. case JPEG_DECODER_UNSUPPORTED_COLORSPACE:
  105. return "JPEG_DECODER_UNSUPPORTED_COLORSPACE";
  106. case JPEG_DECODER_BAD_SOS_SPECTRAL:
  107. return "JPEG_DECODER_BAD_SOS_SPECTRAL";
  108. case JPEG_DECODER_BAD_SOS_SUCCESSIVE:
  109. return "JPEG_DECODER_BAD_SOS_SUCCESSIVE";
  110. case JPEG_DECODER_BAD_HEADER_LENGTH:
  111. return "JPEG_DECODER_BAD_HEADER_LENGTH";
  112. case JPEG_DECODER_BAD_COUNT_VALUE:
  113. return "JPEG_DECODER_BAD_COUNT_VALUE";
  114. case JPEG_DECODER_BAD_DHT_MARKER:
  115. return "JPEG_DECODER_BAD_DHT_MARKER";
  116. case JPEG_DECODER_BAD_INDEX_VALUE:
  117. return "JPEG_DECODER_BAD_INDEX_VALUE";
  118. case JPEG_DECODER_BAD_NUMBER_HUFFMAN_TABLES:
  119. return "JPEG_DECODER_BAD_NUMBER_HUFFMAN_TABLES";
  120. case JPEG_DECODER_BAD_QUANT_TABLE_LENGTH:
  121. return "JPEG_DECODER_BAD_QUANT_TABLE_LENGTH";
  122. case JPEG_DECODER_BAD_NUMBER_QUANT_TABLES:
  123. return "JPEG_DECODER_BAD_NUMBER_QUANT_TABLES";
  124. case JPEG_DECODER_BAD_COMPONENT_COUNT:
  125. return "JPEG_DECODER_BAD_COMPONENT_COUNT";
  126. case JPEG_DECODER_DIVIDE_BY_ZERO_ERROR:
  127. return "JPEG_DECODER_DIVIDE_BY_ZERO_ERROR";
  128. case JPEG_DECODER_NOT_JPG_IMAGE:
  129. return "JPEG_DECODER_NOT_JPG_IMAGE";
  130. case JPEG_DECODER_UNSUPPORTED_ROTATION_ANGLE:
  131. return "JPEG_DECODER_UNSUPPORTED_ROTATION_ANGLE";
  132. case JPEG_DECODER_UNSUPPORTED_SCALING:
  133. return "JPEG_DECODER_UNSUPPORTED_SCALING";
  134. case JPEG_DECODER_INSUFFICIENT_OUTPUTBUFFER_SIZE:
  135. return "JPEG_DECODER_INSUFFICIENT_OUTPUTBUFFER_SIZE";
  136. case JPEG_DECODER_BAD_HWCFG_GP_VERSION_VALUE:
  137. return "JPEG_DECODER_BAD_HWCFG_GP_VERSION_VALUE";
  138. case JPEG_DECODER_BAD_VALUE_FROM_RED:
  139. return "JPEG_DECODER_BAD_VALUE_FROM_RED";
  140. case JPEG_DECODER_BAD_SUBREGION_PARAMETERS:
  141. return "JPEG_DECODER_BAD_SUBREGION_PARAMETERS";
  142. case JPEG_DECODER_PROGRESSIVE_DECODE_NOT_SUPPORTED:
  143. return "JPEG_DECODER_PROGRESSIVE_DECODE_NOT_SUPPORTED";
  144. case JPEG_DECODER_ERROR_TASK_TIMEOUT:
  145. return "JPEG_DECODER_ERROR_TASK_TIMEOUT";
  146. case JPEG_DECODER_ERROR_FEATURE_NOT_SUPPORTED:
  147. return "JPEG_DECODER_ERROR_FEATURE_NOT_SUPPORTED";
  148. default:
  149. return "!unknown MJPEG error!";
  150. }
  151. }
  152. static bool delta_mjpeg_check_status(struct delta_ctx *pctx,
  153. struct jpeg_decode_return_params_t *status)
  154. {
  155. struct delta_dev *delta = pctx->dev;
  156. bool dump = false;
  157. if (status->error_code == JPEG_DECODER_NO_ERROR)
  158. goto out;
  159. if (is_stream_error(status->error_code)) {
  160. dev_warn_ratelimited(delta->dev,
  161. "%s firmware: stream error @ frame %d (%s)\n",
  162. pctx->name, pctx->decoded_frames,
  163. err_str(status->error_code));
  164. pctx->stream_errors++;
  165. } else {
  166. dev_warn_ratelimited(delta->dev,
  167. "%s firmware: decode error @ frame %d (%s)\n",
  168. pctx->name, pctx->decoded_frames,
  169. err_str(status->error_code));
  170. pctx->decode_errors++;
  171. dump = true;
  172. }
  173. out:
  174. dev_dbg(delta->dev,
  175. "%s firmware: decoding time(us)=%d\n", pctx->name,
  176. status->decode_time_in_us);
  177. return dump;
  178. }
  179. static int delta_mjpeg_ipc_open(struct delta_ctx *pctx)
  180. {
  181. struct delta_dev *delta = pctx->dev;
  182. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  183. int ret = 0;
  184. struct jpeg_video_decode_init_params_t params_struct;
  185. struct jpeg_video_decode_init_params_t *params = &params_struct;
  186. struct delta_buf *ipc_buf;
  187. u32 ipc_buf_size;
  188. struct delta_ipc_param ipc_param;
  189. void *hdl;
  190. memset(params, 0, sizeof(*params));
  191. params->circular_buffer_begin_addr_p = 0x00000000;
  192. params->circular_buffer_end_addr_p = 0xffffffff;
  193. dev_vdbg(delta->dev,
  194. "%s %s\n", pctx->name,
  195. ipc_open_param_str(params, ctx->str, sizeof(ctx->str)));
  196. ipc_param.size = sizeof(*params);
  197. ipc_param.data = params;
  198. ipc_buf_size = sizeof(struct jpeg_decode_params_t) +
  199. sizeof(struct jpeg_decode_return_params_t);
  200. ret = delta_ipc_open(pctx, "JPEG_DECODER_HW0", &ipc_param,
  201. ipc_buf_size, &ipc_buf, &hdl);
  202. if (ret) {
  203. dev_err(delta->dev,
  204. "%s dumping command %s\n", pctx->name,
  205. ipc_open_param_str(params, ctx->str, sizeof(ctx->str)));
  206. return ret;
  207. }
  208. ctx->ipc_buf = ipc_buf;
  209. ctx->ipc_hdl = hdl;
  210. return 0;
  211. }
  212. static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, struct delta_au *au)
  213. {
  214. struct delta_dev *delta = pctx->dev;
  215. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  216. int ret = 0;
  217. struct jpeg_decode_params_t *params = ctx->ipc_buf->vaddr;
  218. struct jpeg_decode_return_params_t *status =
  219. ctx->ipc_buf->vaddr + sizeof(*params);
  220. struct delta_frame *frame;
  221. struct delta_ipc_param ipc_param, ipc_status;
  222. ret = delta_get_free_frame(pctx, &frame);
  223. if (ret)
  224. return ret;
  225. memset(params, 0, sizeof(*params));
  226. params->picture_start_addr_p = (u32)(au->paddr);
  227. params->picture_end_addr_p = (u32)(au->paddr + au->size - 1);
  228. /*
  229. * !WARNING!
  230. * the NV12 decoded frame is only available
  231. * on decimated output when enabling flag
  232. * "JPEG_ADDITIONAL_FLAG_420MB"...
  233. * the non decimated output gives YUV422SP
  234. */
  235. params->main_aux_enable = JPEG_DISP_AUX_EN;
  236. params->additional_flags = JPEG_ADDITIONAL_FLAG_420MB;
  237. params->horizontal_decimation_factor = JPEG_HDEC_1;
  238. params->vertical_decimation_factor = JPEG_VDEC_1;
  239. params->decoding_mode = JPEG_NORMAL_DECODE;
  240. params->display_buffer_addr.struct_size =
  241. sizeof(struct jpeg_display_buffer_address_t);
  242. params->display_buffer_addr.display_decimated_luma_p =
  243. (u32)frame->paddr;
  244. params->display_buffer_addr.display_decimated_chroma_p =
  245. (u32)(frame->paddr
  246. + frame->info.aligned_width * frame->info.aligned_height);
  247. dev_vdbg(delta->dev,
  248. "%s %s\n", pctx->name,
  249. ipc_decode_param_str(params, ctx->str, sizeof(ctx->str)));
  250. /* status */
  251. memset(status, 0, sizeof(*status));
  252. status->error_code = JPEG_DECODER_NO_ERROR;
  253. ipc_param.size = sizeof(*params);
  254. ipc_param.data = params;
  255. ipc_status.size = sizeof(*status);
  256. ipc_status.data = status;
  257. ret = delta_ipc_decode(ctx->ipc_hdl, &ipc_param, &ipc_status);
  258. if (ret) {
  259. dev_err(delta->dev,
  260. "%s dumping command %s\n", pctx->name,
  261. ipc_decode_param_str(params, ctx->str,
  262. sizeof(ctx->str)));
  263. return ret;
  264. }
  265. pctx->decoded_frames++;
  266. /* check firmware decoding status */
  267. if (delta_mjpeg_check_status(pctx, status)) {
  268. dev_err(delta->dev,
  269. "%s dumping command %s\n", pctx->name,
  270. ipc_decode_param_str(params, ctx->str,
  271. sizeof(ctx->str)));
  272. }
  273. frame->field = V4L2_FIELD_NONE;
  274. frame->flags = V4L2_BUF_FLAG_KEYFRAME;
  275. frame->state |= DELTA_FRAME_DEC;
  276. ctx->out_frame = frame;
  277. return 0;
  278. }
  279. static int delta_mjpeg_open(struct delta_ctx *pctx)
  280. {
  281. struct delta_mjpeg_ctx *ctx;
  282. ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  283. if (!ctx)
  284. return -ENOMEM;
  285. pctx->priv = ctx;
  286. return 0;
  287. }
  288. static int delta_mjpeg_close(struct delta_ctx *pctx)
  289. {
  290. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  291. if (ctx->ipc_hdl) {
  292. delta_ipc_close(ctx->ipc_hdl);
  293. ctx->ipc_hdl = NULL;
  294. }
  295. kfree(ctx);
  296. return 0;
  297. }
  298. static int delta_mjpeg_get_streaminfo(struct delta_ctx *pctx,
  299. struct delta_streaminfo *streaminfo)
  300. {
  301. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  302. if (!ctx->header)
  303. goto nodata;
  304. streaminfo->streamformat = V4L2_PIX_FMT_MJPEG;
  305. streaminfo->width = ctx->header->frame_width;
  306. streaminfo->height = ctx->header->frame_height;
  307. /* progressive stream */
  308. streaminfo->field = V4L2_FIELD_NONE;
  309. streaminfo->dpb = 1;
  310. return 0;
  311. nodata:
  312. return -ENODATA;
  313. }
  314. static int delta_mjpeg_decode(struct delta_ctx *pctx, struct delta_au *pau)
  315. {
  316. struct delta_dev *delta = pctx->dev;
  317. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  318. int ret;
  319. struct delta_au au = *pau;
  320. unsigned int data_offset = 0;
  321. struct mjpeg_header *header = &ctx->header_struct;
  322. if (!ctx->header) {
  323. ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size,
  324. header, &data_offset);
  325. if (ret) {
  326. pctx->stream_errors++;
  327. goto err;
  328. }
  329. if (header->frame_width * header->frame_height >
  330. DELTA_MJPEG_MAX_RESO) {
  331. dev_err(delta->dev,
  332. "%s stream resolution too large: %dx%d > %d pixels budget\n",
  333. pctx->name,
  334. header->frame_width,
  335. header->frame_height, DELTA_MJPEG_MAX_RESO);
  336. ret = -EINVAL;
  337. goto err;
  338. }
  339. ctx->header = header;
  340. goto out;
  341. }
  342. if (!ctx->ipc_hdl) {
  343. ret = delta_mjpeg_ipc_open(pctx);
  344. if (ret)
  345. goto err;
  346. }
  347. ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size,
  348. ctx->header, &data_offset);
  349. if (ret) {
  350. pctx->stream_errors++;
  351. goto err;
  352. }
  353. au.paddr += data_offset;
  354. au.vaddr += data_offset;
  355. ret = delta_mjpeg_ipc_decode(pctx, &au);
  356. if (ret)
  357. goto err;
  358. out:
  359. return 0;
  360. err:
  361. return ret;
  362. }
  363. static int delta_mjpeg_get_frame(struct delta_ctx *pctx,
  364. struct delta_frame **frame)
  365. {
  366. struct delta_mjpeg_ctx *ctx = to_ctx(pctx);
  367. if (!ctx->out_frame)
  368. return -ENODATA;
  369. *frame = ctx->out_frame;
  370. ctx->out_frame = NULL;
  371. return 0;
  372. }
  373. const struct delta_dec mjpegdec = {
  374. .name = "MJPEG",
  375. .streamformat = V4L2_PIX_FMT_MJPEG,
  376. .pixelformat = V4L2_PIX_FMT_NV12,
  377. .open = delta_mjpeg_open,
  378. .close = delta_mjpeg_close,
  379. .get_streaminfo = delta_mjpeg_get_streaminfo,
  380. .get_frameinfo = delta_get_frameinfo_default,
  381. .decode = delta_mjpeg_decode,
  382. .get_frame = delta_mjpeg_get_frame,
  383. .recycle = delta_recycle_default,
  384. };