mirror of https://git.ffmpeg.org/ffmpeg.git
intreadwrite: Add intermediate variables in the byteswise AV_W*() macros
This avoids issues with expanding the argument multiple times, and makes sure that it is of the right type for the following shifts. Even if the caller of a macro could be expected not to pass parameters that have side effects if expanded multiple times, these fallback codepaths are rarely, if ever, tested, so it is expected that such issues can arise. Thefore, for safety, make sure the fallback codepaths only expand the arguments once. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
014773b66b
commit
230b1c070b
|
@ -210,7 +210,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
((const uint8_t*)(x))[1])
|
((const uint8_t*)(x))[1])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WB16
|
#ifndef AV_WB16
|
||||||
# define AV_WB16(p, d) do { \
|
# define AV_WB16(p, val) do { \
|
||||||
|
uint16_t d = val; \
|
||||||
((uint8_t*)(p))[1] = (d); \
|
((uint8_t*)(p))[1] = (d); \
|
||||||
((uint8_t*)(p))[0] = (d)>>8; \
|
((uint8_t*)(p))[0] = (d)>>8; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
@ -222,7 +223,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
((const uint8_t*)(x))[0])
|
((const uint8_t*)(x))[0])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WL16
|
#ifndef AV_WL16
|
||||||
# define AV_WL16(p, d) do { \
|
# define AV_WL16(p, val) do { \
|
||||||
|
uint16_t d = val; \
|
||||||
((uint8_t*)(p))[0] = (d); \
|
((uint8_t*)(p))[0] = (d); \
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
((uint8_t*)(p))[1] = (d)>>8; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
@ -236,7 +238,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
((const uint8_t*)(x))[3])
|
((const uint8_t*)(x))[3])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WB32
|
#ifndef AV_WB32
|
||||||
# define AV_WB32(p, d) do { \
|
# define AV_WB32(p, val) do { \
|
||||||
|
uint32_t d = val; \
|
||||||
((uint8_t*)(p))[3] = (d); \
|
((uint8_t*)(p))[3] = (d); \
|
||||||
((uint8_t*)(p))[2] = (d)>>8; \
|
((uint8_t*)(p))[2] = (d)>>8; \
|
||||||
((uint8_t*)(p))[1] = (d)>>16; \
|
((uint8_t*)(p))[1] = (d)>>16; \
|
||||||
|
@ -252,7 +255,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
((const uint8_t*)(x))[0])
|
((const uint8_t*)(x))[0])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WL32
|
#ifndef AV_WL32
|
||||||
# define AV_WL32(p, d) do { \
|
# define AV_WL32(p, val) do { \
|
||||||
|
uint32_t d = val; \
|
||||||
((uint8_t*)(p))[0] = (d); \
|
((uint8_t*)(p))[0] = (d); \
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
((uint8_t*)(p))[1] = (d)>>8; \
|
||||||
((uint8_t*)(p))[2] = (d)>>16; \
|
((uint8_t*)(p))[2] = (d)>>16; \
|
||||||
|
@ -272,7 +276,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
(uint64_t)((const uint8_t*)(x))[7])
|
(uint64_t)((const uint8_t*)(x))[7])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WB64
|
#ifndef AV_WB64
|
||||||
# define AV_WB64(p, d) do { \
|
# define AV_WB64(p, val) do { \
|
||||||
|
uint64_t d = val; \
|
||||||
((uint8_t*)(p))[7] = (d); \
|
((uint8_t*)(p))[7] = (d); \
|
||||||
((uint8_t*)(p))[6] = (d)>>8; \
|
((uint8_t*)(p))[6] = (d)>>8; \
|
||||||
((uint8_t*)(p))[5] = (d)>>16; \
|
((uint8_t*)(p))[5] = (d)>>16; \
|
||||||
|
@ -296,7 +301,8 @@ union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
|
||||||
(uint64_t)((const uint8_t*)(x))[0])
|
(uint64_t)((const uint8_t*)(x))[0])
|
||||||
#endif
|
#endif
|
||||||
#ifndef AV_WL64
|
#ifndef AV_WL64
|
||||||
# define AV_WL64(p, d) do { \
|
# define AV_WL64(p, val) do { \
|
||||||
|
uint64_t d = val; \
|
||||||
((uint8_t*)(p))[0] = (d); \
|
((uint8_t*)(p))[0] = (d); \
|
||||||
((uint8_t*)(p))[1] = (d)>>8; \
|
((uint8_t*)(p))[1] = (d)>>8; \
|
||||||
((uint8_t*)(p))[2] = (d)>>16; \
|
((uint8_t*)(p))[2] = (d)>>16; \
|
||||||
|
|
Loading…
Reference in New Issue