]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtpdec_vp9.c
avformat/avidec: use avpriv_find_start_code in avi_read_packet()
[ffmpeg] / libavformat / rtpdec_vp9.c
index b5e4e981e89840fd1729c42c24c4a93cb976fb2a..e50bedea32dc5bd1c3763fe77bc5a53ff52e75dc 100644 (file)
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  */
 
-#include "libavcodec/bytestream.h"
+#include "libavutil/intreadwrite.h"
 
 #include "avio_internal.h"
 #include "rtpdec_formats.h"
@@ -33,17 +32,11 @@ struct PayloadContext {
 };
 
 static av_cold int vp9_init(AVFormatContext *ctx, int st_index,
-                             PayloadContext *data)
+                            PayloadContext *data)
 {
-    av_dlog(ctx, "vp9_init() for stream %d\n", st_index);
     av_log(ctx, AV_LOG_WARNING,
            "RTP/VP9 support is still experimental\n");
 
-    if (st_index < 0)
-        return 0;
-
-    ctx->streams[st_index]->need_parsing = AVSTREAM_PARSE_FULL;
-
     return 0;
 }
 
@@ -57,12 +50,12 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     av_unused int layer_temporal = -1, layer_spatial = -1, layer_quality = -1;
     int ref_fields = 0, has_ref_field_ext_pic_id = 0;
     int first_fragment, last_fragment;
+    int rtp_m;
     int res = 0;
 
     /* drop data of previous packets in case of non-continuous (lossy) packet stream */
-    if (rtp_vp9_ctx->buf && rtp_vp9_ctx->timestamp != *timestamp) {
+    if (rtp_vp9_ctx->buf && rtp_vp9_ctx->timestamp != *timestamp)
         ffio_free_dyn_buf(&rtp_vp9_ctx->buf);
-    }
 
     /* sanity check for size of input packet: 1 byte payload at least */
     if (len < RTP_VP9_DESC_REQUIRED_SIZE + 1) {
@@ -71,32 +64,34 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     }
 
     /*
-      decode the required VP9 payload descriptor according to section 4.2 of the spec.:
-
-            0 1 2 3 4 5 6 7
-           +-+-+-+-+-+-+-+-+
-           |I|L|F|B|E|V|U|-| (REQUIRED)
-           +-+-+-+-+-+-+-+-+
-
-           I: PictureID present
-           L: Layer indices present
-           F: Reference indices present
-           B: Start of VP9 frame
-           E: End of picture
-           V: Scalability Structure (SS) present
-           U: Scalability Structure Update (SU) present
-    */
-    has_pic_id     = buf[0] & 0x80;
-    has_layer_idc  = buf[0] & 0x40;
-    has_ref_idc    = buf[0] & 0x20;
-    first_fragment = buf[0] & 0x10;
-    last_fragment  = buf[0] & 0x08;
-    has_ss_data    = buf[0] & 0x04;
-    has_su_data    = buf[0] & 0x02;
+     *     decode the required VP9 payload descriptor according to section 4.2 of the spec.:
+     *
+     *      0 1 2 3 4 5 6 7
+     *     +-+-+-+-+-+-+-+-+
+     *     |I|L|F|B|E|V|U|-| (REQUIRED)
+     *     +-+-+-+-+-+-+-+-+
+     *
+     *     I: PictureID present
+     *     L: Layer indices present
+     *     F: Reference indices present
+     *     B: Start of VP9 frame
+     *     E: End of picture
+     *     V: Scalability Structure (SS) present
+     *     U: Scalability Structure Update (SU) present
+     */
+    has_pic_id     = !!(buf[0] & 0x80);
+    has_layer_idc  = !!(buf[0] & 0x40);
+    has_ref_idc    = !!(buf[0] & 0x20);
+    first_fragment = !!(buf[0] & 0x10);
+    last_fragment  = !!(buf[0] & 0x08);
+    has_ss_data    = !!(buf[0] & 0x04);
+    has_su_data    = !!(buf[0] & 0x02);
+
+    rtp_m = !!(flags & RTP_FLAG_MARKER);
 
     /* sanity check for markers: B should always be equal to the RTP M marker */
