uint8_t* data = img->pixels_confwin[channel];
- if (stride) *stride = img->get_image_stride(channel) * ((de265_get_bits_per_pixel(img, channel)+7) / 8);
+ if (stride) *stride = static_cast<int>(img->get_image_stride(channel) * ((de265_get_bits_per_pixel(img, channel)+7) / 8));
return data;
}
// --- load image ---
uint8_t* p;
- int stride;
+ ptrdiff_t stride;
p = img->get_image_plane(0); stride = img->get_image_stride(0);
for (int y=0;y<height;y++) {
// --- write image ---
const uint8_t* p;
- int stride;
+ ptrdiff_t stride;
int width = img->get_width();
int height= img->get_height();
};
-void de265_image::set_image_plane(int cIdx, uint8_t* mem, int stride, void *userdata)
+void de265_image::set_image_plane(int cIdx, uint8_t* mem, ptrdiff_t stride, void *userdata)
{
pixels[cIdx] = mem;
plane_user_data[cIdx] = userdata;
#endif
#include <assert.h>
+#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
/* */ uint8_t* get_image_plane(int cIdx) { return pixels[cIdx]; }
const uint8_t* get_image_plane(int cIdx) const { return pixels[cIdx]; }
- void set_image_plane(int cIdx, uint8_t* mem, int stride, void *userdata);
+ void set_image_plane(int cIdx, uint8_t* mem, ptrdiff_t stride, void *userdata);
uint8_t* get_image_plane_at_pos(int cIdx, int xpos,int ypos)
{
- int stride = get_image_stride(cIdx);
+ ptrdiff_t stride = get_image_stride(cIdx);
return pixels[cIdx] + xpos + ypos*stride;
}
template <class pixel_t>
pixel_t* get_image_plane_at_pos_NEW(int cIdx, int xpos,int ypos)
{
- int stride = get_image_stride(cIdx);
+ ptrdiff_t stride = get_image_stride(cIdx);
return (pixel_t*)(pixels[cIdx] + (xpos + ypos*stride)*sizeof(pixel_t));
}
const uint8_t* get_image_plane_at_pos(int cIdx, int xpos,int ypos) const
{
- int stride = get_image_stride(cIdx);
+ ptrdiff_t stride = get_image_stride(cIdx);
return pixels[cIdx] + xpos + ypos*stride;
}
void* get_image_plane_at_pos_any_depth(int cIdx, int xpos,int ypos)
{
- int stride = get_image_stride(cIdx);
+ ptrdiff_t stride = get_image_stride(cIdx);
return pixels[cIdx] + ((xpos + ypos*stride) << bpp_shift[cIdx]);
}
const void* get_image_plane_at_pos_any_depth(int cIdx, int xpos,int ypos) const
{
- int stride = get_image_stride(cIdx);
+ ptrdiff_t stride = get_image_stride(cIdx);
return pixels[cIdx] + ((xpos + ypos*stride) << bpp_shift[cIdx]);
}
/* Number of pixels in one row (not number of bytes).
*/
- int get_image_stride(int cIdx) const
+ ptrdiff_t get_image_stride(int cIdx) const
{
if (cIdx==0) return stride;
else return chroma_stride;
}
- int get_luma_stride() const { return stride; }
- int get_chroma_stride() const { return chroma_stride; }
+ ptrdiff_t get_luma_stride() const { return stride; }
+ ptrdiff_t get_chroma_stride() const { return chroma_stride; }
int get_width (int cIdx=0) const { return cIdx==0 ? width : chroma_width; }
int get_height(int cIdx=0) const { return cIdx==0 ? height : chroma_height; }
int width, height; // size in luma pixels
- int chroma_width, chroma_height;
- int stride, chroma_stride;
+ int chroma_width = 0, chroma_height = 0;
+ ptrdiff_t stride = 0, chroma_stride = 0;
public:
uint8_t BitDepth_Y, BitDepth_C;
assert(nT<=32);
pixel_t* image;
- int stride;
+ ptrdiff_t stride;
image = (pixel_t*)img->get_image_plane(cIdx);
stride = img->get_image_stride(cIdx);
const seq_parameter_set* sps, int mv_x, int mv_y,
int xP,int yP,
int16_t* out, int out_stride,
- const pixel_t* ref, int ref_stride,
+ const pixel_t* ref, ptrdiff_t ref_stride,
int nPbW, int nPbH, int bitDepth_L)
{
int xFracL = mv_x & 3;
pixel_t padbuf[(MAX_CU_SIZE+16)*(MAX_CU_SIZE+7)];
const pixel_t* src_ptr;
- int src_stride;
+ ptrdiff_t src_stride;
if (-extra_left + xIntOffsL >= 0 &&
-extra_top + yIntOffsL >= 0 &&
int mv_x, int mv_y,
int xP,int yP,
int16_t* out, int out_stride,
- const pixel_t* ref, int ref_stride,
+ const pixel_t* ref, ptrdiff_t ref_stride,
int nPbWC, int nPbHC, int bit_depth_C)
{
// chroma sample interpolation process (8.5.3.2.2.2)
pixel_t padbuf[(MAX_CU_SIZE+16)*(MAX_CU_SIZE+3)];
const pixel_t* src_ptr;
- int src_stride;
+ ptrdiff_t src_stride;
int extra_top = 1;
int extra_left = 1;
template <class pixel_t>
void apply_sao_internal(de265_image* img, int xCtb,int yCtb,
const slice_segment_header* shdr, int cIdx, int nSW,int nSH,
- const pixel_t* in_img, int in_stride,
- /* */ pixel_t* out_img, int out_stride)
+ const pixel_t* in_img, ptrdiff_t in_stride,
+ /* */ pixel_t* out_img, ptrdiff_t out_stride)
{
const sao_info* saoinfo = img->get_sao_info(xCtb,yCtb);
if (SaoTypeIdx==2) {
int hPos[2], vPos[2];
- int vPosStride[2]; // vPos[] multiplied by image stride
+ ptrdiff_t vPosStride[2]; // vPos[] multiplied by image stride
int SaoEoClass = (saoinfo->SaoEoClass >> (2*cIdx)) & 0x3;
switch (SaoEoClass) {
template <class pixel_t>
void apply_sao(de265_image* img, int xCtb,int yCtb,
const slice_segment_header* shdr, int cIdx, int nSW,int nSH,
- const pixel_t* in_img, int in_stride,
- /* */ pixel_t* out_img, int out_stride)
+ const pixel_t* in_img, ptrdiff_t in_stride,
+ /* */ pixel_t* out_img, ptrdiff_t out_stride)
{
if (img->high_bit_depth(cIdx)) {
apply_sao_internal<uint16_t>(img,xCtb,yCtb, shdr,cIdx,nSW,nSH,
return;
}
- int lumaImageSize = img->get_image_stride(0) * img->get_height(0) * img->get_bytes_per_pixel(0);
- int chromaImageSize = img->get_image_stride(1) * img->get_height(1) * img->get_bytes_per_pixel(1);
+ size_t lumaImageSize = static_cast<size_t>(img->get_image_stride(0)) * img->get_height(0) * img->get_bytes_per_pixel(0);
+ size_t chromaImageSize = static_cast<size_t>(img->get_image_stride(1)) * img->get_height(1) * img->get_bytes_per_pixel(1);
uint8_t* inputCopy = new uint8_t[ libde265_max(lumaImageSize, chromaImageSize) ];
if (inputCopy == NULL) {
for (int cIdx=0;cIdx<nChannels;cIdx++) {
- int stride = img->get_image_stride(cIdx);
+ ptrdiff_t stride = img->get_image_stride(cIdx);
int height = img->get_height(cIdx);
- memcpy(inputCopy, img->get_image_plane(cIdx), stride * height * img->get_bytes_per_pixel(cIdx));
+ memcpy(inputCopy, img->get_image_plane(cIdx), static_cast<size_t>(stride) * height * img->get_bytes_per_pixel(cIdx));
for (int yCtb=0; yCtb<sps.PicHeightInCtbsY; yCtb++)
for (int xCtb=0; xCtb<sps.PicWidthInCtbsY; xCtb++)
class raw_hash_data
{
public:
- raw_hash_data(int w, int stride);
+ raw_hash_data(int w, ptrdiff_t stride);
~raw_hash_data();
struct data_chunk {
data_chunk prepare_16bit(const uint8_t* data,int y);
private:
- int mWidth, mStride;
+ int mWidth;
+ ptrdiff_t mStride;
uint8_t* mMem;
};
-raw_hash_data::raw_hash_data(int w, int stride)
+raw_hash_data::raw_hash_data(int w, ptrdiff_t stride)
{
mWidth=w;
mStride=stride;
}
-static uint32_t compute_checksum_8bit(uint8_t* data,int w,int h,int stride, int bit_depth)
+static uint32_t compute_checksum(uint8_t* data,int w,int h,ptrdiff_t stride, int bit_depth)
{
uint32_t sum = 0;
}
}
else {
+ auto* data16 = reinterpret_cast<uint16_t*>(data);
+ ptrdiff_t stride16 = stride / 2;
for (int y=0; y<h; y++)
for(int x=0; x<w; x++) {
uint8_t xorMask = ( x & 0xFF ) ^ ( y & 0xFF ) ^ ( x >> 8 ) ^ ( y >> 8 );
(t << 12)) & 0xFFFF;
}
-static uint32_t compute_CRC_8bit_fast(const uint8_t* data,int w,int h,int stride, int bit_depth)
+static uint32_t compute_CRC_8bit_fast(const uint8_t* data,int w,int h,ptrdiff_t stride, int bit_depth)
{
raw_hash_data raw_data(w,stride);
}
-static void compute_MD5(uint8_t* data,int w,int h,int stride, uint8_t* result, int bit_depth)
+static void compute_MD5(uint8_t* data,int w,int h,ptrdiff_t stride, uint8_t* result, int bit_depth)
{
MD5_CTX md5;
MD5_Init(&md5);
int nHashes = img->get_sps().chroma_format_idc==0 ? 1 : 3;
for (int i=0;i<nHashes;i++) {
uint8_t* data;
- int w,h,stride;
+ int w,h;
+ ptrdiff_t stride;
w = img->get_width(i);
h = img->get_height(i);
case sei_decoded_picture_hash_type_checksum:
{
- uint32_t chksum = compute_checksum_8bit(data,w,h,stride, img->get_bit_depth(i));
+ uint32_t chksum = compute_checksum(data,w,h,stride, img->get_bit_depth(i));
if (chksum != seihash->checksum[i]) {
/*
PicHeightInCtbsY = ceil_div(pic_height_in_luma_samples,CtbSizeY);
PicSizeInMinCbsY = PicWidthInMinCbsY * PicHeightInMinCbsY;
PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY;
- PicSizeInSamplesY = pic_width_in_luma_samples * pic_height_in_luma_samples;
+ PicSizeInSamplesY = static_cast<uint32_t>(pic_width_in_luma_samples) * pic_height_in_luma_samples;
if (chroma_format_idc==0 || separate_colour_plane_flag) {
CtbWidthC = 0;
PicHeightInCtbsY = ceil_div(pic_height_in_luma_samples,CtbSizeY);
PicSizeInMinCbsY = PicWidthInMinCbsY * PicHeightInMinCbsY;
PicSizeInCtbsY = PicWidthInCtbsY * PicHeightInCtbsY;
- PicSizeInSamplesY = pic_width_in_luma_samples * pic_height_in_luma_samples;
+ PicSizeInSamplesY = static_cast<uint32_t>(pic_width_in_luma_samples) * pic_height_in_luma_samples;
if (chroma_format_idc==0 || separate_colour_plane_flag) {
CtbWidthC = 0;
CtbHeightC = 0;
#define MAX_PICTURE_WIDTH 65535
#define MAX_PICTURE_HEIGHT 65535
+// pic_width/height_in_luma_samples are stored as uint16_t and PicSizeInSamplesY as uint32_t,
+// so these limits must keep width/height in 16 bits and their product in 32 bits.
+static_assert(MAX_PICTURE_WIDTH <= 0xFFFF, "picture width must fit in uint16_t");
+static_assert(MAX_PICTURE_HEIGHT <= 0xFFFF, "picture height must fit in uint16_t");
+static_assert((uint64_t)MAX_PICTURE_WIDTH * MAX_PICTURE_HEIGHT <= 0xFFFFFFFFu,
+ "total luma sample count must fit in uint32_t");
+
enum {
CHROMA_MONO = 0,
CHROMA_420 = 1,
int seq_parameter_set_id;
int chroma_format_idc;
- char separate_colour_plane_flag;
- int pic_width_in_luma_samples;
- int pic_height_in_luma_samples;
- char conformance_window_flag;
+ bool separate_colour_plane_flag;
+ uint16_t pic_width_in_luma_samples; // <= MAX_PICTURE_WIDTH (validated on parse)
+ uint16_t pic_height_in_luma_samples; // <= MAX_PICTURE_HEIGHT (validated on parse)
+ bool conformance_window_flag;
int conf_win_left_offset;
int conf_win_right_offset;