You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

375 lines
14KB

  1. /*
  2. * Raw Video Decoder
  3. * Copyright (c) 2001 Fabrice Bellard
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * Raw Video Decoder
  24. */
  25. #include "avcodec.h"
  26. #include "internal.h"
  27. #include "raw.h"
  28. #include "libavutil/avassert.h"
  29. #include "libavutil/buffer.h"
  30. #include "libavutil/common.h"
  31. #include "libavutil/intreadwrite.h"
  32. #include "libavutil/imgutils.h"
  33. #include "libavutil/opt.h"
  34. typedef struct RawVideoContext {
  35. AVClass *av_class;
  36. AVBufferRef *palette;
  37. int frame_size; /* size of the frame in bytes */
  38. int flip;
  39. int is_2_4_bpp; // 2 or 4 bpp raw in avi/mov
  40. int is_yuv2;
  41. int is_lt_16bpp; // 16bpp pixfmt and bits_per_coded_sample < 16
  42. int tff;
  43. } RawVideoContext;
  44. static const AVOption options[]={
  45. {"top", "top field first", offsetof(RawVideoContext, tff), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM|AV_OPT_FLAG_VIDEO_PARAM},
  46. {NULL}
  47. };
  48. static const AVClass rawdec_class = {
  49. .class_name = "rawdec",
  50. .option = options,
  51. .version = LIBAVUTIL_VERSION_INT,
  52. };
  53. static const PixelFormatTag pix_fmt_bps_avi[] = {
  54. { AV_PIX_FMT_MONOWHITE, 1 },
  55. { AV_PIX_FMT_PAL8, 2 },
  56. { AV_PIX_FMT_PAL8, 4 },
  57. { AV_PIX_FMT_PAL8, 8 },
  58. { AV_PIX_FMT_RGB444LE, 12 },
  59. { AV_PIX_FMT_RGB555LE, 15 },
  60. { AV_PIX_FMT_RGB555LE, 16 },
  61. { AV_PIX_FMT_BGR24, 24 },
  62. { AV_PIX_FMT_BGRA, 32 },
  63. { AV_PIX_FMT_NONE, 0 },
  64. };
  65. static const PixelFormatTag pix_fmt_bps_mov[] = {
  66. { AV_PIX_FMT_MONOWHITE, 1 },
  67. { AV_PIX_FMT_PAL8, 2 },
  68. { AV_PIX_FMT_PAL8, 4 },
  69. { AV_PIX_FMT_PAL8, 8 },
  70. // FIXME swscale does not support 16 bit in .mov, sample 16bit.mov
  71. // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
  72. { AV_PIX_FMT_RGB555BE, 16 },
  73. { AV_PIX_FMT_RGB24, 24 },
  74. { AV_PIX_FMT_ARGB, 32 },
  75. { AV_PIX_FMT_MONOWHITE,33 },
  76. { AV_PIX_FMT_NONE, 0 },
  77. };
  78. enum AVPixelFormat avpriv_find_pix_fmt(const PixelFormatTag *tags,
  79. unsigned int fourcc)
  80. {
  81. while (tags->pix_fmt >= 0) {
  82. if (tags->fourcc == fourcc)
  83. return tags->pix_fmt;
  84. tags++;
  85. }
  86. return AV_PIX_FMT_NONE;
  87. }
  88. #if LIBAVCODEC_VERSION_MAJOR < 55
  89. enum AVPixelFormat ff_find_pix_fmt(const PixelFormatTag *tags, unsigned int fourcc)
  90. {
  91. return avpriv_find_pix_fmt(tags, fourcc);
  92. }
  93. #endif
  94. static av_cold int raw_init_decoder(AVCodecContext *avctx)
  95. {
  96. RawVideoContext *context = avctx->priv_data;
  97. const AVPixFmtDescriptor *desc;
  98. if ( avctx->codec_tag == MKTAG('r','a','w',' ')
  99. || avctx->codec_tag == MKTAG('N','O','1','6'))
  100. avctx->pix_fmt = avpriv_find_pix_fmt(pix_fmt_bps_mov,
  101. avctx->bits_per_coded_sample);
  102. else if (avctx->codec_tag == MKTAG('W', 'R', 'A', 'W'))
  103. avctx->pix_fmt = avpriv_find_pix_fmt(pix_fmt_bps_avi,
  104. avctx->bits_per_coded_sample);
  105. else if (avctx->codec_tag)
  106. avctx->pix_fmt = avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, avctx->codec_tag);
  107. else if (avctx->pix_fmt == AV_PIX_FMT_NONE && avctx->bits_per_coded_sample)
  108. avctx->pix_fmt = avpriv_find_pix_fmt(pix_fmt_bps_avi,
  109. avctx->bits_per_coded_sample);
  110. desc = av_pix_fmt_desc_get(avctx->pix_fmt);
  111. if (!desc) {
  112. av_log(avctx, AV_LOG_ERROR, "Invalid pixel format.\n");
  113. return AVERROR(EINVAL);
  114. }
  115. if (desc->flags & (AV_PIX_FMT_FLAG_PAL | AV_PIX_FMT_FLAG_PSEUDOPAL)) {
  116. context->palette = av_buffer_alloc(AVPALETTE_SIZE);
  117. if (!context->palette)
  118. return AVERROR(ENOMEM);
  119. if (desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)
  120. avpriv_set_systematic_pal2((uint32_t*)context->palette->data, avctx->pix_fmt);
  121. else
  122. memset(context->palette->data, 0, AVPALETTE_SIZE);
  123. }
  124. if ((avctx->bits_per_coded_sample == 4 || avctx->bits_per_coded_sample == 2) &&
  125. avctx->pix_fmt == AV_PIX_FMT_PAL8 &&
  126. (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))) {
  127. context->is_2_4_bpp = 1;
  128. context->frame_size = avpicture_get_size(avctx->pix_fmt,
  129. FFALIGN(avctx->width, 16),
  130. avctx->height);
  131. } else {
  132. context->is_lt_16bpp = av_get_bits_per_pixel(desc) == 16 && avctx->bits_per_coded_sample && avctx->bits_per_coded_sample < 16;
  133. context->frame_size = avpicture_get_size(avctx->pix_fmt, avctx->width,
  134. avctx->height);
  135. }
  136. if ((avctx->extradata_size >= 9 &&
  137. !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9)) ||
  138. avctx->codec_tag == MKTAG('c','y','u','v') ||
  139. avctx->codec_tag == MKTAG(3, 0, 0, 0) ||
  140. avctx->codec_tag == MKTAG('W','R','A','W'))
  141. context->flip = 1;
  142. if (avctx->codec_tag == AV_RL32("yuv2") &&
  143. avctx->pix_fmt == AV_PIX_FMT_YUYV422)
  144. context->is_yuv2 = 1;
  145. return 0;
  146. }
  147. static void flip(AVCodecContext *avctx, AVPicture *picture)
  148. {
  149. picture->data[0] += picture->linesize[0] * (avctx->height - 1);
  150. picture->linesize[0] *= -1;
  151. }
  152. static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
  153. AVPacket *avpkt)
  154. {
  155. const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
  156. RawVideoContext *context = avctx->priv_data;
  157. const uint8_t *buf = avpkt->data;
  158. int buf_size = avpkt->size;
  159. int linesize_align = 4;
  160. int res, len;
  161. int need_copy = !avpkt->buf || context->is_2_4_bpp || context->is_yuv2 || context->is_lt_16bpp;
  162. AVFrame *frame = data;
  163. AVPicture *picture = data;
  164. frame->pict_type = AV_PICTURE_TYPE_I;
  165. frame->key_frame = 1;
  166. frame->reordered_opaque = avctx->reordered_opaque;
  167. frame->pkt_pts = avctx->internal->pkt->pts;
  168. av_frame_set_pkt_pos (frame, avctx->internal->pkt->pos);
  169. av_frame_set_pkt_duration(frame, avctx->internal->pkt->duration);
  170. if (context->tff >= 0) {
  171. frame->interlaced_frame = 1;
  172. frame->top_field_first = context->tff;
  173. }
  174. if ((res = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
  175. return res;
  176. if (need_copy)
  177. frame->buf[0] = av_buffer_alloc(FFMAX(context->frame_size, buf_size));
  178. else
  179. frame->buf[0] = av_buffer_ref(avpkt->buf);
  180. if (!frame->buf[0])
  181. return AVERROR(ENOMEM);
  182. //2bpp and 4bpp raw in avi and mov (yes this is ugly ...)
  183. if (context->is_2_4_bpp) {
  184. int i;
  185. uint8_t *dst = frame->buf[0]->data;
  186. buf_size = context->frame_size - AVPALETTE_SIZE;
  187. if (avctx->bits_per_coded_sample == 4) {
  188. for (i = 0; 2 * i + 1 < buf_size && i<avpkt->size; i++) {
  189. dst[2 * i + 0] = buf[i] >> 4;
  190. dst[2 * i + 1] = buf[i] & 15;
  191. }
  192. linesize_align = 8;
  193. } else {
  194. av_assert0(avctx->bits_per_coded_sample == 2);
  195. for (i = 0; 4 * i + 3 < buf_size && i<avpkt->size; i++) {
  196. dst[4 * i + 0] = buf[i] >> 6;
  197. dst[4 * i + 1] = buf[i] >> 4 & 3;
  198. dst[4 * i + 2] = buf[i] >> 2 & 3;
  199. dst[4 * i + 3] = buf[i] & 3;
  200. }
  201. linesize_align = 16;
  202. }
  203. buf = dst;
  204. } else if (context->is_lt_16bpp) {
  205. int i;
  206. uint8_t *dst = frame->buf[0]->data;
  207. if (desc->flags & AV_PIX_FMT_FLAG_BE) {
  208. for (i = 0; i + 1 < buf_size; i += 2)
  209. AV_WB16(dst + i, AV_RB16(buf + i) << (16 - avctx->bits_per_coded_sample));
  210. } else {
  211. for (i = 0; i + 1 < buf_size; i += 2)
  212. AV_WL16(dst + i, AV_RL16(buf + i) << (16 - avctx->bits_per_coded_sample));
  213. }
  214. buf = dst;
  215. } else if (need_copy) {
  216. memcpy(frame->buf[0]->data, buf, buf_size);
  217. buf = frame->buf[0]->data;
  218. }
  219. if (avctx->codec_tag == MKTAG('A', 'V', '1', 'x') ||
  220. avctx->codec_tag == MKTAG('A', 'V', 'u', 'p'))
  221. buf += buf_size - context->frame_size;
  222. len = context->frame_size - (avctx->pix_fmt==AV_PIX_FMT_PAL8 ? AVPALETTE_SIZE : 0);
  223. if (buf_size < len) {
  224. av_log(avctx, AV_LOG_ERROR, "Invalid buffer size, packet size %d < expected frame_size %d\n", buf_size, len);
  225. av_buffer_unref(&frame->buf[0]);
  226. return AVERROR(EINVAL);
  227. }
  228. if ((res = avpicture_fill(picture, buf, avctx->pix_fmt,
  229. avctx->width, avctx->height)) < 0) {
  230. av_buffer_unref(&frame->buf[0]);
  231. return res;
  232. }
  233. if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
  234. const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE,
  235. NULL);
  236. if (pal) {
  237. av_buffer_unref(&context->palette);
  238. context->palette = av_buffer_alloc(AVPALETTE_SIZE);
  239. if (!context->palette) {
  240. av_buffer_unref(&frame->buf[0]);
  241. return AVERROR(ENOMEM);
  242. }
  243. memcpy(context->palette->data, pal, AVPALETTE_SIZE);
  244. frame->palette_has_changed = 1;
  245. }
  246. }
  247. if ((avctx->pix_fmt==AV_PIX_FMT_BGR24 ||
  248. avctx->pix_fmt==AV_PIX_FMT_GRAY8 ||
  249. avctx->pix_fmt==AV_PIX_FMT_RGB555LE ||
  250. avctx->pix_fmt==AV_PIX_FMT_RGB555BE ||
  251. avctx->pix_fmt==AV_PIX_FMT_RGB565LE ||
  252. avctx->pix_fmt==AV_PIX_FMT_MONOWHITE ||
  253. avctx->pix_fmt==AV_PIX_FMT_PAL8) &&
  254. FFALIGN(frame->linesize[0], linesize_align) * avctx->height <= buf_size)
  255. frame->linesize[0] = FFALIGN(frame->linesize[0], linesize_align);
  256. if (avctx->pix_fmt == AV_PIX_FMT_NV12 && avctx->codec_tag == MKTAG('N', 'V', '1', '2') &&
  257. FFALIGN(frame->linesize[0], linesize_align) * avctx->height +
  258. FFALIGN(frame->linesize[1], linesize_align) * ((avctx->height + 1) / 2) <= buf_size) {
  259. int la0 = FFALIGN(frame->linesize[0], linesize_align);
  260. frame->data[1] += (la0 - frame->linesize[0]) * avctx->height;
  261. frame->linesize[0] = la0;
  262. frame->linesize[1] = FFALIGN(frame->linesize[1], linesize_align);
  263. }
  264. if ((avctx->pix_fmt == AV_PIX_FMT_PAL8 && buf_size < context->frame_size) ||
  265. (desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)) {
  266. frame->buf[1] = av_buffer_ref(context->palette);
  267. if (!frame->buf[1]) {
  268. av_buffer_unref(&frame->buf[0]);
  269. return AVERROR(ENOMEM);
  270. }
  271. frame->data[1] = frame->buf[1]->data;
  272. }
  273. if (avctx->pix_fmt == AV_PIX_FMT_BGR24 &&
  274. ((frame->linesize[0] + 3) & ~3) * avctx->height <= buf_size)
  275. frame->linesize[0] = (frame->linesize[0] + 3) & ~3;
  276. if (context->flip)
  277. flip(avctx, picture);
  278. if (avctx->codec_tag == MKTAG('Y', 'V', '1', '2') ||
  279. avctx->codec_tag == MKTAG('Y', 'V', '1', '6') ||
  280. avctx->codec_tag == MKTAG('Y', 'V', '2', '4') ||
  281. avctx->codec_tag == MKTAG('Y', 'V', 'U', '9'))
  282. FFSWAP(uint8_t *, picture->data[1], picture->data[2]);
  283. if (avctx->codec_tag == AV_RL32("I420") && (avctx->width+1)*(avctx->height+1) * 3/2 == buf_size) {
  284. picture->data[1] = picture->data[1] + (avctx->width+1)*(avctx->height+1) -avctx->width*avctx->height;
  285. picture->data[2] = picture->data[2] + ((avctx->width+1)*(avctx->height+1) -avctx->width*avctx->height)*5/4;
  286. }
  287. if (avctx->codec_tag == AV_RL32("yuv2") &&
  288. avctx->pix_fmt == AV_PIX_FMT_YUYV422) {
  289. int x, y;
  290. uint8_t *line = picture->data[0];
  291. for (y = 0; y < avctx->height; y++) {
  292. for (x = 0; x < avctx->width; x++)
  293. line[2 * x + 1] ^= 0x80;
  294. line += picture->linesize[0];
  295. }
  296. }
  297. if (avctx->codec_tag == AV_RL32("YVYU") &&
  298. avctx->pix_fmt == AV_PIX_FMT_YUYV422) {
  299. int x, y;
  300. uint8_t *line = picture->data[0];
  301. for(y = 0; y < avctx->height; y++) {
  302. for(x = 0; x < avctx->width - 1; x += 2)
  303. FFSWAP(uint8_t, line[2*x + 1], line[2*x + 3]);
  304. line += picture->linesize[0];
  305. }
  306. }
  307. if (avctx->field_order > AV_FIELD_PROGRESSIVE) { /* we have interlaced material flagged in container */
  308. frame->interlaced_frame = 1;
  309. if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
  310. frame->top_field_first = 1;
  311. }
  312. *got_frame = 1;
  313. return buf_size;
  314. }
  315. static av_cold int raw_close_decoder(AVCodecContext *avctx)
  316. {
  317. RawVideoContext *context = avctx->priv_data;
  318. av_buffer_unref(&context->palette);
  319. return 0;
  320. }
  321. AVCodec ff_rawvideo_decoder = {
  322. .name = "rawvideo",
  323. .long_name = NULL_IF_CONFIG_SMALL("raw video"),
  324. .type = AVMEDIA_TYPE_VIDEO,
  325. .id = AV_CODEC_ID_RAWVIDEO,
  326. .priv_data_size = sizeof(RawVideoContext),
  327. .init = raw_init_decoder,
  328. .close = raw_close_decoder,
  329. .decode = raw_decode,
  330. .priv_class = &rawdec_class,
  331. };