[MPlayer-dev-eng] [PATCH 1/2] Remove direct uses of __attribute__((packed)).

Reimar Döffinger Reimar.Doeffinger at gmx.de
Sun Jan 24 14:41:35 EET 2021


It is not portable and ideally it should not be used
at all.
However as a quick-fix wrap it in a macro so it is not
necessary to edit each occurrence individually to support
other compilers.
Code that is completely platform-dependent anyway is not changed
at this point.
---
 libmpcodecs/ad_realaud.c       |  5 +-
 libmpdemux/asf.h               | 29 ++++++++---
 libmpdemux/aviheader.h         |  5 +-
 libmpdemux/demux_ogg.c         |  5 +-
 libmpdemux/ms_hdr.h            | 23 ++++++---
 loader/dshow/guids.h           | 10 +++-
 loader/dshow/mediatype.h       |  5 +-
 loader/qtx/qtxsdk/components.h | 90 +++++++++++++++++++++++++---------
 mppacked.h                     | 33 +++++++++++++
 stream/stream_cddb.c           | 12 +++--
 stream/stream_netstream.h      |  9 +++-
 stream/tvi_dshow.c             |  5 +-
 12 files changed, 184 insertions(+), 47 deletions(-)
 create mode 100644 mppacked.h

diff --git a/libmpcodecs/ad_realaud.c b/libmpcodecs/ad_realaud.c
index 76186dba1..34f9b4063 100644
--- a/libmpcodecs/ad_realaud.c
+++ b/libmpcodecs/ad_realaud.c
@@ -22,6 +22,7 @@

 #include "config.h"
 #include "mp_msg.h"
+#include "mppacked.h"

 //#include <stddef.h>
 #ifdef HAVE_LIBDL
@@ -147,7 +148,8 @@ typedef struct /*__attribute__((__packed__))*/ {
 } ra_init_t;

 /* windows dlls need packed structs (no padding) */
-typedef struct __attribute__((__packed__)) {
+MP_PACKED(
+typedef struct, {
     int samplerate;
     short bits;
     short channels;
@@ -157,6 +159,7 @@ typedef struct __attribute__((__packed__)) {
     int extradata_len;
     void* extradata;
 } wra_init_t;
+)
 #endif

 #ifdef HAVE_LIBDL
diff --git a/libmpdemux/asf.h b/libmpdemux/asf.h
index a2bf546fd..98b457c00 100644
--- a/libmpdemux/asf.h
+++ b/libmpdemux/asf.h
@@ -23,29 +23,35 @@
 #include <inttypes.h>
 #include "libavutil/common.h"
 #include "mpbswap.h"
+#include "mppacked.h"

 ///////////////////////
 // ASF Object Header
 ///////////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   uint8_t guid[16];
   uint64_t size;
 } ASF_obj_header_t;
+)

 ////////////////
 // ASF Header
 ////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   ASF_obj_header_t objh;
   uint32_t cno; // number of subchunks
   uint8_t v1; // unknown (0x01)
   uint8_t v2; // unknown (0x02)
 } ASF_header_t;
+)

 /////////////////////
 // ASF File Header
 /////////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   uint8_t stream_id[16]; // stream GUID
   uint64_t file_size;
   uint64_t creation_time; //File creation time FILETIME 8
@@ -58,11 +64,13 @@ typedef struct __attribute__((packed)) {
   uint32_t max_packet_size; //Max size of the packet  UINT32 4
   uint32_t max_bitrate; //Maximum bitrate of the media (sum of all the stream)
 } ASF_file_header_t;
+)

 ///////////////////////
 // ASF Stream Header
 ///////////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   uint8_t type[16]; // Stream type (audio/video) GUID 16
   uint8_t concealment[16]; // Audio error concealment type GUID 16
   uint64_t unk1; // Unknown, maybe reserved ( usually contains 0 ) UINT64 8
@@ -71,38 +79,45 @@ typedef struct __attribute__((packed)) {
   uint16_t stream_no; //Stream number UINT16 2
   uint32_t unk2; //Unknown UINT32 4
 } ASF_stream_header_t;
+)

 ///////////////////////////
 // ASF Content Description
 ///////////////////////////
-typedef struct  __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   uint16_t title_size;
   uint16_t author_size;
   uint16_t copyright_size;
   uint16_t comment_size;
   uint16_t rating_size;
 } ASF_content_description_t;
