ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VLIB / P263 / p263_layers.h
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/P263/p263_layers.h b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VLIB/P263/p263_layers.h
new file mode 100644 (file)
index 0000000..d88df80
--- /dev/null
@@ -0,0 +1,109 @@
+#ifndef _P263_LAYERS_H_
+#define _P263_LAYERS_H_
+
+#include <VP_Os/vp_os_types.h>
+#include <VLIB/video_macroblock.h>
+
+#define MAKE_START_CODE(gob)      ( 0x000020 | (gob) )
+#define PICTURE_START_CODE        MAKE_START_CODE(0)
+
+#define PICTURE_FORMAT(a)         ( (a) & 7 )
+#define PICTURE_TYPE(a)           ( ((a) & 1) + ((a) & 16) )  /* This 'trick' works because if bit 1 is 0 */
+                                                              /* then bit 5 must be 0 */
+#define PICTURE_EXTENDED_TYPE(a)  ( ((a) >> 6) & 7 )
+
+#define HAS_CUSTOM_PICTURE_FORMAT(a)            ( ((a) >> 15) == 6 )
+#define HAS_CUSTOM_PCF(a)                       ( ((a) >> 14) == 1 )
+#define HAS_UNRESTRICTED_MOTION_VECTOR(a)       ( ((a) >> 13) == 1 )
+#define HAS_SYNTAX_BASED_ARITHMETIC_CODING(a)   ( ((a) >> 12) == 1 )
+#define HAS_ADVANCED_PREDICTION(a)              ( ((a) >> 11) == 1 )
+#define HAS_ADVANCED_INTRA_CODING(a)            ( ((a) >> 10) == 1 )
+#define HAS_DEBLOCKING_FILTER(a)                ( ((a) >>  9) == 1 )
+#define HAS_SLICE_STRUCTURED(a)                 ( ((a) >>  8) == 1 )
+#define HAS_REFERENCE_PICTURE_SELECTION(a)      ( ((a) >>  7) == 1 )
+#define HAS_INDEPENDENT_SEGMENT_DECODING(a)     ( ((a) >>  6) == 1 )
+#define HAS_ALTERNATIVE_INTER_VLC(a)            ( ((a) >>  5) == 1 )
+#define HAS_MODIFIED_QUANTIZATION(a)            ( ((a) >>  4) == 1 )
+#define HAS_REFERENCE_PICTURE_RESAMPLING(a)     ( ((a) >>  5) == 1 )
+
+typedef enum _p263_picture_format {
+  P263_PICTURE_FORMAT_FORBIDDEN = 0,
+  P263_PICTURE_FORMAT_SUBQCIF,
+  P263_PICTURE_FORMAT_QCIF,
+  P263_PICTURE_FORMAT_CIF,
+  P263_PICTURE_FORMAT_4QCIF,
+  P263_PICTURE_FORMAT_16CIF,
+  P263_PICTURE_FORMAT_RESERVED,
+  P263_PICTURE_FORMAT_EXTENDED
+} p263_picture_format;
+
+typedef struct _p263_gob_layer_t {
+  video_macroblock_t* macroblocks;  // macroblocks data
+  uint32_t gquant;                  // Quantizer Information (GQUANT)
+  //uint32_t gn;                      // Group Number (GN)
+  //uint32_t gsbi;                    // GOB Sub-Bitstream Indicator (GSBI)
+  //uint32_t gfid;                    // GOB Frame ID (GFID) 
+} p263_gob_layer_t;
+
+typedef struct _p263_picture_layer_t {
+  uint32_t  opptype;                // optional part of PLUSPTYPE (18 bits)
+  uint32_t  tr;                     // Temporal reference (8 bits)
+  uint32_t  cpcfc;                  // Custom Picture Clock Frequency Code (CPCFC) (8 bits)
+  uint32_t  etr;                    // Extended Temporal Reference (ETR) (2 bits)
+  uint32_t  uui;                    // Unlimited Unrestricted Motion Vectors Indicator (UUI) (Variable length)
+  uint32_t  ptype;                  // Type information (8 ou 13 bits)
+  uint32_t  epar;                   // Extended Pixel Aspect Ratio (EPAR) (16 bits)
+  uint32_t  plusptype;              // Type information extended (12 bits)
+  uint32_t  cpfmt;                  // Custom Picture Format (CPFMT) (23 bits)
+  uint32_t  trp;                    // Temporal Reference for Prediction (TRP) (10 bits)
+  uint32_t  sss;                    // Slice Structured Submode bits (SSS) (2 bits)
+  uint32_t  elnum;                  // Enhancement Layer Number (ELNUM) (4 bits)
+  uint32_t  rlnum;                  // Reference Layer Number (RLNUM) (4 bits)
+  uint32_t  rpsmf;                  // Reference Picture Selection Mode Flags (RPSMF) (3 bits)
+  uint32_t  trpi;                   // Temporal Reference for Prediction Indication (TRPI) (1 bit)
+  uint32_t  bci;                    // Back-Channel message Indication (BCI) (Variable length)
+  uint32_t  bcm;                    // Back-Channel Message (BCM) (Variable length)
+  uint32_t  rprp;                   // Reference Picture Resampling Parameters (RPRP) (Variable length)
+  uint32_t  pquant;                 // Quantizer Information (PQUANT) (5 bits)
+  uint32_t  cpm;                    // Continuous Presence Multipoint and Video Multiplex (CPM) (1 bit)
+  uint32_t  psbi;                   // Picture Sub-Bitstream Indicator (PSBI) (2 bits)
+  uint32_t  trb;                    // Temporal Reference for B-pictures in PB-frames (TRB) (3/5 bits)
+  uint32_t  dbquant;                // Quantization information for B-pictures in PB-frames (DBQUANT) (2 bits)
+  uint32_t  pei;                    // Extra Insertion Information (PEI) (1 bit)
+  uint8_t*  psupp;                  // Supplemental Enhancement Information (PSUPP) (0/8/16 ... bits)
+  p263_gob_layer_t* gobs;           // List of gobs
+} p263_picture_layer_t;
+
+// Macroblock types and included data elements for normal pictures
+#define MB_TYPE_COD_BIT     0x01
+#define MB_TYPE_MCBPC_BIT   0x02
+#define MB_TYPE_CBPY_BIT    0x03
+#define MB_TYPE_DQUANT_BIT  0x04
+#define MB_TYPE_MVD_BIT     0x05
+#define MB_TYPE_MVD24_BIT   0x06
+
+#define MAKE_MB_TYPE( COD, MCBPC, CBPY, DQUANT, MVD, MVD24 )  \
+  ( (COD    << MB_TYPE_COD_BIT    ) |                         \
+    (MCBPC  << MB_TYPE_MCBPC_BIT  ) |                         \
+    (CBPY   << MB_TYPE_CBPY_BIT   ) |                         \
+    (DQUANT << MB_TYPE_DQUANT_BIT ) |                         \
+    (MVD    << MB_TYPE_MVD_BIT    ) |                         \
+    (MVD24  << MB_TYPE_MVD24_BIT  ) )
+
+#define MB_TYPE_HAS_COD(t)    ( (t) & ( 1 << MB_TYPE_COD_BIT   ))
+#define MB_TYPE_HAS_MCBPC(t)  ( (t) & ( 1 << MB_TYPE_MCBPC_BIT ))
+#define MB_TYPE_HAS_CBPY(t)   ( (t) & ( 1 << MB_TYPE_CBPY_BIT  ))
+#define MB_TYPE_HAS_DQUANT(t) ( (t) & ( 1 << MB_TYPE_DQUANT_BIT))
+#define MB_TYPE_HAS_MVD(t)    ( (t) & ( 1 << MB_TYPE_MVD_BIT   ))
+#define MB_TYPE_HAS_MVD24(t)  ( (t) & ( 1 << MB_TYPE_MVD24_BIT ))
+
+#define STANDARD_MB_TYPES_NUM 7
+
+typedef uint32_t p263_mb_type_t;
+extern p263_mb_type_t standard_mb_types[STANDARD_MB_TYPES_NUM];
+
+C_RESULT p263_read_picture_layer( video_controller_t* controller, video_stream_t* stream );
+C_RESULT p263_read_gob_layer( video_controller_t* controller, video_stream_t* stream );
+C_RESULT p263_read_mb_layer( video_controller_t* controller, video_stream_t* stream, video_macroblock_t* mb );
+
+#endif // _P263_LAYERS_H_