ingenientdec.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * RAW Ingenient MJPEG demuxer
  3. * Copyright (c) 2005 Alex Beregszaszi
  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. #include "avformat.h"
  22. #include "rawdec.h"
  23. // http://www.artificis.hu/files/texts/ingenient.txt
  24. static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
  25. {
  26. int ret, size, w, h, unk1, unk2;
  27. if (avio_rl32(s->pb) != MKTAG('M', 'J', 'P', 'G'))
  28. return AVERROR(EIO); // FIXME
  29. size = avio_rl32(s->pb);
  30. w = avio_rl16(s->pb);
  31. h = avio_rl16(s->pb);
  32. avio_skip(s->pb, 8); // zero + size (padded?)
  33. avio_skip(s->pb, 2);
  34. unk1 = avio_rl16(s->pb);
  35. unk2 = avio_rl16(s->pb);
  36. avio_skip(s->pb, 22); // ASCII timestamp
  37. av_log(s, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
  38. size, w, h, unk1, unk2);
  39. if (av_new_packet(pkt, size) < 0)
  40. return AVERROR(ENOMEM);
  41. pkt->pos = avio_tell(s->pb);
  42. pkt->stream_index = 0;
  43. ret = avio_read(s->pb, pkt->data, size);
  44. if (ret < 0) {
  45. av_free_packet(pkt);
  46. return ret;
  47. }
  48. pkt->size = ret;
  49. return ret;
  50. }
  51. AVInputFormat ff_ingenient_demuxer = {
  52. .name = "ingenient",
  53. .long_name = NULL_IF_CONFIG_SMALL("raw Ingenient MJPEG"),
  54. .priv_data_size = sizeof(FFRawVideoDemuxerContext),
  55. .read_header = ff_raw_video_read_header,
  56. .read_packet = ingenient_read_packet,
  57. .flags= AVFMT_GENERIC_INDEX,
  58. .extensions = "cgi", // FIXME
  59. .value = CODEC_ID_MJPEG,
  60. .priv_class = &ff_rawvideo_demuxer_class,
  61. };