#ifndef COSMOPOLITAN_DSP_MPEG_VIDEO_H_
#define COSMOPOLITAN_DSP_MPEG_VIDEO_H_
#include "dsp/mpeg/mpeg.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_

typedef struct {
  int full_px;
  int is_set;
  int r_size;
  int h;
  int v;
} plm_video_motion_t;

typedef struct plm_video_t {
  double framerate;
  double time;
  double pixel_aspect_ratio;
  int frames_decoded;
  int width;
  int height;
  int mb_width;
  int mb_height;
  int mb_size;
  int luma_width;
  int luma_height;
  int chroma_width;
  int chroma_height;
  int start_code;
  int picture_type;
  plm_video_motion_t motion_forward;
  plm_video_motion_t motion_backward;
  int has_sequence_header;
  int quantizer_scale;
  int slice_begin;
  int macroblock_address;
  int mb_row;
  int mb_col;
  int macroblock_type;
  int macroblock_intra;
  int dc_predictor[3];
  plm_buffer_t *buffer;
  int destroy_buffer_when_done;
  plm_frame_t frame_current;
  plm_frame_t frame_forward;
  plm_frame_t frame_backward;
  uint8_t *frames_data;
  int block_data[64];
  uint8_t intra_quant_matrix[64];
  uint8_t non_intra_quant_matrix[64];
  int has_reference_frame;
  int assume_no_b_frames;
} plm_video_t;

void plm_video_process_macroblock_8(plm_video_t *, uint8_t *restrict,
                                    uint8_t *restrict, int, int, bool);
void plm_video_process_macroblock_16(plm_video_t *, uint8_t *restrict,
                                     uint8_t *restrict, int, int, bool);

COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_DSP_MPEG_VIDEO_H_ */