Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * RAW demuxers
  3.  * Copyright (c) 2001 Fabrice Bellard
  4.  * Copyright (c) 2005 Alex Beregszaszi
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "avformat.h"
  24. #include "internal.h"
  25. #include "avio_internal.h"
  26. #include "rawdec.h"
  27. #include "libavutil/opt.h"
  28. #include "libavutil/parseutils.h"
  29. #include "libavutil/pixdesc.h"
  30. #include "libavutil/avassert.h"
  31. #include "libavutil/intreadwrite.h"
  32.  
  33. #define RAW_PACKET_SIZE 1024
  34.  
  35. int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
  36. {
  37.     int ret, size;
  38.  
  39.     size = RAW_PACKET_SIZE;
  40.  
  41.     if (av_new_packet(pkt, size) < 0)
  42.         return AVERROR(ENOMEM);
  43.  
  44.     pkt->pos= avio_tell(s->pb);
  45.     pkt->stream_index = 0;
  46.     ret = ffio_read_partial(s->pb, pkt->data, size);
  47.     if (ret < 0) {
  48.         av_free_packet(pkt);
  49.         return ret;
  50.     }
  51.     av_shrink_packet(pkt, ret);
  52.     return ret;
  53. }
  54.  
  55. int ff_raw_audio_read_header(AVFormatContext *s)
  56. {
  57.     AVStream *st = avformat_new_stream(s, NULL);
  58.     if (!st)
  59.         return AVERROR(ENOMEM);
  60.     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  61.     st->codec->codec_id = s->iformat->raw_codec_id;
  62.     st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  63.     st->start_time = 0;
  64.     /* the parameters will be extracted from the compressed bitstream */
  65.  
  66.     return 0;
  67. }
  68.  
  69. /* MPEG-1/H.263 input */
  70. int ff_raw_video_read_header(AVFormatContext *s)
  71. {
  72.     AVStream *st;
  73.     FFRawVideoDemuxerContext *s1 = s->priv_data;
  74.     int ret = 0;
  75.  
  76.  
  77.     st = avformat_new_stream(s, NULL);
  78.     if (!st) {
  79.         ret = AVERROR(ENOMEM);
  80.         goto fail;
  81.     }
  82.  
  83.     st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  84.     st->codec->codec_id = s->iformat->raw_codec_id;
  85.     st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  86.  
  87.     st->codec->framerate = s1->framerate;
  88.     st->codec->time_base = av_inv_q(s1->framerate);
  89.     avpriv_set_pts_info(st, 64, 1, 1200000);
  90.  
  91. fail:
  92.     return ret;
  93. }
  94.  
  95. int ff_raw_data_read_header(AVFormatContext *s)
  96. {
  97.     AVStream *st = avformat_new_stream(s, NULL);
  98.     if (!st)
  99.         return AVERROR(ENOMEM);
  100.     st->codec->codec_type = AVMEDIA_TYPE_DATA;
  101.     st->codec->codec_id = s->iformat->raw_codec_id;
  102.     st->start_time = 0;
  103.     return 0;
  104. }
  105.  
  106. /* Note: Do not forget to add new entries to the Makefile as well. */
  107.  
  108. #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x)
  109. #define DEC AV_OPT_FLAG_DECODING_PARAM
  110. const AVOption ff_rawvideo_options[] = {
  111.     { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0, DEC},
  112.     { NULL },
  113. };
  114.  
  115. #if CONFIG_DATA_DEMUXER
  116. AVInputFormat ff_data_demuxer = {
  117.     .name           = "data",
  118.     .long_name      = NULL_IF_CONFIG_SMALL("raw data"),
  119.     .read_header    = ff_raw_data_read_header,
  120.     .read_packet    = ff_raw_read_partial_packet,
  121.     .raw_codec_id   = AV_CODEC_ID_NONE,
  122.     .flags          = AVFMT_NOTIMESTAMPS,
  123. };
  124. #endif
  125.  
  126. #if CONFIG_LATM_DEMUXER
  127.  
  128. AVInputFormat ff_latm_demuxer = {
  129.     .name           = "latm",
  130.     .long_name      = NULL_IF_CONFIG_SMALL("raw LOAS/LATM"),
  131.     .read_header    = ff_raw_audio_read_header,
  132.     .read_packet    = ff_raw_read_partial_packet,
  133.     .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
  134.     .extensions     = "latm",
  135.     .raw_codec_id   = AV_CODEC_ID_AAC_LATM,
  136. };
  137. #endif
  138.  
  139. #if CONFIG_MJPEG_DEMUXER
  140. static int mjpeg_probe(AVProbeData *p)
  141. {
  142.     int i;
  143.     int state = -1;
  144.     int nb_invalid = 0;
  145.     int nb_frames = 0;
  146.  
  147.     for (i=0; i<p->buf_size-2; i++) {
  148.         int c;
  149.         if (p->buf[i] != 0xFF)
  150.             continue;
  151.         c = p->buf[i+1];
  152.         switch (c) {
  153.         case 0xD8:
  154.             state = 0xD8;
  155.             break;
  156.         case 0xC0:
  157.         case 0xC1:
  158.         case 0xC2:
  159.         case 0xC3:
  160.         case 0xC5:
  161.         case 0xC6:
  162.         case 0xC7:
  163.         case 0xF7:
  164.             if (state == 0xD8) {
  165.                 state = 0xC0;
  166.             } else
  167.                 nb_invalid++;
  168.             break;
  169.         case 0xDA:
  170.             if (state == 0xC0) {
  171.                 state = 0xDA;
  172.             } else
  173.                 nb_invalid++;
  174.             break;
  175.         case 0xD9:
  176.             if (state == 0xDA) {
  177.                 state = 0xD9;
  178.                 nb_frames++;
  179.             } else
  180.                 nb_invalid++;
  181.             break;
  182.         default:
  183.             if (  (c >= 0x02 && c <= 0xBF)
  184.                 || c == 0xC8) {
  185.                 nb_invalid++;
  186.             }
  187.         }
  188.     }
  189.  
  190.     if (nb_invalid*4 + 1 < nb_frames) {
  191.         static const char ct_jpeg[] = "\r\nContent-Type: image/jpeg\r\n";
  192.         int i;
  193.  
  194.         for (i=0; i<FFMIN(p->buf_size - (int)sizeof(ct_jpeg), 100); i++)
  195.             if (!memcmp(p->buf + i, ct_jpeg, sizeof(ct_jpeg) - 1))
  196.                 return AVPROBE_SCORE_EXTENSION;
  197.  
  198.         if (nb_invalid == 0 && nb_frames > 2)
  199.             return AVPROBE_SCORE_EXTENSION / 2;
  200.         return AVPROBE_SCORE_EXTENSION / 4;
  201.     }
  202.  
  203.     return 0;
  204. }
  205.  
  206. FF_DEF_RAWVIDEO_DEMUXER2(mjpeg, "raw MJPEG video", mjpeg_probe, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
  207. #endif
  208.  
  209. #if CONFIG_MLP_DEMUXER
  210. AVInputFormat ff_mlp_demuxer = {
  211.     .name           = "mlp",
  212.     .long_name      = NULL_IF_CONFIG_SMALL("raw MLP"),
  213.     .read_header    = ff_raw_audio_read_header,
  214.     .read_packet    = ff_raw_read_partial_packet,
  215.     .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
  216.     .extensions     = "mlp",
  217.     .raw_codec_id   = AV_CODEC_ID_MLP,
  218. };
  219. #endif
  220.  
  221. #if CONFIG_TRUEHD_DEMUXER
  222. AVInputFormat ff_truehd_demuxer = {
  223.     .name           = "truehd",
  224.     .long_name      = NULL_IF_CONFIG_SMALL("raw TrueHD"),
  225.     .read_header    = ff_raw_audio_read_header,
  226.     .read_packet    = ff_raw_read_partial_packet,
  227.     .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
  228.     .extensions     = "thd",
  229.     .raw_codec_id   = AV_CODEC_ID_TRUEHD,
  230. };
  231. #endif
  232.  
  233. #if CONFIG_SHORTEN_DEMUXER
  234. AVInputFormat ff_shorten_demuxer = {
  235.     .name           = "shn",
  236.     .long_name      = NULL_IF_CONFIG_SMALL("raw Shorten"),
  237.     .read_header    = ff_raw_audio_read_header,
  238.     .read_packet    = ff_raw_read_partial_packet,
  239.     .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK|AVFMT_NOTIMESTAMPS,
  240.     .extensions     = "shn",
  241.     .raw_codec_id   = AV_CODEC_ID_SHORTEN,
  242. };
  243. #endif
  244.  
  245. #if CONFIG_VC1_DEMUXER
  246. FF_DEF_RAWVIDEO_DEMUXER2(vc1, "raw VC-1", NULL, "vc1", AV_CODEC_ID_VC1, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
  247. #endif
  248.