+)

 ////////////////////////
 // ASF Segment Header
 ////////////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
   uint8_t streamno;
   uint8_t seq;
   uint32_t x;
   uint8_t flag;
 } ASF_segmhdr_t;
+)

 //////////////////////
 // ASF Stream Chunck
 //////////////////////
-typedef struct __attribute__((packed)) {
+MP_PACKED(
+typedef struct, {
 	uint16_t	type;
 	uint16_t	size;
 	uint32_t	sequence_number;
 	uint16_t	unknown;
 	uint16_t	size_confirm;
 } ASF_stream_chunck_t;
+)

 // Definition of the stream type
 #if HAVE_BIGENDIAN
diff --git a/libmpdemux/aviheader.h b/libmpdemux/aviheader.h
index 0d5a19db6..0a2f594b5 100644
--- a/libmpdemux/aviheader.h
+++ b/libmpdemux/aviheader.h
@@ -24,6 +24,7 @@
 #include "config.h"	/* get correct definition of HAVE_BIGENDIAN */
 #include "libavutil/common.h"
 #include "mpbswap.h"
+#include "mppacked.h"
 #include "demuxer.h"

 #ifndef mmioFOURCC
@@ -150,7 +151,8 @@ typedef struct avistdindex_entry {
 } avistdindex_entry;

 // Standard index
-typedef struct __attribute__((packed)) avistdindex_chunk {
+MP_PACKED(
+typedef struct, avistdindex_chunk {
     char           fcc[4];       // ix##
     uint32_t  dwSize;            // size of this chunk
     uint16_t wLongsPerEntry;     // must be sizeof(aIndex[0])/sizeof(DWORD)
@@ -162,6 +164,7 @@ typedef struct __attribute__((packed)) avistdindex_chunk {
     uint32_t  dwReserved3;       // must be 0
     avistdindex_entry *aIndex;   // the actual frames
 } avistdindex_chunk;
+)


 // Base Index Form 'indx'
diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c
index e15794c91..59066b037 100644
--- a/libmpdemux/demux_ogg.c
+++ b/libmpdemux/demux_ogg.c
@@ -28,6 +28,7 @@
 #include "mp_msg.h"
 #include "help_mp.h"
 #include "mpcommon.h"
+#include "mppacked.h"
 #include "stream/stream.h"
 #include "demuxer.h"
 #include "stheader.h"
@@ -81,7 +82,8 @@ typedef struct stream_header_audio {
     ogg_int32_t avgbytespersec;
 } stream_header_audio;

-typedef struct __attribute__((__packed__)) stream_header {
+MP_PACKED(
+typedef struct, stream_header {
     char streamtype[8];
     char subtype[4];

@@ -103,6 +105,7 @@ typedef struct __attribute__((__packed__)) stream_header {
         stream_header_audio	audio;
     } sh;
 } stream_header;
+)

 /// Our private datas

diff --git a/libmpdemux/ms_hdr.h b/libmpdemux/ms_hdr.h
index 3d6bc0754..56085db5a 100644
--- a/libmpdemux/ms_hdr.h
+++ b/libmpdemux/ms_hdr.h
@@ -20,10 +20,12 @@
 #define MPLAYER_MS_HDR_H

 #include "config.h"
+#include "mppacked.h"

 #ifndef _WAVEFORMATEX_
 #define _WAVEFORMATEX_
-typedef struct __attribute__((__packed__)) _WAVEFORMATEX {
+MP_PACKED(
+typedef struct, _WAVEFORMATEX {
   unsigned short  wFormatTag;
   unsigned short  nChannels;
   unsigned int    nSamplesPerSec;
@@ -31,23 +33,28 @@ typedef struct __attribute__((__packed__)) _WAVEFORMATEX {
   unsigned short  nBlockAlign;
   unsigned short  wBitsPerSample;
   unsigned short  cbSize;
-} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
+} WAVEFORMATEX;
+)
+typedef WAVEFORMATEX *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
 #endif /* _WAVEFORMATEX_ */

 #ifndef _WAVEFORMATEXTENSIBLE_
 #define _WAVEFORMATEXTENSIBLE_
-typedef struct __attribute__((__packed__)) _WAVEFORMATEXTENSIBLE {
+MP_PACKED(
+typedef struct, _WAVEFORMATEXTENSIBLE {
     WAVEFORMATEX   wf;
     unsigned short wValidBitsPerSample;
     unsigned int   dwChannelMask;
     unsigned int   SubFormat; // Only interested in first 32 bits of guid
     unsigned int   _guid_remainder[3];
 } WAVEFORMATEXTENSIBLE;
+)
 #endif /* _WAVEFORMATEXTENSIBLE_ */

 #ifndef _MPEGLAYER3WAVEFORMAT_
 #define _MPEGLAYER3WAVEFORMAT_
-typedef struct __attribute__((__packed__)) mpeglayer3waveformat_tag {
+MP_PACKED(
+typedef struct, mpeglayer3waveformat_tag {
   WAVEFORMATEX wf;
   unsigned short wID;
   unsigned int   fdwFlags;
@@ -55,12 +62,14 @@ typedef struct __attribute__((__packed__)) mpeglayer3waveformat_tag {
   unsigned short nFramesPerBlock;
   unsigned short nCodecDelay;
 } MPEGLAYER3WAVEFORMAT;
+)
 #endif /* _MPEGLAYER3WAVEFORMAT_ */

 /* windows.h #includes wingdi.h on MinGW. */
 #if !defined(_BITMAPINFOHEADER_) && !defined(_WINGDI_)
 #define _BITMAPINFOHEADER_
-typedef struct __attribute__((__packed__))
+MP_PACKED(
+typedef struct,
 {
     int 	biSize;
     int  	biWidth;
@@ -73,7 +82,9 @@ typedef struct __attribute__((__packed__))
     int  	biYPelsPerMeter;
     int 	biClrUsed;
     int 	biClrImportant;
-} BITMAPINFOHEADER, *PBITMAPINFOHEADER, *LPBITMAPINFOHEADER;
+} BITMAPINFOHEADER;
+)
+typedef BITMAPINFOHEADER *PBITMAPINFOHEADER, *LPBITMAPINFOHEADER;
 typedef struct {
 	BITMAPINFOHEADER bmiHeader;
 	int	bmiColors[1];
diff --git a/loader/dshow/guids.h b/loader/dshow/guids.h
index 76a4970d2..5cf5e0344 100644
--- a/loader/dshow/guids.h
+++ b/loader/dshow/guids.h
@@ -18,18 +18,23 @@ under MinGW

 #include "mediatype.h"

+#include "mppacked.h"
+
 //#define Debug if(1)
 #define Debug if(0)


 typedef long long REFERENCE_TIME;

-typedef struct __attribute__((__packed__)) RECT32
+MP_PACKED(
+typedef struct, RECT32
 {
     int left, top, right, bottom;
 } RECT32;
+)

-typedef struct __attribute__((__packed__)) tagVIDEOINFOHEADER
+MP_PACKED(
+typedef struct, tagVIDEOINFOHEADER
 {
     RECT32            rcSource;          // The bit we really want to use
     RECT32            rcTarget;          // Where the video should go
@@ -39,6 +44,7 @@ typedef struct __attribute__((__packed__)) tagVIDEOINFOHEADER
     BITMAPINFOHEADER  bmiHeader;
     //int               reserved[3];
 } VIDEOINFOHEADER;
+)

 typedef GUID CLSID;
 typedef GUID IID;
diff --git a/loader/dshow/mediatype.h b/loader/dshow/mediatype.h
index ecb696ca3..dc6d10e43 100644
--- a/loader/dshow/mediatype.h
+++ b/loader/dshow/mediatype.h
@@ -8,8 +8,10 @@
 #define MPLAYER_MEDIATYPE_H

 #include "guids.h"
+#include "mppacked.h"

-typedef struct __attribute__((__packed__)) MediaType
+MP_PACKED(
+typedef struct, MediaType
 {
     GUID	majortype;		//0x0
     GUID	subtype;		//0x10
@@ -21,6 +23,7 @@ typedef struct __attribute__((__packed__)) MediaType
     unsigned long cbFormat;		//0x40
     char*	pbFormat;		//0x44
 } AM_MEDIA_TYPE;
+)

 /**
  * \brief print info from AM_MEDIA_TYPE structure
diff --git a/loader/qtx/qtxsdk/components.h b/loader/qtx/qtxsdk/components.h
index e621a6250..5ad7572d8 100644
--- a/loader/qtx/qtxsdk/components.h
+++ b/loader/qtx/qtxsdk/components.h
@@ -3,6 +3,8 @@

 #include <inttypes.h>

+#include "mppacked.h"
+
 // Basic types:

 typedef char *                          Ptr;
@@ -39,99 +41,121 @@ enum {

 //==================== COMPONENTS ===========================

-struct __attribute__((__packed__)) ComponentParameters {
+MP_PACKED(
+struct, ComponentParameters {
     UInt8                           flags;                      /* call modifiers: sync/async, deferred, immed, etc */
     UInt8                           paramSize;                  /* size in bytes of actual parameters passed to this call */
     short                           what;                       /* routine selector, negative for Component management calls */
     int32_t                         params[1];                  /* actual parameters for the indicated routine */
 };
+)
 typedef struct ComponentParameters      ComponentParameters;


-struct __attribute__((__packed__)) ComponentDescription {
+MP_PACKED(
+struct, ComponentDescription {
     OSType                          componentType;              /* A unique 4-byte code indentifying the command set */
     OSType                          componentSubType;           /* Particular flavor of this instance */
     OSType                          componentManufacturer;      /* Vendor indentification */
     uint32_t                        componentFlags;             /* 8 each for Component,Type,SubType,Manuf/revision */
     uint32_t                        componentFlagsMask;         /* Mask for specifying which flags to consider in search, zero during registration */
 };
+)
 typedef struct ComponentDescription     ComponentDescription;


-struct __attribute__((__packed__)) ResourceSpec {
+MP_PACKED(
+struct, ResourceSpec {
     OSType                          resType;                    /* 4-byte code    */
     short                           resID;                      /*         */
 };
+)
 typedef struct ResourceSpec             ResourceSpec;


-struct __attribute__((__packed__)) ComponentResource {
+MP_PACKED(
+struct, ComponentResource {
     ComponentDescription            cd;                         /* Registration parameters */
     ResourceSpec                    component;                  /* resource where Component code is found */
     ResourceSpec                    componentName;              /* name string resource */
     ResourceSpec                    componentInfo;              /* info string resource */
     ResourceSpec                    componentIcon;              /* icon resource */
 };
+)
 typedef struct ComponentResource        ComponentResource;
 typedef ComponentResource *             ComponentResourcePtr;
 typedef ComponentResourcePtr *          ComponentResourceHandle;


-struct __attribute__((__packed__)) ComponentRecord {
+MP_PACKED(
+struct, ComponentRecord {
     int32_t                            data[1];
 };
+)
 typedef struct ComponentRecord          ComponentRecord;
 typedef ComponentRecord *               Component;


-struct __attribute__((__packed__)) ComponentInstanceRecord {
+MP_PACKED(
+struct, ComponentInstanceRecord {
     int32_t                            data[1];
 };
+)
 typedef struct ComponentInstanceRecord  ComponentInstanceRecord;

 typedef ComponentInstanceRecord *       ComponentInstance;

 // ========================= QUICKDRAW =========================

-struct __attribute__((__packed__)) Rect {
+MP_PACKED(
+struct, Rect {
     short                           top;
     short                           left;
     short                           bottom;
     short                           right;
 };
+)
 typedef struct Rect                     Rect;
 typedef Rect *                          RectPtr;

-struct __attribute__((__packed__)) RGBColor {
+MP_PACKED(
+struct, RGBColor {
     unsigned short                  red;                        /*magnitude of red component*/
     unsigned short                  green;                      /*magnitude of green component*/
     unsigned short                  blue;                       /*magnitude of blue component*/
 };
+)
 typedef struct RGBColor                 RGBColor;
 typedef RGBColor *                      RGBColorPtr;
 typedef RGBColorPtr *                   RGBColorHdl;

-struct __attribute__((__packed__)) ColorSpec {
+MP_PACKED(
+struct, ColorSpec {
     short                           value;                      /*index or other value*/
     RGBColor                        rgb;                        /*true color*/
 };
+)
 typedef struct ColorSpec                ColorSpec;
 typedef ColorSpec *                     ColorSpecPtr;
 typedef ColorSpec                       CSpecArray[1];

-struct __attribute__((__packed__)) ColorTable {
+MP_PACKED(
+struct, ColorTable {
     int32_t                         ctSeed;                     /*unique identifier for table*/
     short                           ctFlags;                    /*high bit: 0 = PixMap; 1 = device*/
     short                           ctSize;                     /*number of entries in CTTable*/
     CSpecArray                      ctTable;                    /*array [0..0] of ColorSpec*/
 };
+)
 typedef struct ColorTable               ColorTable;
 typedef ColorTable *                    CTabPtr;
 typedef CTabPtr *                       CTabHandle;

-struct __attribute__((__packed__)) MatrixRecord {
+MP_PACKED(
+struct, MatrixRecord {
     Fixed                           matrix[3][3];
 };
+)
 typedef struct MatrixRecord             MatrixRecord;
 typedef MatrixRecord *                  MatrixRecordPtr;

@@ -140,7 +164,8 @@ typedef OSType                          CodecType;
 typedef unsigned short                  CodecFlags;
 typedef uint32_t                        CodecQ;

-struct __attribute__((__packed__)) ImageDescription {
+MP_PACKED(
+struct, ImageDescription {
     int32_t                         idSize;                     /* total size of ImageDescription including extra data ( CLUTs and other per sequence data ) */
     CodecType                       cType;                      /* what kind of codec compressed this data */
     int32_t                         resvd1;                     /* reserved for Apple use */
@@ -161,6 +186,7 @@ struct __attribute__((__packed__)) ImageDescription {
     short                           depth;                      /* what depth is this data (1-32) or ( 33-40 grayscale ) */
     short                           clutID;                     /* clut id or if 0 clut follows  or -1 if no clut */
 };
+)
 typedef struct ImageDescription         ImageDescription;
 typedef ImageDescription *              ImageDescriptionPtr;
 typedef ImageDescriptionPtr *           ImageDescriptionHandle;
@@ -185,7 +211,8 @@ enum {
     k2vuyPixelFormat            = FOUR_CHAR_CODE('2','v','u','y')        /* UYVY 4:2:2 byte ordering   16*/
 };

-struct __attribute__((__packed__)) PixMapExtension {
+MP_PACKED(
+struct, PixMapExtension {
     int32_t                         extSize;                    /*size of struct, duh!*/
     uint32_t                        pmBits;                     /*pixmap attributes bitfield*/
     void *                          pmGD;                       /*this is a GDHandle*/
@@ -197,13 +224,15 @@ struct __attribute__((__packed__)) PixMapExtension {
     uint32_t                        signature;
     Handle                          baseAddrHandle;
 };
+)
 typedef struct PixMapExtension          PixMapExtension;

 typedef PixMapExtension *               PixMapExtPtr;
 typedef PixMapExtPtr *                  PixMapExtHandle;


-struct __attribute__((__packed__)) PixMap {
+MP_PACKED(
+struct, PixMap {
     Ptr                             baseAddr;                   /*pointer to pixels*/
     short                           rowBytes;                   /*offset to next line*/
     Rect                            bounds;                     /*encloses bitmap*/
@@ -220,16 +249,19 @@ struct __attribute__((__packed__)) PixMap {
     CTabHandle                      pmTable;                    /*color map for this pixMap*/
     PixMapExtHandle                 pmExt;                      /*Handle to pixMap extension*/
 };
+)
 typedef struct PixMap                   PixMap;
 typedef PixMap *                        PixMapPtr;
 typedef PixMapPtr *                     PixMapHandle;


-struct __attribute__((__packed__)) BitMap {
+MP_PACKED(
+struct, BitMap {
     Ptr                             baseAddr;
     short                           rowBytes;
     Rect                            bounds;
 };
+)
 typedef struct BitMap                   BitMap;
 typedef BitMap *                        BitMapPtr;
 typedef BitMapPtr *                     BitMapHandle;
@@ -241,12 +273,15 @@ struct Pattern {
 typedef struct Pattern                  Pattern;
 typedef unsigned char                   Style;
 typedef Style                           StyleField;
-struct __attribute__((__packed__)) Point {
+MP_PACKED(
+struct, Point {
     short                           v;
     short                           h;
 };
+)
 typedef struct Point                    Point;
-struct __attribute__((__packed__)) GrafPort {
+MP_PACKED(
+struct, GrafPort {
     short                           device;
     BitMap                          portBits;
     Rect                            portRect;
@@ -274,6 +309,7 @@ struct __attribute__((__packed__)) GrafPort {
     Handle                          polySave;
     /*QDProcsPtr*/void*                      grafProcs;
 };
+)
 typedef struct GrafPort                 GrafPort;
 typedef GrafPort *GWorldPtr;
 typedef GWorldPtr *GWorldHandle;
@@ -417,7 +453,8 @@ enum {



-struct __attribute__((__packed__)) CodecCapabilities {
+MP_PACKED(
+struct, CodecCapabilities {
     int32_t                         flags;
     short                           wantedPixelSize;
     short                           extendWidth;
@@ -428,9 +465,11 @@ struct __attribute__((__packed__)) CodecCapabilities {
     uint32_t                        time;
     int32_t                         flags2;                     /* field new in QuickTime 4.0 */
 };
+)
 typedef struct CodecCapabilities        CodecCapabilities;

-struct __attribute__((__packed__)) CodecDecompressParams {
+MP_PACKED(
+struct, CodecDecompressParams {
     ImageSequence                   sequenceID;                 /* predecompress,banddecompress */
     ImageDescriptionHandle          imageDescription;           /* predecompress,banddecompress */
     Ptr                             data;
@@ -502,11 +541,13 @@ struct __attribute__((__packed__)) CodecDecompressParams {
     UInt32                          taskWeight;                 /* preferred weight for MP tasks implementing this operation*/
     OSType                          taskName;                   /* preferred name (type) for MP tasks implementing this operation*/
 };
+)
 typedef struct CodecDecompressParams    CodecDecompressParams;



-struct __attribute__((__packed__)) ImageSubCodecDecompressCapabilities {
+MP_PACKED(
+struct, ImageSubCodecDecompressCapabilities {
     int32_t                         recordSize;                 /* sizeof(ImageSubCodecDecompressCapabilities)*/
     int32_t                         decompressRecordSize;       /* size of your codec's decompress record*/
     Boolean                         canAsync;                   /* default true*/
@@ -525,10 +566,12 @@ struct __attribute__((__packed__)) ImageSubCodecDecompressCapabilities {
     Boolean                         isChildCodec;               /* set by base codec before calling Initialize*/
     UInt8                           pad3[3];
 };
+)
 typedef struct ImageSubCodecDecompressCapabilities ImageSubCodecDecompressCapabilities;


-struct __attribute__((__packed__)) ImageSubCodecDecompressRecord {
+MP_PACKED(
+struct, ImageSubCodecDecompressRecord {
     Ptr                             baseAddr;
     int32_t                         rowBytes;
     Ptr                             codecData;
@@ -544,6 +587,7 @@ struct __attribute__((__packed__)) ImageSubCodecDecompressRecord {
     ImageCodecDrawBandCompleteUPP   drawBandCompleteUPP;        /* only used if subcodec set subCodecCallsDrawBandComplete; if drawBandCompleteUPP is non-nil, codec must call it when a frame is finished, but may return from DrawBand before the frame is finished. */
     void *                          drawBandCompleteRefCon;     /* Note: do not call drawBandCompleteUPP directly from a hardware interrupt; instead, use DTInstall to run a function at deferred task time, and call drawBandCompleteUPP from that. */
 };
+)
 typedef struct ImageSubCodecDecompressRecord ImageSubCodecDecompressRecord;


@@ -593,7 +637,8 @@ enum {
     codecInfoSequenceSensitive  = (1L << 13)                    /* compressed data is sensitive to out of sequence decoding */
 };

-struct __attribute__((__packed__)) CodecInfo {
+MP_PACKED(
+struct, CodecInfo {
     Str31                           typeName;                   /* name of the codec type i.e.: 'Apple Image Compression' */
     short                           version;                    /* version of the codec data that this codec knows about */
     short                           revisionLevel;              /* revision level of this codec i.e: 0x00010001 (1.0.1) */
@@ -613,6 +658,7 @@ struct __attribute__((__packed__)) CodecInfo {
     short                           compressPipelineLatency;    /* in milliseconds ( for asynchronous codecs ) */
     int32_t                         privateData;
 };
+)
 typedef struct CodecInfo                CodecInfo;

 enum {
diff --git a/mppacked.h b/mppacked.h
new file mode 100644
index 000000000..f17c61d7c
--- /dev/null
+++ b/mppacked.h
@@ -0,0 +1,33 @@
+/*
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPLAYER_MPPACKED_H
+#define MPLAYER_MPPACKED_H
+
+#ifdef _MSC_VER
+// actually also works for newer gcc
+#define MP_PACKED(type, name_and_def) \
+_Pragma("pack(push, 1)") \
+type name_and_def \
+_Pragma("pack(pop)")
+#else
+#define MP_PACKED(type, name_and_def) \
+type __attribute__((packed)) name_and_def
+#endif
+
+#endif /* MPLAYER_MPPACKED_H */
diff --git a/stream/stream_cddb.c b/stream/stream_cddb.c
index 06695f81a..6f3a68d9e 100644
--- a/stream/stream_cddb.c
+++ b/stream/stream_cddb.c
@@ -132,6 +132,7 @@ static int read_toc(const char *dev)
 #elif defined(__OS2__)
     UCHAR auchParamDisk[4] = {'C', 'D', '0', '1'};

+MP_PACKED(
     struct {
         BYTE    bFirstTrack;
         BYTE    bLastTrack;
@@ -139,20 +140,25 @@ static int read_toc(const char *dev)
         BYTE    bLeadOutS;
         BYTE    bLeadOutM;
         BYTE    bLeadOutReserved;
-    } __attribute__((packed)) sDataDisk;
+    }, sDataDisk;
+)

+MP_PACKED(
     struct {
         UCHAR   auchSign[4];
         BYTE    bTrack;
-    } __attribute__((packed)) sParamTrack = {{'C', 'D', '0', '1'},};
+    }, sParamTrack = {{'C', 'D', '0', '1'},};
+)

+MP_PACKED(
     struct {
         BYTE    bStartF;
         BYTE    bStartS;
         BYTE    bStartM;
         BYTE    bStartReserved;
         BYTE    bControlInfo;
-    } __attribute__((packed)) sDataTrack;
+    }, sDataTrack;
+)

     HFILE hcd;
     ULONG ulAction;
diff --git a/stream/stream_netstream.h b/stream/stream_netstream.h
index 456094fa9..1f4d0a8fb 100644
--- a/stream/stream_netstream.h
+++ b/stream/stream_netstream.h
@@ -36,13 +36,16 @@

 #include "mp_msg.h"
 #include "mpbswap.h"
+#include "mppacked.h"
 #include "network.h"

+MP_PACKED(
 typedef struct mp_net_stream_packet_st {
   uint16_t len;
   uint8_t cmd;
   char data[0];
-} __attribute__ ((packed))  mp_net_stream_packet_t;
+}, mp_net_stream_packet_t;
+)

 #define PACKET_MAX_SIZE 4096

@@ -61,13 +64,15 @@ typedef struct mp_net_stream_packet_st {
 // Server response
 #define NET_STREAM_OK 128
 // Data returned if open is successful
+MP_PACKED(
 typedef struct mp_net_stream_opened_st {
   uint32_t file_format;
   uint32_t flags;
   uint32_t sector_size;
   uint64_t start_pos;
   uint64_t end_pos;
-}  __attribute__ ((packed))  mp_net_stream_opened_t;
+}, mp_net_stream_opened_t;
+)
 // FILL_BUFFER return the data
 // CLOSE return nothing
 #define NET_STREAM_ERROR 129
diff --git a/stream/tvi_dshow.c b/stream/tvi_dshow.c
index aafd278f4..00c3975bd 100644
--- a/stream/tvi_dshow.c
+++ b/stream/tvi_dshow.c
@@ -86,6 +86,7 @@

 #include "tv.h"
 #include "mp_msg.h"
+#include "mppacked.h"
 #include "frequencies.h"


@@ -221,12 +222,14 @@ typedef struct priv {
  \note
  structure have to be 2-byte aligned and have 10-byte length!!
 */
-typedef struct __attribute__((__packed__)) {
+MP_PACKED(
+typedef struct, {
     WORD CountryCode;		///< Country code
     WORD CableFreqTable;	///< index of resource with frequencies for cable channels
     WORD BroadcastFreqTable;	///< index of resource with frequencies for broadcast channels
     DWORD VideoStandard;	///< used video standard
 } TRCCountryList;
+)
 /**
     information about image formats
 */
--
2.30.0



More information about the MPlayer-dev-eng mailing list