]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rawdec.c
Combine deprecation guards where appropriate
[ffmpeg] / libavformat / rawdec.c
index 5e95d10efdbed908ead4a462157d8b928bcd4db0..3b1bea642950fc4875601a25b3d92402cd552d11 100644 (file)
@@ -27,6 +27,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/intreadwrite.h"
 
 #define RAW_PACKET_SIZE 1024
 
@@ -43,12 +44,12 @@ int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
     pkt->stream_index = 0;
     ret = ffio_read_partial(s->pb, pkt->data, size);
     if (ret < 0) {
-        av_free_packet(pkt);
+        av_packet_unref(pkt);
         return ret;
     } else if (ret < size) {
         /* initialize end of packet for partial reads to avoid reading
          * uninitialized data on allowed overreads */
-        memset(pkt->data + ret, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+        memset(pkt->data + ret, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
     pkt->size = ret;
     return ret;
@@ -59,8 +60,8 @@ int ff_raw_audio_read_header(AVFormatContext *s)
     AVStream *st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
-    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
-    st->codec->codec_id = s->iformat->raw_codec_id;
+    st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+    st->codecpar->codec_id = s->iformat->raw_codec_id;
     st->need_parsing = AVSTREAM_PARSE_FULL;
     st->start_time = 0;
     /* the parameters will be extracted from the compressed bitstream */
@@ -83,8 +84,8 @@ int ff_raw_video_read_header(AVFormatContext *s)
         goto fail;
     }
 
-    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
-    st->codec->codec_id = s->iformat->raw_codec_id;
+    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+    st->codecpar->codec_id = s->iformat->raw_codec_id;
     st->need_parsing = AVSTREAM_PARSE_FULL;
 
     if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) {
@@ -92,9 +93,6 @@ int ff_raw_video_read_header(AVFormatContext *s)
         goto fail;
     }
 
-#if FF_API_R_FRAME_RATE
-    st->r_frame_rate =
-#endif
     st->avg_frame_rate = framerate;
     avpriv_set_pts_info(st, 64, framerate.den, framerate.num);
 
@@ -112,9 +110,61 @@ const AVOption ff_rawvideo_options[] = {
 };
 
 #if CONFIG_LATM_DEMUXER
+
+#define LOAS_SYNC_WORD 0x2b7
+
+static int latm_read_probe(AVProbeData *p)
+{
+    int max_frames = 0, first_frames = 0;
+    int fsize, frames;
+    uint8_t *buf0 = p->buf;
+    uint8_t *buf2;
+    uint8_t *buf;
+    uint8_t *end = buf0 + p->buf_size - 3;
+
+    buf = buf0;
+
+    for (; buf < end; buf = buf2 + 1) {
+        buf2 = buf;
+
+        for (frames = 0; buf2 < end; frames++) {
+            uint32_t header = AV_RB24(buf2);
+            if ((header >> 13) != LOAS_SYNC_WORD) {
+                if (buf != buf0) {
+                    // Found something that isn't a LOAS header, starting
+                    // from a position other than the start of the buffer.
+                    // Discard the count we've accumulated so far since it
+                    // probably was a false positive.
+                    frames = 0;
+                }
+                break;
+            }
+            fsize = (header & 0x1FFF) + 3;
+            if (fsize < 7)
+                break;
+            buf2 += fsize;
+        }
+        max_frames = FFMAX(max_frames, frames);
+        if (buf == buf0)
+            first_frames = frames;
+    }
+
+    if (first_frames >= 3)
+        return AVPROBE_SCORE_EXTENSION + 1;
+    else if (max_frames > 100)
+        return AVPROBE_SCORE_EXTENSION;
+    else if (max_frames >= 3)
+        return AVPROBE_SCORE_EXTENSION / 2;
+    else if (max_frames > 1)
+        return 1;
+    else
+        return 0;
+}
+
 AVInputFormat ff_latm_demuxer = {
     .name           = "latm",
     .long_name      = NULL_IF_CONFIG_SMALL("raw LOAS/LATM"),
+    .read_probe     = latm_read_probe,
     .read_header    = ff_raw_audio_read_header,
     .read_packet    = ff_raw_read_partial_packet,
     .flags          = AVFMT_GENERIC_INDEX,