-    if (last_fragment >> 2 != flags & RTP_FLAG_MARKER) {
-        av_log(ctx, AV_LOG_ERROR, "Invalid combination of B and M marker\n");
+    if (last_fragment != rtp_m) {
+        av_log(ctx, AV_LOG_ERROR, "Invalid combination of B and M marker (%d != %d)\n", last_fragment, rtp_m);
         return AVERROR_INVALIDDATA;
     }
 
@@ -105,24 +100,19 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     len -= RTP_VP9_DESC_REQUIRED_SIZE;
 
     /*
-      decode the 1-byte/2-byte picture ID:
-
-            0 1 2 3 4 5 6 7
-           +-+-+-+-+-+-+-+-+
-   I:      |M|PICTURE ID   | (RECOMMENDED)
-           +-+-+-+-+-+-+-+-+
-   M:      | EXTENDED PID  | (RECOMMENDED)
-           +-+-+-+-+-+-+-+-+
-
-           M: The most significant bit of the first octet is an extension flag.
-           PictureID:  8 or 16 bits including the M bit.
+     *         decode the 1-byte/2-byte picture ID:
+     *
+     *          0 1 2 3 4 5 6 7
+     *         +-+-+-+-+-+-+-+-+
+     *   I:    |M|PICTURE ID   | (RECOMMENDED)
+     *         +-+-+-+-+-+-+-+-+
+     *   M:    | EXTENDED PID  | (RECOMMENDED)
+     *         +-+-+-+-+-+-+-+-+
+     *
+     *   M: The most significant bit of the first octet is an extension flag.
+     *   PictureID:  8 or 16 bits including the M bit.
      */
     if (has_pic_id) {
-        if (len < 1) {
-            av_log(ctx, AV_LOG_ERROR, "Too short RTP/VP9 packet\n");
-            return AVERROR_INVALIDDATA;
-        }
-
         /* check for 1-byte or 2-byte picture index */
         if (buf[0] & 0x80) {
             if (len < 2) {
@@ -140,20 +130,20 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     }
 
     /*
-      decode layer indices
-
-            0 1 2 3 4 5 6 7
-           +-+-+-+-+-+-+-+-+
-   L:      | T | S | Q | R | (CONDITIONALLY RECOMMENDED)
-           +-+-+-+-+-+-+-+-+
-
-           T, S and Q are 2-bit indices for temporal, spatial, and quality layers.
-           If "F" is set in the initial octet, R is 2 bits representing the number
-           of reference fields this frame refers to.
+     *         decode layer indices
+     *
+     *          0 1 2 3 4 5 6 7
+     *         +-+-+-+-+-+-+-+-+
+     *   L:    | T | S | Q | R | (CONDITIONALLY RECOMMENDED)
+     *         +-+-+-+-+-+-+-+-+
+     *
+     *   T, S and Q are 2-bit indices for temporal, spatial, and quality layers.
+     *   If "F" is set in the initial octet, R is 2 bits representing the number
+     *   of reference fields this frame refers to.
      */
     if (has_layer_idc) {
         if (len < 1) {
-            av_log(ctx, AV_LOG_ERROR, "Too short RTP/VP9 packet");
+            av_log(ctx, AV_LOG_ERROR, "Too short RTP/VP9 packet\n");
             return AVERROR_INVALIDDATA;
         }
         layer_temporal = buf[0] & 0xC0;
@@ -169,18 +159,18 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     }
 
     /*
-      decode the reference fields
-
-            0 1 2 3 4 5 6 7
-           +-+-+-+-+-+-+-+-+              -\
-   F:      | PID |X| RS| RQ| (OPTIONAL)    .
-           +-+-+-+-+-+-+-+-+               . - R times
-   X:      | EXTENDED PID  | (OPTIONAL)    .
-           +-+-+-+-+-+-+-+-+              -/
-
-           PID:  The relative Picture ID referred to by this frame.
-           RS and RQ:  The spatial and quality layer IDs.
-           X: 1 if this layer index has an extended relative Picture ID.
+     *         decode the reference fields
+     *
+     *          0 1 2 3 4 5 6 7
+     *         +-+-+-+-+-+-+-+-+              -\
+     *   F:    | PID |X| RS| RQ| (OPTIONAL)    .
+     *         +-+-+-+-+-+-+-+-+               . - R times
+     *   X:    | EXTENDED PID  | (OPTIONAL)    .
+     *         +-+-+-+-+-+-+-+-+              -/
+     *
+     *   PID:  The relative Picture ID referred to by this frame.
+     *   RS and RQ:  The spatial and quality layer IDs.
+     *   X: 1 if this layer index has an extended relative Picture ID.
      */
     if (has_ref_idc) {
         while (ref_fields) {
@@ -214,42 +204,42 @@ static int vp9_handle_packet(AVFormatContext *ctx, PayloadContext *rtp_vp9_ctx,
     }
 
     /*
-      decode the scalability structure (SS)
-
-            0 1 2 3 4 5 6 7
-           +-+-+-+-+-+-+-+-+
-      V:   | PATTERN LENGTH|
-           +-+-+-+-+-+-+-+-+                           -\
-           | T | S | Q | R | (OPTIONAL)                 .
-           +-+-+-+-+-+-+-+-+              -\            .
-           | PID |X| RS| RQ| (OPTIONAL)    .            . - PAT. LEN. times
-           +-+-+-+-+-+-+-+-+               . - R times  .
-      X:   | EXTENDED PID  | (OPTIONAL)    .            .
-           +-+-+-+-+-+-+-+-+              -/           -/
-
-           PID:  The relative Picture ID referred to by this frame.
-           RS and RQ:  The spatial and quality layer IDs.
-           X: 1 if this layer index has an extended relative Picture ID.
+     *         decode the scalability structure (SS)
+     *
+     *          0 1 2 3 4 5 6 7
+     *         +-+-+-+-+-+-+-+-+
+     *   V:    | PATTERN LENGTH|
+     *         +-+-+-+-+-+-+-+-+                           -\
+     *         | T | S | Q | R | (OPTIONAL)                 .
+     *         +-+-+-+-+-+-+-+-+              -\            .
+     *         | PID |X| RS| RQ| (OPTIONAL)    .            . - PAT. LEN. times
+     *         +-+-+-+-+-+-+-+-+               . - R times  .
+     *   X:    | EXTENDED PID  | (OPTIONAL)    .            .
+     *         +-+-+-+-+-+-+-+-+              -/           -/
+     *
+     *   PID:  The relative Picture ID referred to by this frame.
+     *   RS and RQ:  The spatial and quality layer IDs.
+     *   X: 1 if this layer index has an extended relative Picture ID.
      */
     if (has_ss_data) {
-        avpriv_report_missing_feature(ctx, "VP9 scalability structure data\n");
-        return AVERROR_PATCHWELCOME;
+        avpriv_report_missing_feature(ctx, "VP9 scalability structure data");
+        return AVERROR(ENOSYS);
     }
 
     /*
-      decode the scalability update structure (SU)
-
-        spec. is tbd
+     * decode the scalability update structure (SU)
+     *
+     *  spec. is tbd
      */
     if (has_su_data) {
-        avpriv_report_missing_feature(ctx, "VP9 scalability update structure data\n");
-        return AVERROR_PATCHWELCOME;
+        avpriv_report_missing_feature(ctx, "VP9 scalability update structure data");
+        return AVERROR(ENOSYS);
     }
 
     /*
-      decode the VP9 payload header
-
-        spec. is tbd
+     * decode the VP9 payload header
+     *
+     *  spec. is tbd
      */
     //XXX: implement when specified
 
@@ -293,7 +283,7 @@ RTPDynamicProtocolHandler ff_vp9_dynamic_handler = {
     .enc_name         = "VP9",
     .codec_type       = AVMEDIA_TYPE_VIDEO,
     .codec_id         = AV_CODEC_ID_VP9,
-    .init             = vp9_init,
     .priv_data_size   = sizeof(PayloadContext),
+    .init             = vp9_init,
     .parse_packet     = vp9_handle_packet
 };