Commit b7fe35c9 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  h264: deMpegEncContextize

Conflicts:
	libavcodec/dxva2_h264.c
	libavcodec/h264.c
	libavcodec/h264.h
	libavcodec/h264_cabac.c
	libavcodec/h264_cavlc.c
	libavcodec/h264_loopfilter.c
	libavcodec/h264_mb_template.c
	libavcodec/h264_parser.c
	libavcodec/h264_ps.c
	libavcodec/h264_refs.c
	libavcodec/h264_sei.c
	libavcodec/svq3.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents ddbbfd95 2c541554
...@@ -932,8 +932,8 @@ static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *a ...@@ -932,8 +932,8 @@ static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *a
} else { } else {
av_log(avctx, AV_LOG_VERBOSE, av_log(avctx, AV_LOG_VERBOSE,
"CrystalHD: parser picture type %d\n", "CrystalHD: parser picture type %d\n",
h->s.picture_structure); h->picture_structure);
pic_type = h->s.picture_structure; pic_type = h->picture_structure;
} }
} else { } else {
av_log(avctx, AV_LOG_WARNING, av_log(avctx, AV_LOG_WARNING,
......
...@@ -76,7 +76,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx, ...@@ -76,7 +76,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
return result; return result;
} }
int ff_dxva2_common_end_frame(AVCodecContext *avctx, MpegEncContext *s, int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic,
const void *pp, unsigned pp_size, const void *pp, unsigned pp_size,
const void *qm, unsigned qm_size, const void *qm, unsigned qm_size,
int (*commit_bs_si)(AVCodecContext *, int (*commit_bs_si)(AVCodecContext *,
...@@ -90,7 +90,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, MpegEncContext *s, ...@@ -90,7 +90,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, MpegEncContext *s,
int result; int result;
if (FAILED(IDirectXVideoDecoder_BeginFrame(ctx->decoder, if (FAILED(IDirectXVideoDecoder_BeginFrame(ctx->decoder,
ff_dxva2_get_surface(s->current_picture_ptr), ff_dxva2_get_surface(pic),
NULL))) { NULL))) {
av_log(avctx, AV_LOG_ERROR, "Failed to begin frame\n"); av_log(avctx, AV_LOG_ERROR, "Failed to begin frame\n");
return -1; return -1;
...@@ -146,7 +146,5 @@ end: ...@@ -146,7 +146,5 @@ end:
result = -1; result = -1;
} }
if (!result)
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
return result; return result;
} }
...@@ -44,15 +44,14 @@ static void fill_picture_entry(DXVA_PicEntry_H264 *pic, ...@@ -44,15 +44,14 @@ static void fill_picture_entry(DXVA_PicEntry_H264 *pic,
static void fill_picture_parameters(struct dxva_context *ctx, const H264Context *h, static void fill_picture_parameters(struct dxva_context *ctx, const H264Context *h,
DXVA_PicParams_H264 *pp) DXVA_PicParams_H264 *pp)
{ {
const MpegEncContext *s = &h->s; const Picture *current_picture = h->cur_pic_ptr;
const Picture *current_picture = s->current_picture_ptr;
int i, j; int i, j;
memset(pp, 0, sizeof(*pp)); memset(pp, 0, sizeof(*pp));
/* Configure current picture */ /* Configure current picture */
fill_picture_entry(&pp->CurrPic, fill_picture_entry(&pp->CurrPic,
ff_dxva2_get_surface_index(ctx, current_picture), ff_dxva2_get_surface_index(ctx, current_picture),
s->picture_structure == PICT_BOTTOM_FIELD); h->picture_structure == PICT_BOTTOM_FIELD);
/* Configure the set of references */ /* Configure the set of references */
pp->UsedForReferenceFlags = 0; pp->UsedForReferenceFlags = 0;
pp->NonExistingFrameFlags = 0; pp->NonExistingFrameFlags = 0;
...@@ -88,13 +87,13 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context ...@@ -88,13 +87,13 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
} }
} }
pp->wFrameWidthInMbsMinus1 = s->mb_width - 1; pp->wFrameWidthInMbsMinus1 = h->mb_width - 1;
pp->wFrameHeightInMbsMinus1 = s->mb_height - 1; pp->wFrameHeightInMbsMinus1 = h->mb_height - 1;
pp->num_ref_frames = h->sps.ref_frame_count; pp->num_ref_frames = h->sps.ref_frame_count;
pp->wBitFields = ((s->picture_structure != PICT_FRAME) << 0) | pp->wBitFields = ((h->picture_structure != PICT_FRAME) << 0) |
((h->sps.mb_aff && ((h->sps.mb_aff &&
(s->picture_structure == PICT_FRAME)) << 1) | (h->picture_structure == PICT_FRAME)) << 1) |
(h->sps.residual_color_transform_flag << 2) | (h->sps.residual_color_transform_flag << 2) |
/* sp_for_switch_flag (not implemented by FFmpeg) */ /* sp_for_switch_flag (not implemented by FFmpeg) */
(0 << 3) | (0 << 3) |
...@@ -120,11 +119,11 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context ...@@ -120,11 +119,11 @@ static void fill_picture_parameters(struct dxva_context *ctx, const H264Context
pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */ pp->Reserved16Bits = 3; /* FIXME is there a way to detect the right mode ? */
pp->StatusReportFeedbackNumber = 1 + ctx->report_id++; pp->StatusReportFeedbackNumber = 1 + ctx->report_id++;
pp->CurrFieldOrderCnt[0] = 0; pp->CurrFieldOrderCnt[0] = 0;
if ((s->picture_structure & PICT_TOP_FIELD) && if ((h->picture_structure & PICT_TOP_FIELD) &&
current_picture->field_poc[0] != INT_MAX) current_picture->field_poc[0] != INT_MAX)
pp->CurrFieldOrderCnt[0] = current_picture->field_poc[0]; pp->CurrFieldOrderCnt[0] = current_picture->field_poc[0];
pp->CurrFieldOrderCnt[1] = 0; pp->CurrFieldOrderCnt[1] = 0;
if ((s->picture_structure & PICT_BOTTOM_FIELD) && if ((h->picture_structure & PICT_BOTTOM_FIELD) &&
current_picture->field_poc[1] != INT_MAX) current_picture->field_poc[1] != INT_MAX)
pp->CurrFieldOrderCnt[1] = current_picture->field_poc[1]; pp->CurrFieldOrderCnt[1] = current_picture->field_poc[1];
pp->pic_init_qs_minus26 = h->pps.init_qs - 26; pp->pic_init_qs_minus26 = h->pps.init_qs - 26;
...@@ -200,7 +199,6 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, ...@@ -200,7 +199,6 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
{ {
const H264Context *h = avctx->priv_data; const H264Context *h = avctx->priv_data;
struct dxva_context *ctx = avctx->hwaccel_context; struct dxva_context *ctx = avctx->hwaccel_context;
const MpegEncContext *s = &h->s;
unsigned list; unsigned list;
memset(slice, 0, sizeof(*slice)); memset(slice, 0, sizeof(*slice));
...@@ -208,9 +206,9 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, ...@@ -208,9 +206,9 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
slice->SliceBytesInBuffer = size; slice->SliceBytesInBuffer = size;
slice->wBadSliceChopping = 0; slice->wBadSliceChopping = 0;
slice->first_mb_in_slice = (s->mb_y >> FIELD_OR_MBAFF_PICTURE) * s->mb_width + s->mb_x; slice->first_mb_in_slice = (h->mb_y >> FIELD_OR_MBAFF_PICTURE) * h->mb_width + h->mb_x;
slice->NumMbsForSlice = 0; /* XXX it is set once we have all slices */ slice->NumMbsForSlice = 0; /* XXX it is set once we have all slices */
slice->BitOffsetToSliceData = get_bits_count(&s->gb); slice->BitOffsetToSliceData = get_bits_count(&h->gb);
slice->slice_type = ff_h264_get_slice_type(h); slice->slice_type = ff_h264_get_slice_type(h);
if (h->slice_type_fixed) if (h->slice_type_fixed)
slice->slice_type += 5; slice->slice_type += 5;
...@@ -260,7 +258,7 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice, ...@@ -260,7 +258,7 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
} }
} }
slice->slice_qs_delta = 0; /* XXX not implemented by FFmpeg */ slice->slice_qs_delta = 0; /* XXX not implemented by FFmpeg */
slice->slice_qp_delta = s->qscale - h->pps.init_qp; slice->slice_qp_delta = h->qscale - h->pps.init_qp;
slice->redundant_pic_cnt = h->redundant_pic_count; slice->redundant_pic_cnt = h->redundant_pic_count;
if (h->slice_type == AV_PICTURE_TYPE_B) if (h->slice_type == AV_PICTURE_TYPE_B)
slice->direct_spatial_mv_pred_flag = h->direct_spatial_mv_pred; slice->direct_spatial_mv_pred_flag = h->direct_spatial_mv_pred;
...@@ -277,10 +275,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx, ...@@ -277,10 +275,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
DXVA2_DecodeBufferDesc *sc) DXVA2_DecodeBufferDesc *sc)
{ {
const H264Context *h = avctx->priv_data; const H264Context *h = avctx->priv_data;
const MpegEncContext *s = &h->s; const unsigned mb_count = h->mb_width * h->mb_height;
const unsigned mb_count = s->mb_width * s->mb_height;
struct dxva_context *ctx = avctx->hwaccel_context; struct dxva_context *ctx = avctx->hwaccel_context;
const Picture *current_picture = h->s.current_picture_ptr; const Picture *current_picture = h->cur_pic_ptr;
struct dxva2_picture_context *ctx_pic = current_picture->f.hwaccel_picture_private; struct dxva2_picture_context *ctx_pic = current_picture->f.hwaccel_picture_private;
DXVA_Slice_H264_Short *slice = NULL; DXVA_Slice_H264_Short *slice = NULL;
uint8_t *dxva_data, *current, *end; uint8_t *dxva_data, *current, *end;
...@@ -376,7 +373,7 @@ static int start_frame(AVCodecContext *avctx, ...@@ -376,7 +373,7 @@ static int start_frame(AVCodecContext *avctx,
{ {
const H264Context *h = avctx->priv_data; const H264Context *h = avctx->priv_data;
struct dxva_context *ctx = avctx->hwaccel_context; struct dxva_context *ctx = avctx->hwaccel_context;
struct dxva2_picture_context *ctx_pic = h->s.current_picture_ptr->f.hwaccel_picture_private; struct dxva2_picture_context *ctx_pic = h->cur_pic_ptr->f.hwaccel_picture_private;
if (!ctx->decoder || !ctx->cfg || ctx->surface_count <= 0) if (!ctx->decoder || !ctx->cfg || ctx->surface_count <= 0)
return -1; return -1;
...@@ -399,7 +396,7 @@ static int decode_slice(AVCodecContext *avctx, ...@@ -399,7 +396,7 @@ static int decode_slice(AVCodecContext *avctx,
{ {
const H264Context *h = avctx->priv_data; const H264Context *h = avctx->priv_data;
struct dxva_context *ctx = avctx->hwaccel_context; struct dxva_context *ctx = avctx->hwaccel_context;
const Picture *current_picture = h->s.current_picture_ptr; const Picture *current_picture = h->cur_pic_ptr;
struct dxva2_picture_context *ctx_pic = current_picture->f.hwaccel_picture_private; struct dxva2_picture_context *ctx_pic = current_picture->f.hwaccel_picture_private;
unsigned position; unsigned position;
...@@ -427,16 +424,19 @@ static int decode_slice(AVCodecContext *avctx, ...@@ -427,16 +424,19 @@ static int decode_slice(AVCodecContext *avctx,
static int end_frame(AVCodecContext *avctx) static int end_frame(AVCodecContext *avctx)
{ {
H264Context *h = avctx->priv_data; H264Context *h = avctx->priv_data;
MpegEncContext *s = &h->s;
struct dxva2_picture_context *ctx_pic = struct dxva2_picture_context *ctx_pic =
h->s.current_picture_ptr->f.hwaccel_picture_private; h->cur_pic_ptr->f.hwaccel_picture_private;
int ret;
if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
return -1; return -1;
return ff_dxva2_common_end_frame(avctx, s, ret = ff_dxva2_common_end_frame(avctx, h->cur_pic_ptr,
&ctx_pic->pp, sizeof(ctx_pic->pp), &ctx_pic->pp, sizeof(ctx_pic->pp),
&ctx_pic->qm, sizeof(ctx_pic->qm), &ctx_pic->qm, sizeof(ctx_pic->qm),
commit_bitstream_and_slice_buffer); commit_bitstream_and_slice_buffer);
if (!ret)
ff_h264_draw_horiz_band(h, 0, h->avctx->height);
return ret;
} }
AVHWAccel ff_h264_dxva2_hwaccel = { AVHWAccel ff_h264_dxva2_hwaccel = {
......
...@@ -54,7 +54,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *, ...@@ -54,7 +54,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *,
unsigned mb_count); unsigned mb_count);
int ff_dxva2_common_end_frame(AVCodecContext *, MpegEncContext *, int ff_dxva2_common_end_frame(AVCodecContext *, Picture *,
const void *pp, unsigned pp_size, const void *pp, unsigned pp_size,
const void *qm, unsigned qm_size, const void *qm, unsigned qm_size,
int (*commit_bs_si)(AVCodecContext *, int (*commit_bs_si)(AVCodecContext *,
......
...@@ -251,13 +251,17 @@ static int end_frame(AVCodecContext *avctx) ...@@ -251,13 +251,17 @@ static int end_frame(AVCodecContext *avctx)
struct MpegEncContext *s = avctx->priv_data; struct MpegEncContext *s = avctx->priv_data;
struct dxva2_picture_context *ctx_pic = struct dxva2_picture_context *ctx_pic =
s->current_picture_ptr->f.hwaccel_picture_private; s->current_picture_ptr->f.hwaccel_picture_private;
int ret;
if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0)
return -1; return -1;
return ff_dxva2_common_end_frame(avctx, s, ret = ff_dxva2_common_end_frame(avctx, s->current_picture_ptr,
&ctx_pic->pp, sizeof(ctx_pic->pp), &ctx_pic->pp, sizeof(ctx_pic->pp),
&ctx_pic->qm, sizeof(ctx_pic->qm), &ctx_pic->qm, sizeof(ctx_pic->qm),
commit_bitstream_and_slice_buffer); commit_bitstream_and_slice_buffer);
if (!ret)
ff_mpeg_draw_horiz_band(s, 0, avctx->height);
return ret;
} }
AVHWAccel ff_mpeg2_dxva2_hwaccel = { AVHWAccel ff_mpeg2_dxva2_hwaccel = {
......
...@@ -257,14 +257,18 @@ static int end_frame(AVCodecContext *avctx) ...@@ -257,14 +257,18 @@ static int end_frame(AVCodecContext *avctx)
{ {
VC1Context *v = avctx->priv_data; VC1Context *v = avctx->priv_data;
struct dxva2_picture_context *ctx_pic = v->s.current_picture_ptr->f.hwaccel_picture_private; struct dxva2_picture_context *ctx_pic = v->s.current_picture_ptr->f.hwaccel_picture_private;
int ret;
if (ctx_pic->bitstream_size <= 0) if (ctx_pic->bitstream_size <= 0)
return -1; return -1;
return ff_dxva2_common_end_frame(avctx, &v->s, ret = ff_dxva2_common_end_frame(avctx, v->s.current_picture_ptr,
&ctx_pic->pp, sizeof(ctx_pic->pp), &ctx_pic->pp, sizeof(ctx_pic->pp),
NULL, 0, NULL, 0,
commit_bitstream_and_slice_buffer); commit_bitstream_and_slice_buffer);
if (!ret)
ff_mpeg_draw_horiz_band(&v->s, 0, avctx->height);
return ret;
} }
#if CONFIG_WMV3_DXVA2_HWACCEL #if CONFIG_WMV3_DXVA2_HWACCEL
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "cabac.h" #include "cabac.h"
#include "get_bits.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#include "h264chroma.h" #include "h264chroma.h"
#include "h264dsp.h" #include "h264dsp.h"
...@@ -62,7 +63,7 @@ ...@@ -62,7 +63,7 @@
#define MB_MBAFF h->mb_mbaff #define MB_MBAFF h->mb_mbaff
#define MB_FIELD h->mb_field_decoding_flag #define MB_FIELD h->mb_field_decoding_flag
#define FRAME_MBAFF h->mb_aff_frame #define FRAME_MBAFF h->mb_aff_frame
#define FIELD_PICTURE (s->picture_structure != PICT_FRAME) #define FIELD_PICTURE (h->picture_structure != PICT_FRAME)
#define LEFT_MBS 2 #define LEFT_MBS 2
#define LTOP 0 #define LTOP 0
#define LBOT 1 #define LBOT 1
...@@ -254,15 +255,42 @@ typedef struct MMCO { ...@@ -254,15 +255,42 @@ typedef struct MMCO {
* H264Context * H264Context
*/ */
typedef struct H264Context { typedef struct H264Context {
MpegEncContext s; AVCodecContext *avctx;
DSPContext dsp;
VideoDSPContext vdsp;
H264DSPContext h264dsp; H264DSPContext h264dsp;
H264ChromaContext h264chroma; H264ChromaContext h264chroma;
H264QpelContext h264qpel; H264QpelContext h264qpel;
MotionEstContext me;
ParseContext parse_context;
GetBitContext gb;
ERContext er;
Picture *DPB;
Picture *cur_pic_ptr;
Picture cur_pic;
int picture_count;
int picture_range_start, picture_range_end;
int pixel_shift; ///< 0 for 8-bit H264, 1 for high-bit-depth H264 int pixel_shift; ///< 0 for 8-bit H264, 1 for high-bit-depth H264
int chroma_qp[2]; // QPc int chroma_qp[2]; // QPc
int qp_thresh; ///< QP threshold to skip loopfilter int qp_thresh; ///< QP threshold to skip loopfilter
int width, height;
int linesize, uvlinesize;
int chroma_x_shift, chroma_y_shift;
int qscale;
int droppable;
int data_partitioning;
int coded_picture_number;
int low_delay;
int context_initialized;
int flags;
int workaround_bugs;
int prev_mb_skipped; int prev_mb_skipped;
int next_mb_skipped; int next_mb_skipped;
...@@ -352,6 +380,8 @@ typedef struct H264Context { ...@@ -352,6 +380,8 @@ typedef struct H264Context {
int mb_aff_frame; int mb_aff_frame;
int mb_field_decoding_flag; int mb_field_decoding_flag;
int mb_mbaff; ///< mb_aff_frame && mb_field_decoding_flag int mb_mbaff; ///< mb_aff_frame && mb_field_decoding_flag
int picture_structure;
int first_field;
DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4]; DECLARE_ALIGNED(8, uint16_t, sub_mb_type)[4];
...@@ -428,6 +458,13 @@ typedef struct H264Context { ...@@ -428,6 +458,13 @@ typedef struct H264Context {
int x264_build; int x264_build;
int mb_x, mb_y;
int resync_mb_x;
int resync_mb_y;
int mb_skip_run;
int mb_height, mb_width;
int mb_stride;
int mb_num;
int mb_xy; int mb_xy;
int is_complex; int is_complex;
...@@ -452,7 +489,8 @@ typedef struct H264Context { ...@@ -452,7 +489,8 @@ typedef struct H264Context {
int nal_length_size; ///< Number of bytes used for nal length (1, 2 or 4) int nal_length_size; ///< Number of bytes used for nal length (1, 2 or 4)
int got_first; ///< this flag is != 0 if we've parsed a frame int got_first; ///< this flag is != 0 if we've parsed a frame
int context_reinitialized; int bit_depth_luma; ///< luma bit depth from sps to detect changes
int chroma_format_idc; ///< chroma format from sps to detect changes
SPS *sps_buffers[MAX_SPS_COUNT]; SPS *sps_buffers[MAX_SPS_COUNT];
PPS *pps_buffers[MAX_PPS_COUNT]; PPS *pps_buffers[MAX_PPS_COUNT];
...@@ -525,12 +563,16 @@ typedef struct H264Context { ...@@ -525,12 +563,16 @@ typedef struct H264Context {
*/ */
int max_contexts; int max_contexts;
int slice_context_count;
/** /**
* 1 if the single thread fallback warning has already been * 1 if the single thread fallback warning has already been
* displayed, 0 otherwise. * displayed, 0 otherwise.
*/ */
int single_decode_warning; int single_decode_warning;
enum AVPictureType pict_type;
int last_slice_type; int last_slice_type;
/** @} */ /** @} */
...@@ -602,6 +644,8 @@ typedef struct H264Context { ...@@ -602,6 +644,8 @@ typedef struct H264Context {
uint8_t parse_history[4]; uint8_t parse_history[4];
int parse_history_count; int parse_history_count;
int parse_last_mb; int parse_last_mb;
uint8_t *edge_emu_buffer;
int16_t *dc_val_base;
} H264Context; } H264Context;
extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1]; ///< One chroma qp table for each possible bit depth (8-14). extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1]; ///< One chroma qp table for each possible bit depth (8-14).
...@@ -810,7 +854,7 @@ static av_always_inline int pred_intra_mode(H264Context *h, int n) ...@@ -810,7 +854,7 @@ static av_always_inline int pred_intra_mode(H264Context *h, int n)
const int top = h->intra4x4_pred_mode_cache[index8 - 8]; const int top = h->intra4x4_pred_mode_cache[index8 - 8];
const int min = FFMIN(left, top); const int min = FFMIN(left, top);
tprintf(h->s.avctx, "mode:%d %d min:%d\n", left, top, min); tprintf(h->avctx, "mode:%d %d min:%d\n", left, top, min);
if (min < 0) if (min < 0)
return DC_PRED; return DC_PRED;
...@@ -844,7 +888,7 @@ static av_always_inline void write_back_non_zero_count(H264Context *h) ...@@ -844,7 +888,7 @@ static av_always_inline void write_back_non_zero_count(H264Context *h)
AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]); AV_COPY32(&nnz[32], &nnz_cache[4 + 8 * 11]);
AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]); AV_COPY32(&nnz[36], &nnz_cache[4 + 8 * 12]);
if (!h->s.chroma_y_shift) { if (!h->chroma_y_shift) {
AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]); AV_COPY32(&nnz[24], &nnz_cache[4 + 8 * 8]);
AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]); AV_COPY32(&nnz[28], &nnz_cache[4 + 8 * 9]);
AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]); AV_COPY32(&nnz[40], &nnz_cache[4 + 8 * 13]);
...@@ -853,12 +897,11 @@ static av_always_inline void write_back_non_zero_count(H264Context *h) ...@@ -853,12 +897,11 @@ static av_always_inline void write_back_non_zero_count(H264Context *h)
} }
static av_always_inline void write_back_motion_list(H264Context *h, static av_always_inline void write_back_motion_list(H264Context *h,
MpegEncContext *const s,
int b_stride, int b_stride,
int b_xy, int b8_xy, int b_xy, int b8_xy,
int mb_type, int list) int mb_type, int list)
{ {
int16_t(*mv_dst)[2] = &s->current_picture.f.motion_val[list][b_xy]; int16_t(*mv_dst)[2] = &h->cur_pic.f.motion_val[list][b_xy];
int16_t(*mv_src)[2] = &h->mv_cache[list][scan8[0]]; int16_t(*mv_src)[2] = &h->mv_cache[list][scan8[0]];
AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0); AV_COPY128(mv_dst + 0 * b_stride, mv_src + 8 * 0);
AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1); AV_COPY128(mv_dst + 1 * b_stride, mv_src + 8 * 1);
...@@ -879,7 +922,7 @@ static av_always_inline void write_back_motion_list(H264Context *h, ...@@ -879,7 +922,7 @@ static av_always_inline void write_back_motion_list(H264Context *h,
} }
{ {
int8_t *ref_index = &s->current_picture.f.ref_index[list][b8_xy]; int8_t *ref_index = &h->cur_pic.f.ref_index[list][b8_xy];
int8_t *ref_cache = h->ref_cache[list]; int8_t *ref_cache = h->ref_cache[list];
ref_index[0 + 0 * 2] = ref_cache[scan8[0]]; ref_index[0 + 0 * 2] = ref_cache[scan8[0]];
ref_index[1 + 0 * 2] = ref_cache[scan8[4]]; ref_index[1 + 0 * 2] = ref_cache[scan8[4]];
...@@ -890,19 +933,18 @@ static av_always_inline void write_back_motion_list(H264Context *h, ...@@ -890,19 +933,18 @@ static av_always_inline void write_back_motion_list(H264Context *h,
static av_always_inline void write_back_motion(H264Context *h, int mb_type) static av_always_inline void write_back_motion(H264Context *h, int mb_type)
{ {
MpegEncContext *const s = &h->s;
const int b_stride = h->b_stride; const int b_stride = h->b_stride;
const int b_xy = 4 * s->mb_x + 4 * s->mb_y * h->b_stride; // try mb2b(8)_xy const int b_xy = 4 * h->mb_x + 4 * h->mb_y * h->b_stride; // try mb2b(8)_xy
const int b8_xy = 4 * h->mb_xy; const int b8_xy = 4 * h->mb_xy;
if (USES_LIST(mb_type, 0)) { if (USES_LIST(mb_type, 0)) {
write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 0); write_back_motion_list(h, b_stride, b_xy, b8_xy, mb_type, 0);
} else { } else {
fill_rectangle(&s->current_picture.f.ref_index[0][b8_xy], fill_rectangle(&h->cur_pic.f.ref_index[0][b8_xy],
2, 2, 2, (uint8_t)LIST_NOT_USED, 1); 2, 2, 2, (uint8_t)LIST_NOT_USED, 1);
} }
if (USES_LIST(mb_type, 1)) if (USES_LIST(mb_type, 1))
write_back_motion_list(h, s, b_stride, b_xy, b8_xy, mb_type, 1); write_back_motion_list(h, b_stride, b_xy, b8_xy, mb_type, 1);
if (h->slice_type_nos == AV_PICTURE_TYPE_B && CABAC) { if (h->slice_type_nos == AV_PICTURE_TYPE_B && CABAC) {
if (IS_8X8(mb_type)) { if (IS_8X8(mb_type)) {
...@@ -926,4 +968,6 @@ static av_always_inline int get_dct8x8_allowed(H264Context *h) ...@@ -926,4 +968,6 @@ static av_always_inline int get_dct8x8_allowed(H264Context *h)
0x0001000100010001ULL)); 0x0001000100010001ULL));
} }
void ff_h264_draw_horiz_band(H264Context *h, int y, int height);
#endif /* AVCODEC_H264_H */ #endif /* AVCODEC_H264_H */
...@@ -1259,10 +1259,9 @@ static const int8_t cabac_context_init_PB[3][1024][2] = ...@@ -1259,10 +1259,9 @@ static const int8_t cabac_context_init_PB[3][1024][2] =
}; };
void ff_h264_init_cabac_states(H264Context *h) { void ff_h264_init_cabac_states(H264Context *h) {
MpegEncContext * const s = &h->s;
int i; int i;
const int8_t (*tab)[2]; const int8_t (*tab)[2];
const int slice_qp = av_clip(s->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51); const int slice_qp = av_clip(h->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I; if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I;
else tab = cabac_context_init_PB[h->cabac_init_idc]; else tab = cabac_context_init_PB[h->cabac_init_idc];
...@@ -1280,13 +1279,12 @@ void ff_h264_init_cabac_states(H264Context *h) { ...@@ -1280,13 +1279,12 @@ void ff_h264_init_cabac_states(H264Context *h) {
} }
static int decode_cabac_field_decoding_flag(H264Context *h) { static int decode_cabac_field_decoding_flag(H264Context *h) {
MpegEncContext * const s = &h->s; const long mbb_xy = h->mb_xy - 2L*h->mb_stride;
const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
unsigned long ctx = 0; unsigned long ctx = 0;
ctx += h->mb_field_decoding_flag & !!s->mb_x; //for FMO:(s->current_picture.f.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num); ctx += h->mb_field_decoding_flag & !!h->mb_x; //for FMO:(s->current_picture.f.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
ctx += (s->current_picture.f.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num); ctx += (h->cur_pic.f.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] ); return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
} }
...@@ -1322,34 +1320,33 @@ static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_sl ...@@ -1322,34 +1320,33 @@ static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_sl
} }
static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
MpegEncContext * const s = &h->s;
int mba_xy, mbb_xy; int mba_xy, mbb_xy;
int ctx = 0; int ctx = 0;
if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches? if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
int mb_xy = mb_x + (mb_y&~1)*s->mb_stride; int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
mba_xy = mb_xy - 1; mba_xy = mb_xy - 1;
if( (mb_y&1) if( (mb_y&1)
&& h->slice_table[mba_xy] == h->slice_num && h->slice_table[mba_xy] == h->slice_num
&& MB_FIELD == !!IS_INTERLACED( s->current_picture.f.mb_type[mba_xy] ) ) && MB_FIELD == !!IS_INTERLACED( h->cur_pic.f.mb_type[mba_xy] ) )
mba_xy += s->mb_stride; mba_xy += h->mb_stride;
if( MB_FIELD ){ if( MB_FIELD ){
mbb_xy = mb_xy - s->mb_stride; mbb_xy = mb_xy - h->mb_stride;
if( !(mb_y&1) if( !(mb_y&1)
&& h->slice_table[mbb_xy] == h->slice_num && h->slice_table[mbb_xy] == h->slice_num
&& IS_INTERLACED( s->current_picture.f.mb_type[mbb_xy] ) ) && IS_INTERLACED( h->cur_pic.f.mb_type[mbb_xy] ) )
mbb_xy -= s->mb_stride; mbb_xy -= h->mb_stride;
}else }else
mbb_xy = mb_x + (mb_y-1)*s->mb_stride; mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
}else{ }else{
int mb_xy = h->mb_xy; int mb_xy = h->mb_xy;
mba_xy = mb_xy - 1; mba_xy = mb_xy - 1;
mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE);
} }
if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mba_xy] )) if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP(h->cur_pic.f.mb_type[mba_xy] ))
ctx++; ctx++;
if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mbb_xy] )) if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP(h->cur_pic.f.mb_type[mbb_xy] ))
ctx++; ctx++;
if( h->slice_type_nos == AV_PICTURE_TYPE_B ) if( h->slice_type_nos == AV_PICTURE_TYPE_B )
...@@ -1506,7 +1503,7 @@ static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda ...@@ -1506,7 +1503,7 @@ static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda
mvd += 1 << k; mvd += 1 << k;
k++; k++;
if(k>24){ if(k>24){
av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n"); av_log(h->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
return INT_MIN; return INT_MIN;
} }
} }
...@@ -1831,8 +1828,7 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u ...@@ -1831,8 +1828,7 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u
static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}}; static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
const uint32_t *qmul; const uint32_t *qmul;
int i8x8, i4x4; int i8x8, i4x4;
MpegEncContext * const s = &h->s; int qscale = p == 0 ? h->qscale : h->chroma_qp[p-1];
int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
if( IS_INTRA16x16( mb_type ) ) { if( IS_INTRA16x16( mb_type ) ) {
AV_ZERO128(h->mb_luma_dc[p]+0); AV_ZERO128(h->mb_luma_dc[p]+0);
AV_ZERO128(h->mb_luma_dc[p]+8); AV_ZERO128(h->mb_luma_dc[p]+8);
...@@ -1878,7 +1874,6 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u ...@@ -1878,7 +1874,6 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u
* @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
*/ */
int ff_h264_decode_mb_cabac(H264Context *h) { int ff_h264_decode_mb_cabac(H264Context *h) {
MpegEncContext * const s = &h->s;
int mb_xy; int mb_xy;
int mb_type, partition_count, cbp = 0; int mb_type, partition_count, cbp = 0;
int dct8x8_allowed= h->pps.transform_8x8_mode; int dct8x8_allowed= h->pps.transform_8x8_mode;
...@@ -1886,21 +1881,21 @@ int ff_h264_decode_mb_cabac(H264Context *h) { ...@@ -1886,21 +1881,21 @@ int ff_h264_decode_mb_cabac(H264Context *h) {
const int pixel_shift = h->pixel_shift; const int pixel_shift = h->pixel_shift;
unsigned local_ref_count[2]; unsigned local_ref_count[2];
mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
if( h->slice_type_nos != AV_PICTURE_TYPE_I ) { if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
int skip; int skip;
/* a skipped mb needs the aff flag from the following mb */ /* a skipped mb needs the aff flag from the following mb */
if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped ) if( FRAME_MBAFF && (h->mb_y&1)==1 && h->prev_mb_skipped )
skip = h->next_mb_skipped; skip = h->next_mb_skipped;
else else
skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y ); skip = decode_cabac_mb_skip( h, h->mb_x, h->mb_y );
/* read skip flags */ /* read skip flags */
if( skip ) { if( skip ) {
if( FRAME_MBAFF && (s->mb_y&1)==0 ){ if( FRAME_MBAFF && (h->mb_y&1)==0 ){
s->current_picture.f.mb_type[mb_xy] = MB_TYPE_SKIP; h->cur_pic.f.mb_type[mb_xy] = MB_TYPE_SKIP;
h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 ); h->next_mb_skipped = decode_cabac_mb_skip( h, h->mb_x, h->mb_y+1 );
if(!h->next_mb_skipped) if(!h->next_mb_skipped)
h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
} }
...@@ -1916,7 +1911,7 @@ int ff_h264_decode_mb_cabac(H264Context *h) { ...@@ -1916,7 +1911,7 @@ int ff_h264_decode_mb_cabac(H264Context *h) {
} }
} }
if(FRAME_MBAFF){ if(FRAME_MBAFF){
if( (s->mb_y&1) == 0 ) if( (h->mb_y&1) == 0 )
h->mb_mbaff = h->mb_mbaff =
h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
} }
...@@ -2017,10 +2012,10 @@ decode_intra_mb: ...@@ -2017,10 +2012,10 @@ decode_intra_mb:
h->cbp_table[mb_xy] = 0xf7ef; h->cbp_table[mb_xy] = 0xf7ef;
h->chroma_pred_mode_table[mb_xy] = 0; h->chroma_pred_mode_table[mb_xy] = 0;
// In deblocking, the quantizer is 0 // In deblocking, the quantizer is 0
s->current_picture.f.qscale_table[mb_xy] = 0; h->cur_pic.f.qscale_table[mb_xy] = 0;
// All coeffs are present // All coeffs are present
memset(h->non_zero_count[mb_xy], 16, 48); memset(h->non_zero_count[mb_xy], 16, 48);
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
h->last_qscale_diff = 0; h->last_qscale_diff = 0;
return 0; return 0;
} }
...@@ -2045,7 +2040,7 @@ decode_intra_mb: ...@@ -2045,7 +2040,7 @@ decode_intra_mb:
int pred = pred_intra_mode( h, i ); int pred = pred_intra_mode( h, i );
h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred ); h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
av_dlog(s->avctx, "i4x4 pred=%d mode=%d\n", pred, av_dlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
h->intra4x4_pred_mode_cache[scan8[i]]); h->intra4x4_pred_mode_cache[scan8[i]]);
} }
} }
...@@ -2099,7 +2094,7 @@ decode_intra_mb: ...@@ -2099,7 +2094,7 @@ decode_intra_mb:
if (local_ref_count[list] > 1) { if (local_ref_count[list] > 1) {
ref[list][i] = decode_cabac_mb_ref( h, list, 4*i ); ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
if (ref[list][i] >= (unsigned)local_ref_count[list]) { if (ref[list][i] >= (unsigned)local_ref_count[list]) {
av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]); av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]);
return -1; return -1;
} }
}else }else
...@@ -2134,7 +2129,7 @@ decode_intra_mb: ...@@ -2134,7 +2129,7 @@ decode_intra_mb:
uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ]; uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my); pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
DECODE_CABAC_MB_MVD( h, list, index) DECODE_CABAC_MB_MVD( h, list, index)
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
if(IS_SUB_8X8(sub_mb_type)){ if(IS_SUB_8X8(sub_mb_type)){
mv_cache[ 1 ][0]= mv_cache[ 1 ][0]=
...@@ -2185,7 +2180,7 @@ decode_intra_mb: ...@@ -2185,7 +2180,7 @@ decode_intra_mb:
if (local_ref_count[list] > 1) { if (local_ref_count[list] > 1) {
ref= decode_cabac_mb_ref(h, list, 0); ref= decode_cabac_mb_ref(h, list, 0);
if (ref >= (unsigned)local_ref_count[list]) { if (ref >= (unsigned)local_ref_count[list]) {
av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
return -1; return -1;
} }
}else }else
...@@ -2198,7 +2193,7 @@ decode_intra_mb: ...@@ -2198,7 +2193,7 @@ decode_intra_mb:
int mx,my,mpx,mpy; int mx,my,mpx,mpy;
pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
DECODE_CABAC_MB_MVD( h, list, 0) DECODE_CABAC_MB_MVD( h, list, 0)
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2); fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
...@@ -2213,7 +2208,7 @@ decode_intra_mb: ...@@ -2213,7 +2208,7 @@ decode_intra_mb:
if (local_ref_count[list] > 1) { if (local_ref_count[list] > 1) {
ref= decode_cabac_mb_ref( h, list, 8*i ); ref= decode_cabac_mb_ref( h, list, 8*i );
if (ref >= (unsigned)local_ref_count[list]) { if (ref >= (unsigned)local_ref_count[list]) {
av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
return -1; return -1;
} }
}else }else
...@@ -2229,7 +2224,7 @@ decode_intra_mb: ...@@ -2229,7 +2224,7 @@ decode_intra_mb:
int mx,my,mpx,mpy; int mx,my,mpx,mpy;
pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my); pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
DECODE_CABAC_MB_MVD( h, list, 8*i) DECODE_CABAC_MB_MVD( h, list, 8*i)
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2); fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
...@@ -2248,7 +2243,7 @@ decode_intra_mb: ...@@ -2248,7 +2243,7 @@ decode_intra_mb:
if (local_ref_count[list] > 1) { if (local_ref_count[list] > 1) {
ref= decode_cabac_mb_ref( h, list, 4*i ); ref= decode_cabac_mb_ref( h, list, 4*i );
if (ref >= (unsigned)local_ref_count[list]) { if (ref >= (unsigned)local_ref_count[list]) {
av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
return -1; return -1;
} }
}else }else
...@@ -2265,7 +2260,7 @@ decode_intra_mb: ...@@ -2265,7 +2260,7 @@ decode_intra_mb:
pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
DECODE_CABAC_MB_MVD( h, list, 4*i) DECODE_CABAC_MB_MVD( h, list, 4*i)
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2); fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
}else{ }else{
...@@ -2288,7 +2283,7 @@ decode_intra_mb: ...@@ -2288,7 +2283,7 @@ decode_intra_mb:
cbp |= decode_cabac_mb_cbp_chroma( h ) << 4; cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
} else { } else {
if (!decode_chroma && cbp>15) { if (!decode_chroma && cbp>15) {
av_log(s->avctx, AV_LOG_ERROR, "gray chroma\n"); av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
} }
...@@ -2321,18 +2316,18 @@ decode_intra_mb: ...@@ -2321,18 +2316,18 @@ decode_intra_mb:
AV_WN32A(&nnz_cache[4+8*10], top_empty); AV_WN32A(&nnz_cache[4+8*10], top_empty);
} }
} }
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
if( cbp || IS_INTRA16x16( mb_type ) ) { if( cbp || IS_INTRA16x16( mb_type ) ) {
const uint8_t *scan, *scan8x8; const uint8_t *scan, *scan8x8;
const uint32_t *qmul; const uint32_t *qmul;
if(IS_INTERLACED(mb_type)){ if(IS_INTERLACED(mb_type)){
scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; scan8x8= h->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
scan= s->qscale ? h->field_scan : h->field_scan_q0; scan= h->qscale ? h->field_scan : h->field_scan_q0;
}else{ }else{
scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0; scan8x8= h->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; scan= h->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
} }
// decode_cabac_mb_dqp // decode_cabac_mb_dqp
...@@ -2345,7 +2340,7 @@ decode_intra_mb: ...@@ -2345,7 +2340,7 @@ decode_intra_mb:
ctx= 3; ctx= 3;
val++; val++;
if(val > 2*max_qp){ //prevent infinite loop if(val > 2*max_qp){ //prevent infinite loop
av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", h->mb_x, h->mb_y);
return -1; return -1;
} }
} }
...@@ -2355,13 +2350,13 @@ decode_intra_mb: ...@@ -2355,13 +2350,13 @@ decode_intra_mb:
else else
val= -((val + 1)>>1); val= -((val + 1)>>1);
h->last_qscale_diff = val; h->last_qscale_diff = val;
s->qscale += val; h->qscale += val;
if(((unsigned)s->qscale) > max_qp){ if(((unsigned)h->qscale) > max_qp){
if(s->qscale<0) s->qscale+= max_qp+1; if(h->qscale<0) h->qscale+= max_qp+1;
else s->qscale-= max_qp+1; else h->qscale-= max_qp+1;
} }
h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
}else }else
h->last_qscale_diff=0; h->last_qscale_diff=0;
...@@ -2423,7 +2418,7 @@ decode_intra_mb: ...@@ -2423,7 +2418,7 @@ decode_intra_mb:
h->last_qscale_diff = 0; h->last_qscale_diff = 0;
} }
s->current_picture.f.qscale_table[mb_xy] = s->qscale; h->cur_pic.f.qscale_table[mb_xy] = h->qscale;
write_back_non_zero_count(h); write_back_non_zero_count(h);
return 0; return 0;
......
...@@ -292,7 +292,7 @@ static inline int pred_non_zero_count(H264Context *h, int n){ ...@@ -292,7 +292,7 @@ static inline int pred_non_zero_count(H264Context *h, int n){
if(i<64) i= (i+1)>>1; if(i<64) i= (i+1)>>1;
tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31); tprintf(h->avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
return i&31; return i&31;
} }
...@@ -443,7 +443,6 @@ static inline int get_level_prefix(GetBitContext *gb){ ...@@ -443,7 +443,6 @@ static inline int get_level_prefix(GetBitContext *gb){
* @return <0 if an error occurred * @return <0 if an error occurred
*/ */
static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){
MpegEncContext * const s = &h->s;
static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}; static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
int level[16]; int level[16];
int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before; int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
...@@ -474,12 +473,12 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in ...@@ -474,12 +473,12 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in
if(total_coeff==0) if(total_coeff==0)
return 0; return 0;
if(total_coeff > (unsigned)max_coeff) { if(total_coeff > (unsigned)max_coeff) {
av_log(h->s.avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", s->mb_x, s->mb_y, total_coeff); av_log(h->avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", h->mb_x, h->mb_y, total_coeff);
return -1; return -1;
} }
trailing_ones= coeff_token&3; trailing_ones= coeff_token&3;
tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff); tprintf(h->avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
av_assert2(total_coeff<=16); av_assert2(total_coeff<=16);
i = show_bits(gb, 3); i = show_bits(gb, 3);
...@@ -515,7 +514,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in ...@@ -515,7 +514,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in
level_code= 30; level_code= 30;
if(prefix>=16){ if(prefix>=16){
if(prefix > 25+3){ if(prefix > 25+3){
av_log(h->s.avctx, AV_LOG_ERROR, "Invalid level prefix\n"); av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
return -1; return -1;
} }
level_code += (1<<(prefix-3))-4096; level_code += (1<<(prefix-3))-4096;
...@@ -618,7 +617,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in ...@@ -618,7 +617,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in
} }
if(zeros_left<0){ if(zeros_left<0){
av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", h->mb_x, h->mb_y);
return -1; return -1;
} }
...@@ -627,8 +626,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in ...@@ -627,8 +626,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, int16_t *block, in
static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext *gb, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p){ static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext *gb, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p){
int i4x4, i8x8; int i4x4, i8x8;
MpegEncContext * const s = &h->s; int qscale = p == 0 ? h->qscale : h->chroma_qp[p-1];
int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
if(IS_INTRA16x16(mb_type)){ if(IS_INTRA16x16(mb_type)){
AV_ZERO128(h->mb_luma_dc[p]+0); AV_ZERO128(h->mb_luma_dc[p]+0);
AV_ZERO128(h->mb_luma_dc[p]+8); AV_ZERO128(h->mb_luma_dc[p]+8);
...@@ -693,7 +691,6 @@ static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext * ...@@ -693,7 +691,6 @@ static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext *
} }
int ff_h264_decode_mb_cavlc(H264Context *h){ int ff_h264_decode_mb_cavlc(H264Context *h){
MpegEncContext * const s = &h->s;
int mb_xy; int mb_xy;
int partition_count; int partition_count;
unsigned int mb_type, cbp; unsigned int mb_type, cbp;
...@@ -702,32 +699,32 @@ int ff_h264_decode_mb_cavlc(H264Context *h){ ...@@ -702,32 +699,32 @@ int ff_h264_decode_mb_cavlc(H264Context *h){
const int pixel_shift = h->pixel_shift; const int pixel_shift = h->pixel_shift;
unsigned local_ref_count[2]; unsigned local_ref_count[2];
mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
cbp = 0; /* avoid warning. FIXME: find a solution without slowing cbp = 0; /* avoid warning. FIXME: find a solution without slowing
down the code */ down the code */
if(h->slice_type_nos != AV_PICTURE_TYPE_I){ if(h->slice_type_nos != AV_PICTURE_TYPE_I){
if(s->mb_skip_run==-1) if(h->mb_skip_run==-1)
s->mb_skip_run= get_ue_golomb(&s->gb); h->mb_skip_run= get_ue_golomb(&h->gb);
if (s->mb_skip_run--) { if (h->mb_skip_run--) {
if(FRAME_MBAFF && (s->mb_y&1) == 0){ if(FRAME_MBAFF && (h->mb_y&1) == 0){
if(s->mb_skip_run==0) if(h->mb_skip_run==0)
h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&h->gb);
} }
decode_mb_skip(h); decode_mb_skip(h);
return 0; return 0;
} }
} }
if(FRAME_MBAFF){ if(FRAME_MBAFF){
if( (s->mb_y&1) == 0 ) if( (h->mb_y&1) == 0 )
h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb); h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&h->gb);
} }
h->prev_mb_skipped= 0; h->prev_mb_skipped= 0;
mb_type= get_ue_golomb(&s->gb); mb_type= get_ue_golomb(&h->gb);
if(h->slice_type_nos == AV_PICTURE_TYPE_B){ if(h->slice_type_nos == AV_PICTURE_TYPE_B){
if(mb_type < 23){ if(mb_type < 23){
partition_count= b_mb_type_info[mb_type].partition_count; partition_count= b_mb_type_info[mb_type].partition_count;
...@@ -750,7 +747,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h){ ...@@ -750,7 +747,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h){
mb_type--; mb_type--;
decode_intra_mb: decode_intra_mb:
if(mb_type > 25){ if(mb_type > 25){
av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(h->slice_type), s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(h->slice_type), h->mb_x, h->mb_y);
return -1; return -1;
} }
partition_count=0; partition_count=0;
...@@ -770,19 +767,19 @@ decode_intra_mb: ...@@ -770,19 +767,19 @@ decode_intra_mb:
h->sps.bit_depth_luma >> 3; h->sps.bit_depth_luma >> 3;
// We assume these blocks are very rare so we do not optimize it. // We assume these blocks are very rare so we do not optimize it.
align_get_bits(&s->gb); align_get_bits(&h->gb);
// The pixels are stored in the same order as levels in h->mb array. // The pixels are stored in the same order as levels in h->mb array.
for(x=0; x < mb_size; x++){ for(x=0; x < mb_size; x++){
((uint8_t*)h->mb)[x]= get_bits(&s->gb, 8); ((uint8_t*)h->mb)[x]= get_bits(&h->gb, 8);
} }
// In deblocking, the quantizer is 0 // In deblocking, the quantizer is 0
s->current_picture.f.qscale_table[mb_xy] = 0; h->cur_pic.f.qscale_table[mb_xy] = 0;
// All coeffs are present // All coeffs are present
memset(h->non_zero_count[mb_xy], 16, 48); memset(h->non_zero_count[mb_xy], 16, 48);
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
return 0; return 0;
} }
...@@ -799,7 +796,7 @@ decode_intra_mb: ...@@ -799,7 +796,7 @@ decode_intra_mb:
if(IS_INTRA4x4(mb_type)){ if(IS_INTRA4x4(mb_type)){
int i; int i;
int di = 1; int di = 1;
if(dct8x8_allowed && get_bits1(&s->gb)){ if(dct8x8_allowed && get_bits1(&h->gb)){
mb_type |= MB_TYPE_8x8DCT; mb_type |= MB_TYPE_8x8DCT;
di = 4; di = 4;
} }
...@@ -808,8 +805,8 @@ decode_intra_mb: ...@@ -808,8 +805,8 @@ decode_intra_mb:
for(i=0; i<16; i+=di){ for(i=0; i<16; i+=di){
int mode= pred_intra_mode(h, i); int mode= pred_intra_mode(h, i);
if(!get_bits1(&s->gb)){ if(!get_bits1(&h->gb)){
const int rem_mode= get_bits(&s->gb, 3); const int rem_mode= get_bits(&h->gb, 3);
mode = rem_mode + (rem_mode >= mode); mode = rem_mode + (rem_mode >= mode);
} }
...@@ -827,7 +824,7 @@ decode_intra_mb: ...@@ -827,7 +824,7 @@ decode_intra_mb:
return -1; return -1;
} }
if(decode_chroma){ if(decode_chroma){
pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&s->gb), 1); pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&h->gb), 1);
if(pred_mode < 0) if(pred_mode < 0)
return -1; return -1;
h->chroma_pred_mode= pred_mode; h->chroma_pred_mode= pred_mode;
...@@ -839,9 +836,9 @@ decode_intra_mb: ...@@ -839,9 +836,9 @@ decode_intra_mb:
if(h->slice_type_nos == AV_PICTURE_TYPE_B){ if(h->slice_type_nos == AV_PICTURE_TYPE_B){
for(i=0; i<4; i++){ for(i=0; i<4; i++){
h->sub_mb_type[i]= get_ue_golomb_31(&s->gb); h->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
if(h->sub_mb_type[i] >=13){ if(h->sub_mb_type[i] >=13){
av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], h->mb_x, h->mb_y);
return -1; return -1;
} }
sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
...@@ -857,9 +854,9 @@ decode_intra_mb: ...@@ -857,9 +854,9 @@ decode_intra_mb:
}else{ }else{
av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ? av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ?
for(i=0; i<4; i++){ for(i=0; i<4; i++){
h->sub_mb_type[i]= get_ue_golomb_31(&s->gb); h->sub_mb_type[i]= get_ue_golomb_31(&h->gb);
if(h->sub_mb_type[i] >=4){ if(h->sub_mb_type[i] >=4){
av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], h->mb_x, h->mb_y);
return -1; return -1;
} }
sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
...@@ -876,11 +873,11 @@ decode_intra_mb: ...@@ -876,11 +873,11 @@ decode_intra_mb:
if(ref_count == 1){ if(ref_count == 1){
tmp= 0; tmp= 0;
}else if(ref_count == 2){ }else if(ref_count == 2){
tmp= get_bits1(&s->gb)^1; tmp= get_bits1(&h->gb)^1;
}else{ }else{
tmp= get_ue_golomb_31(&s->gb); tmp= get_ue_golomb_31(&h->gb);
if(tmp>=ref_count){ if(tmp>=ref_count){
av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp); av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
return -1; return -1;
} }
} }
...@@ -912,9 +909,9 @@ decode_intra_mb: ...@@ -912,9 +909,9 @@ decode_intra_mb:
const int index= 4*i + block_width*j; const int index= 4*i + block_width*j;
int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ]; int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my); pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
mx += get_se_golomb(&s->gb); mx += get_se_golomb(&h->gb);
my += get_se_golomb(&s->gb); my += get_se_golomb(&h->gb);
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
if(IS_SUB_8X8(sub_mb_type)){ if(IS_SUB_8X8(sub_mb_type)){
mv_cache[ 1 ][0]= mv_cache[ 1 ][0]=
...@@ -951,11 +948,11 @@ decode_intra_mb: ...@@ -951,11 +948,11 @@ decode_intra_mb:
if(local_ref_count[list]==1){ if(local_ref_count[list]==1){
val= 0; val= 0;
}else if(local_ref_count[list]==2){ }else if(local_ref_count[list]==2){
val= get_bits1(&s->gb)^1; val= get_bits1(&h->gb)^1;
}else{ }else{
val= get_ue_golomb_31(&s->gb); val= get_ue_golomb_31(&h->gb);
if(val >= local_ref_count[list]){ if(val >= local_ref_count[list]){
av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
return -1; return -1;
} }
} }
...@@ -965,9 +962,9 @@ decode_intra_mb: ...@@ -965,9 +962,9 @@ decode_intra_mb:
for(list=0; list<h->list_count; list++){ for(list=0; list<h->list_count; list++){
if(IS_DIR(mb_type, 0, list)){ if(IS_DIR(mb_type, 0, list)){
pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
mx += get_se_golomb(&s->gb); mx += get_se_golomb(&h->gb);
my += get_se_golomb(&s->gb); my += get_se_golomb(&h->gb);
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
} }
...@@ -981,11 +978,11 @@ decode_intra_mb: ...@@ -981,11 +978,11 @@ decode_intra_mb:
if(local_ref_count[list] == 1){ if(local_ref_count[list] == 1){
val= 0; val= 0;
}else if(local_ref_count[list] == 2){ }else if(local_ref_count[list] == 2){
val= get_bits1(&s->gb)^1; val= get_bits1(&h->gb)^1;
}else{ }else{
val= get_ue_golomb_31(&s->gb); val= get_ue_golomb_31(&h->gb);
if(val >= local_ref_count[list]){ if(val >= local_ref_count[list]){
av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
return -1; return -1;
} }
} }
...@@ -999,9 +996,9 @@ decode_intra_mb: ...@@ -999,9 +996,9 @@ decode_intra_mb:
unsigned int val; unsigned int val;
if(IS_DIR(mb_type, i, list)){ if(IS_DIR(mb_type, i, list)){
pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my); pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
mx += get_se_golomb(&s->gb); mx += get_se_golomb(&h->gb);
my += get_se_golomb(&s->gb); my += get_se_golomb(&h->gb);
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
val= pack16to32(mx,my); val= pack16to32(mx,my);
}else }else
...@@ -1018,11 +1015,11 @@ decode_intra_mb: ...@@ -1018,11 +1015,11 @@ decode_intra_mb:
if(local_ref_count[list]==1){ if(local_ref_count[list]==1){
val= 0; val= 0;
}else if(local_ref_count[list]==2){ }else if(local_ref_count[list]==2){
val= get_bits1(&s->gb)^1; val= get_bits1(&h->gb)^1;
}else{ }else{
val= get_ue_golomb_31(&s->gb); val= get_ue_golomb_31(&h->gb);
if(val >= local_ref_count[list]){ if(val >= local_ref_count[list]){
av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
return -1; return -1;
} }
} }
...@@ -1036,9 +1033,9 @@ decode_intra_mb: ...@@ -1036,9 +1033,9 @@ decode_intra_mb:
unsigned int val; unsigned int val;
if(IS_DIR(mb_type, i, list)){ if(IS_DIR(mb_type, i, list)){
pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my); pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
mx += get_se_golomb(&s->gb); mx += get_se_golomb(&h->gb);
my += get_se_golomb(&s->gb); my += get_se_golomb(&h->gb);
tprintf(s->avctx, "final mv:%d %d\n", mx, my); tprintf(h->avctx, "final mv:%d %d\n", mx, my);
val= pack16to32(mx,my); val= pack16to32(mx,my);
}else }else
...@@ -1053,18 +1050,18 @@ decode_intra_mb: ...@@ -1053,18 +1050,18 @@ decode_intra_mb:
write_back_motion(h, mb_type); write_back_motion(h, mb_type);
if(!IS_INTRA16x16(mb_type)){ if(!IS_INTRA16x16(mb_type)){
cbp= get_ue_golomb(&s->gb); cbp= get_ue_golomb(&h->gb);
if(decode_chroma){ if(decode_chroma){
if(cbp > 47){ if(cbp > 47){
av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, h->mb_x, h->mb_y);
return -1; return -1;
} }
if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp]; if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp];
else cbp= golomb_to_inter_cbp [cbp]; else cbp= golomb_to_inter_cbp [cbp];
}else{ }else{
if(cbp > 15){ if(cbp > 15){
av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, h->mb_x, h->mb_y);
return -1; return -1;
} }
if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp]; if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp];
...@@ -1072,17 +1069,17 @@ decode_intra_mb: ...@@ -1072,17 +1069,17 @@ decode_intra_mb:
} }
} else { } else {
if (!decode_chroma && cbp>15) { if (!decode_chroma && cbp>15) {
av_log(s->avctx, AV_LOG_ERROR, "gray chroma\n"); av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
} }
if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){ if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
mb_type |= MB_TYPE_8x8DCT*get_bits1(&s->gb); mb_type |= MB_TYPE_8x8DCT*get_bits1(&h->gb);
} }
h->cbp= h->cbp=
h->cbp_table[mb_xy]= cbp; h->cbp_table[mb_xy]= cbp;
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
if(cbp || IS_INTRA16x16(mb_type)){ if(cbp || IS_INTRA16x16(mb_type)){
int i4x4, i8x8, chroma_idx; int i4x4, i8x8, chroma_idx;
...@@ -1093,28 +1090,28 @@ decode_intra_mb: ...@@ -1093,28 +1090,28 @@ decode_intra_mb:
const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8); const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
if(IS_INTERLACED(mb_type)){ if(IS_INTERLACED(mb_type)){
scan8x8= s->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0; scan8x8= h->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0;
scan= s->qscale ? h->field_scan : h->field_scan_q0; scan= h->qscale ? h->field_scan : h->field_scan_q0;
}else{ }else{
scan8x8= s->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0; scan8x8= h->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; scan= h->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
} }
dquant= get_se_golomb(&s->gb); dquant= get_se_golomb(&h->gb);
s->qscale += dquant; h->qscale += dquant;
if(((unsigned)s->qscale) > max_qp){ if(((unsigned)h->qscale) > max_qp){
if(s->qscale<0) s->qscale+= max_qp+1; if(h->qscale<0) h->qscale+= max_qp+1;
else s->qscale-= max_qp+1; else h->qscale-= max_qp+1;
if(((unsigned)s->qscale) > max_qp){ if(((unsigned)h->qscale) > max_qp){
av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y); av_log(h->avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, h->mb_x, h->mb_y);
return -1; return -1;
} }
} }
h->chroma_qp[0]= get_chroma_qp(h, 0, s->qscale); h->chroma_qp[0]= get_chroma_qp(h, 0, h->qscale);
h->chroma_qp[1]= get_chroma_qp(h, 1, s->qscale); h->chroma_qp[1]= get_chroma_qp(h, 1, h->qscale);
if( (ret = decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ){ if( (ret = decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ){
return -1; return -1;
...@@ -1163,7 +1160,7 @@ decode_intra_mb: ...@@ -1163,7 +1160,7 @@ decode_intra_mb:
fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1); fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1); fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
} }
s->current_picture.f.qscale_table[mb_xy] = s->qscale; h->cur_pic.f.qscale_table[mb_xy] = h->qscale;
write_back_non_zero_count(h); write_back_non_zero_count(h);
return 0; return 0;
......
...@@ -50,14 +50,13 @@ static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){ ...@@ -50,14 +50,13 @@ static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){
} }
void ff_h264_direct_dist_scale_factor(H264Context * const h){ void ff_h264_direct_dist_scale_factor(H264Context * const h){
MpegEncContext * const s = &h->s; const int poc = h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD];
const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ];
const int poc1 = h->ref_list[1][0].poc; const int poc1 = h->ref_list[1][0].poc;
int i, field; int i, field;
if (FRAME_MBAFF) if (FRAME_MBAFF)
for (field = 0; field < 2; field++){ for (field = 0; field < 2; field++){
const int poc = h->s.current_picture_ptr->field_poc[field]; const int poc = h->cur_pic_ptr->field_poc[field];
const int poc1 = h->ref_list[1][0].field_poc[field]; const int poc1 = h->ref_list[1][0].field_poc[field];
for (i = 0; i < 2 * h->ref_count[0]; i++) for (i = 0; i < 2 * h->ref_count[0]; i++)
h->dist_scale_factor_field[field][i^field] = h->dist_scale_factor_field[field][i^field] =
...@@ -70,12 +69,11 @@ void ff_h264_direct_dist_scale_factor(H264Context * const h){ ...@@ -70,12 +69,11 @@ void ff_h264_direct_dist_scale_factor(H264Context * const h){
} }
static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){ static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){
MpegEncContext * const s = &h->s;
Picture * const ref1 = &h->ref_list[1][0]; Picture * const ref1 = &h->ref_list[1][0];
int j, old_ref, rfield; int j, old_ref, rfield;
int start= mbafi ? 16 : 0; int start= mbafi ? 16 : 0;
int end = mbafi ? 16+2*h->ref_count[0] : h->ref_count[0]; int end = mbafi ? 16+2*h->ref_count[0] : h->ref_count[0];
int interl= mbafi || s->picture_structure != PICT_FRAME; int interl= mbafi || h->picture_structure != PICT_FRAME;
/* bogus; fills in for missing frames */ /* bogus; fills in for missing frames */
memset(map[list], 0, sizeof(map[list])); memset(map[list], 0, sizeof(map[list]));
...@@ -104,11 +102,10 @@ static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, ...@@ -104,11 +102,10 @@ static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field,
} }
void ff_h264_direct_ref_list_init(H264Context * const h){ void ff_h264_direct_ref_list_init(H264Context * const h){
MpegEncContext * const s = &h->s;
Picture * const ref1 = &h->ref_list[1][0]; Picture * const ref1 = &h->ref_list[1][0];
Picture * const cur = s->current_picture_ptr; Picture * const cur = h->cur_pic_ptr;
int list, j, field; int list, j, field;
int sidx= (s->picture_structure&1)^1; int sidx= (h->picture_structure&1)^1;
int ref1sidx = (ref1->f.reference&1)^1; int ref1sidx = (ref1->f.reference&1)^1;
for(list=0; list<2; list++){ for(list=0; list<2; list++){
...@@ -117,7 +114,7 @@ void ff_h264_direct_ref_list_init(H264Context * const h){ ...@@ -117,7 +114,7 @@ void ff_h264_direct_ref_list_init(H264Context * const h){
cur->ref_poc[sidx][list][j] = 4 * h->ref_list[list][j].frame_num + (h->ref_list[list][j].f.reference & 3); cur->ref_poc[sidx][list][j] = 4 * h->ref_list[list][j].frame_num + (h->ref_list[list][j].f.reference & 3);
} }
if(s->picture_structure == PICT_FRAME){ if(h->picture_structure == PICT_FRAME){
memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0])); memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0]));
memcpy(cur->ref_poc [1], cur->ref_poc [0], sizeof(cur->ref_poc [0])); memcpy(cur->ref_poc [1], cur->ref_poc [0], sizeof(cur->ref_poc [0]));
} }
...@@ -125,12 +122,12 @@ void ff_h264_direct_ref_list_init(H264Context * const h){ ...@@ -125,12 +122,12 @@ void ff_h264_direct_ref_list_init(H264Context * const h){
cur->mbaff= FRAME_MBAFF; cur->mbaff= FRAME_MBAFF;
h->col_fieldoff= 0; h->col_fieldoff= 0;
if(s->picture_structure == PICT_FRAME){ if(h->picture_structure == PICT_FRAME){
int cur_poc = s->current_picture_ptr->poc; int cur_poc = h->cur_pic_ptr->poc;
int *col_poc = h->ref_list[1]->field_poc; int *col_poc = h->ref_list[1]->field_poc;
h->col_parity= (FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc)); h->col_parity= (FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc));
ref1sidx=sidx= h->col_parity; ref1sidx=sidx= h->col_parity;
} else if (!(s->picture_structure & h->ref_list[1][0].f.reference) && !h->ref_list[1][0].mbaff) { // FL -> FL & differ parity } else if (!(h->picture_structure & h->ref_list[1][0].f.reference) && !h->ref_list[1][0].mbaff) { // FL -> FL & differ parity
h->col_fieldoff = 2 * h->ref_list[1][0].f.reference - 3; h->col_fieldoff = 2 * h->ref_list[1][0].f.reference - 3;
} }
...@@ -149,9 +146,9 @@ static void await_reference_mb_row(H264Context * const h, Picture *ref, int mb_y ...@@ -149,9 +146,9 @@ static void await_reference_mb_row(H264Context * const h, Picture *ref, int mb_y
{ {
int ref_field = ref->f.reference - 1; int ref_field = ref->f.reference - 1;
int ref_field_picture = ref->field_picture; int ref_field_picture = ref->field_picture;
int ref_height = 16*h->s.mb_height >> ref_field_picture; int ref_height = 16*h->mb_height >> ref_field_picture;
if(!HAVE_THREADS || !(h->s.avctx->active_thread_type&FF_THREAD_FRAME)) if(!HAVE_THREADS || !(h->avctx->active_thread_type&FF_THREAD_FRAME))
return; return;
//FIXME it can be safe to access mb stuff //FIXME it can be safe to access mb stuff
...@@ -163,10 +160,9 @@ static void await_reference_mb_row(H264Context * const h, Picture *ref, int mb_y ...@@ -163,10 +160,9 @@ static void await_reference_mb_row(H264Context * const h, Picture *ref, int mb_y
} }
static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){
MpegEncContext * const s = &h->s;
int b8_stride = 2; int b8_stride = 2;
int b4_stride = h->b_stride; int b4_stride = h->b_stride;
int mb_xy = h->mb_xy, mb_y = s->mb_y; int mb_xy = h->mb_xy, mb_y = h->mb_y;
int mb_type_col[2]; int mb_type_col[2];
const int16_t (*l1mv0)[2], (*l1mv1)[2]; const int16_t (*l1mv0)[2], (*l1mv1)[2];
const int8_t *l1ref0, *l1ref1; const int8_t *l1ref0, *l1ref1;
...@@ -179,7 +175,7 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){ ...@@ -179,7 +175,7 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){
assert(h->ref_list[1][0].f.reference & 3); assert(h->ref_list[1][0].f.reference & 3);
await_reference_mb_row(h, &h->ref_list[1][0], s->mb_y + !!IS_INTERLACED(*mb_type)); await_reference_mb_row(h, &h->ref_list[1][0], h->mb_y + !!IS_INTERLACED(*mb_type));
#define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM) #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM)
...@@ -241,21 +237,21 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){ ...@@ -241,21 +237,21 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){
if (IS_INTERLACED(h->ref_list[1][0].f.mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL if (IS_INTERLACED(h->ref_list[1][0].f.mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL
if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL
mb_y = (s->mb_y&~1) + h->col_parity; mb_y = (h->mb_y&~1) + h->col_parity;
mb_xy= s->mb_x + ((s->mb_y&~1) + h->col_parity)*s->mb_stride; mb_xy= h->mb_x + ((h->mb_y&~1) + h->col_parity)*h->mb_stride;
b8_stride = 0; b8_stride = 0;
}else{ }else{
mb_y += h->col_fieldoff; mb_y += h->col_fieldoff;
mb_xy += s->mb_stride*h->col_fieldoff; // non zero for FL -> FL & differ parity mb_xy += h->mb_stride*h->col_fieldoff; // non zero for FL -> FL & differ parity
} }
goto single_col; goto single_col;
}else{ // AFL/AFR/FR/FL -> AFR/FR }else{ // AFL/AFR/FR/FL -> AFR/FR
if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR
mb_y = s->mb_y&~1; mb_y = h->mb_y&~1;
mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride; mb_xy= h->mb_x + (h->mb_y&~1)*h->mb_stride;
mb_type_col[0] = h->ref_list[1][0].f.mb_type[mb_xy]; mb_type_col[0] = h->ref_list[1][0].f.mb_type[mb_xy];
mb_type_col[1] = h->ref_list[1][0].f.mb_type[mb_xy + s->mb_stride]; mb_type_col[1] = h->ref_list[1][0].f.mb_type[mb_xy + h->mb_stride];
b8_stride = 2+4*s->mb_stride; b8_stride = 2+4*h->mb_stride;
b4_stride *= 6; b4_stride *= 6;
if (IS_INTERLACED(mb_type_col[0]) != IS_INTERLACED(mb_type_col[1])) { if (IS_INTERLACED(mb_type_col[0]) != IS_INTERLACED(mb_type_col[1])) {
mb_type_col[0] &= ~MB_TYPE_INTERLACED; mb_type_col[0] &= ~MB_TYPE_INTERLACED;
...@@ -298,7 +294,7 @@ single_col: ...@@ -298,7 +294,7 @@ single_col:
l1ref0 = &h->ref_list[1][0].f.ref_index [0][4 * mb_xy]; l1ref0 = &h->ref_list[1][0].f.ref_index [0][4 * mb_xy];
l1ref1 = &h->ref_list[1][0].f.ref_index [1][4 * mb_xy]; l1ref1 = &h->ref_list[1][0].f.ref_index [1][4 * mb_xy];
if(!b8_stride){ if(!b8_stride){
if(s->mb_y&1){ if(h->mb_y&1){
l1ref0 += 2; l1ref0 += 2;
l1ref1 += 2; l1ref1 += 2;
l1mv0 += 2*b4_stride; l1mv0 += 2*b4_stride;
...@@ -414,10 +410,9 @@ single_col: ...@@ -414,10 +410,9 @@ single_col:
} }
static void pred_temp_direct_motion(H264Context * const h, int *mb_type){ static void pred_temp_direct_motion(H264Context * const h, int *mb_type){
MpegEncContext * const s = &h->s;
int b8_stride = 2; int b8_stride = 2;
int b4_stride = h->b_stride; int b4_stride = h->b_stride;
int mb_xy = h->mb_xy, mb_y = s->mb_y; int mb_xy = h->mb_xy, mb_y = h->mb_y;
int mb_type_col[2]; int mb_type_col[2];
const int16_t (*l1mv0)[2], (*l1mv1)[2]; const int16_t (*l1mv0)[2], (*l1mv1)[2];
const int8_t *l1ref0, *l1ref1; const int8_t *l1ref0, *l1ref1;
...@@ -427,25 +422,25 @@ static void pred_temp_direct_motion(H264Context * const h, int *mb_type){ ...@@ -427,25 +422,25 @@ static void pred_temp_direct_motion(H264Context * const h, int *mb_type){
assert(h->ref_list[1][0].f.reference & 3); assert(h->ref_list[1][0].f.reference & 3);
await_reference_mb_row(h, &h->ref_list[1][0], s->mb_y + !!IS_INTERLACED(*mb_type)); await_reference_mb_row(h, &h->ref_list[1][0], h->mb_y + !!IS_INTERLACED(*mb_type));
if (IS_INTERLACED(h->ref_list[1][0].f.mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL if (IS_INTERLACED(h->ref_list[1][0].f.mb_type[mb_xy])) { // AFL/AFR/FR/FL -> AFL/FL
if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL if (!IS_INTERLACED(*mb_type)) { // AFR/FR -> AFL/FL
mb_y = (s->mb_y&~1) + h->col_parity; mb_y = (h->mb_y&~1) + h->col_parity;
mb_xy= s->mb_x + ((s->mb_y&~1) + h->col_parity)*s->mb_stride; mb_xy= h->mb_x + ((h->mb_y&~1) + h->col_parity)*h->mb_stride;
b8_stride = 0; b8_stride = 0;
}else{ }else{
mb_y += h->col_fieldoff; mb_y += h->col_fieldoff;
mb_xy += s->mb_stride*h->col_fieldoff; // non zero for FL -> FL & differ parity mb_xy += h->mb_stride*h->col_fieldoff; // non zero for FL -> FL & differ parity
} }
goto single_col; goto single_col;
}else{ // AFL/AFR/FR/FL -> AFR/FR }else{ // AFL/AFR/FR/FL -> AFR/FR
if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR
mb_y = s->mb_y&~1; mb_y = h->mb_y&~1;
mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride; mb_xy= h->mb_x + (h->mb_y&~1)*h->mb_stride;
mb_type_col[0] = h->ref_list[1][0].f.mb_type[mb_xy]; mb_type_col[0] = h->ref_list[1][0].f.mb_type[mb_xy];
mb_type_col[1] = h->ref_list[1][0].f.mb_type[mb_xy + s->mb_stride]; mb_type_col[1] = h->ref_list[1][0].f.mb_type[mb_xy + h->mb_stride];
b8_stride = 2+4*s->mb_stride; b8_stride = 2+4*h->mb_stride;
b4_stride *= 6; b4_stride *= 6;
if (IS_INTERLACED(mb_type_col[0]) != IS_INTERLACED(mb_type_col[1])) { if (IS_INTERLACED(mb_type_col[0]) != IS_INTERLACED(mb_type_col[1])) {
mb_type_col[0] &= ~MB_TYPE_INTERLACED; mb_type_col[0] &= ~MB_TYPE_INTERLACED;
...@@ -489,7 +484,7 @@ single_col: ...@@ -489,7 +484,7 @@ single_col:
l1ref0 = &h->ref_list[1][0].f.ref_index [0][4 * mb_xy]; l1ref0 = &h->ref_list[1][0].f.ref_index [0][4 * mb_xy];
l1ref1 = &h->ref_list[1][0].f.ref_index [1][4 * mb_xy]; l1ref1 = &h->ref_list[1][0].f.ref_index [1][4 * mb_xy];
if(!b8_stride){ if(!b8_stride){
if(s->mb_y&1){ if(h->mb_y&1){
l1ref0 += 2; l1ref0 += 2;
l1ref1 += 2; l1ref1 += 2;
l1mv0 += 2*b4_stride; l1mv0 += 2*b4_stride;
...@@ -503,9 +498,9 @@ single_col: ...@@ -503,9 +498,9 @@ single_col:
int ref_offset; int ref_offset;
if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){ if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){
map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0]; map_col_to_list0[0] = h->map_col_to_list0_field[h->mb_y&1][0];
map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1]; map_col_to_list0[1] = h->map_col_to_list0_field[h->mb_y&1][1];
dist_scale_factor =h->dist_scale_factor_field[s->mb_y&1]; dist_scale_factor =h->dist_scale_factor_field[h->mb_y&1];
} }
ref_offset = (h->ref_list[1][0].mbaff<<4) & (mb_type_col[0]>>3); //if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0])) ref_offset=16 else 0 ref_offset = (h->ref_list[1][0].mbaff<<4) & (mb_type_col[0]>>3); //if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0])) ref_offset=16 else 0
......
...@@ -241,8 +241,7 @@ static av_always_inline void h264_filter_mb_fast_internal(H264Context *h, ...@@ -241,8 +241,7 @@ static av_always_inline void h264_filter_mb_fast_internal(H264Context *h,
unsigned int uvlinesize, unsigned int uvlinesize,
int pixel_shift) int pixel_shift)
{ {
MpegEncContext * const s = &h->s; int chroma = CHROMA && !(CONFIG_GRAY && (h->flags&CODEC_FLAG_GRAY));
int chroma = CHROMA && !(CONFIG_GRAY && (s->flags&CODEC_FLAG_GRAY));
int chroma444 = CHROMA444; int chroma444 = CHROMA444;
int chroma422 = CHROMA422; int chroma422 = CHROMA422;
...@@ -254,10 +253,10 @@ static av_always_inline void h264_filter_mb_fast_internal(H264Context *h, ...@@ -254,10 +253,10 @@ static av_always_inline void h264_filter_mb_fast_internal(H264Context *h,
int a = h->slice_alpha_c0_offset - qp_bd_offset; int a = h->slice_alpha_c0_offset - qp_bd_offset;
int b = h->slice_beta_offset - qp_bd_offset; int b = h->slice_beta_offset - qp_bd_offset;
int mb_type = s->current_picture.f.mb_type[mb_xy]; int mb_type = h->cur_pic.f.mb_type[mb_xy];
int qp = s->current_picture.f.qscale_table[mb_xy]; int qp = h->cur_pic.f.qscale_table[mb_xy];
int qp0 = s->current_picture.f.qscale_table[mb_xy - 1]; int qp0 = h->cur_pic.f.qscale_table[mb_xy - 1];
int qp1 = s->current_picture.f.qscale_table[h->top_mb_xy]; int qp1 = h->cur_pic.f.qscale_table[h->top_mb_xy];
int qpc = get_chroma_qp( h, 0, qp ); int qpc = get_chroma_qp( h, 0, qp );
int qpc0 = get_chroma_qp( h, 0, qp0 ); int qpc0 = get_chroma_qp( h, 0, qp0 );
int qpc1 = get_chroma_qp( h, 0, qp1 ); int qpc1 = get_chroma_qp( h, 0, qp1 );
...@@ -462,7 +461,6 @@ static int check_mv(H264Context *h, long b_idx, long bn_idx, int mvy_limit){ ...@@ -462,7 +461,6 @@ static int check_mv(H264Context *h, long b_idx, long bn_idx, int mvy_limit){
} }
static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize, int mb_xy, int mb_type, int mvy_limit, int first_vertical_edge_done, int a, int b, int chroma, int dir) { static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize, int mb_xy, int mb_type, int mvy_limit, int first_vertical_edge_done, int a, int b, int chroma, int dir) {
MpegEncContext * const s = &h->s;
int edge; int edge;
int chroma_qp_avg[2]; int chroma_qp_avg[2];
int chroma444 = CHROMA444; int chroma444 = CHROMA444;
...@@ -490,16 +488,16 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -490,16 +488,16 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
// //
unsigned int tmp_linesize = 2 * linesize; unsigned int tmp_linesize = 2 * linesize;
unsigned int tmp_uvlinesize = 2 * uvlinesize; unsigned int tmp_uvlinesize = 2 * uvlinesize;
int mbn_xy = mb_xy - 2 * s->mb_stride; int mbn_xy = mb_xy - 2 * h->mb_stride;
int j; int j;
for(j=0; j<2; j++, mbn_xy += s->mb_stride){ for(j=0; j<2; j++, mbn_xy += h->mb_stride){
DECLARE_ALIGNED(8, int16_t, bS)[4]; DECLARE_ALIGNED(8, int16_t, bS)[4];
int qp; int qp;
if (IS_INTRA(mb_type | s->current_picture.f.mb_type[mbn_xy])) { if (IS_INTRA(mb_type | h->cur_pic.f.mb_type[mbn_xy])) {
AV_WN64A(bS, 0x0003000300030003ULL); AV_WN64A(bS, 0x0003000300030003ULL);
} else { } else {
if (!CABAC && IS_8x8DCT(s->current_picture.f.mb_type[mbn_xy])) { if (!CABAC && IS_8x8DCT(h->cur_pic.f.mb_type[mbn_xy])) {
bS[0]= 1+((h->cbp_table[mbn_xy] & 0x4000)||h->non_zero_count_cache[scan8[0]+0]); bS[0]= 1+((h->cbp_table[mbn_xy] & 0x4000)||h->non_zero_count_cache[scan8[0]+0]);
bS[1]= 1+((h->cbp_table[mbn_xy] & 0x4000)||h->non_zero_count_cache[scan8[0]+1]); bS[1]= 1+((h->cbp_table[mbn_xy] & 0x4000)||h->non_zero_count_cache[scan8[0]+1]);
bS[2]= 1+((h->cbp_table[mbn_xy] & 0x8000)||h->non_zero_count_cache[scan8[0]+2]); bS[2]= 1+((h->cbp_table[mbn_xy] & 0x8000)||h->non_zero_count_cache[scan8[0]+2]);
...@@ -514,12 +512,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -514,12 +512,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
} }
// Do not use s->qscale as luma quantizer because it has not the same // Do not use s->qscale as luma quantizer because it has not the same
// value in IPCM macroblocks. // value in IPCM macroblocks.
qp = (s->current_picture.f.qscale_table[mb_xy] + s->current_picture.f.qscale_table[mbn_xy] + 1) >> 1; qp = (h->cur_pic.f.qscale_table[mb_xy] + h->cur_pic.f.qscale_table[mbn_xy] + 1) >> 1;
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize); tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize);
{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } { int i; for (i = 0; i < 4; i++) tprintf(h->avctx, " bS[%d]:%d", i, bS[i]); tprintf(h->avctx, "\n"); }
filter_mb_edgeh( &img_y[j*linesize], tmp_linesize, bS, qp, a, b, h, 0 ); filter_mb_edgeh( &img_y[j*linesize], tmp_linesize, bS, qp, a, b, h, 0 );
chroma_qp_avg[0] = (h->chroma_qp[0] + get_chroma_qp(h, 0, s->current_picture.f.qscale_table[mbn_xy]) + 1) >> 1; chroma_qp_avg[0] = (h->chroma_qp[0] + get_chroma_qp(h, 0, h->cur_pic.f.qscale_table[mbn_xy]) + 1) >> 1;
chroma_qp_avg[1] = (h->chroma_qp[1] + get_chroma_qp(h, 1, s->current_picture.f.qscale_table[mbn_xy]) + 1) >> 1; chroma_qp_avg[1] = (h->chroma_qp[1] + get_chroma_qp(h, 1, h->cur_pic.f.qscale_table[mbn_xy]) + 1) >> 1;
if (chroma) { if (chroma) {
if (chroma444) { if (chroma444) {
filter_mb_edgeh (&img_cb[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[0], a, b, h, 0); filter_mb_edgeh (&img_cb[j*uvlinesize], tmp_uvlinesize, bS, chroma_qp_avg[0], a, b, h, 0);
...@@ -537,7 +535,7 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -537,7 +535,7 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
if( IS_INTRA(mb_type|mbm_type)) { if( IS_INTRA(mb_type|mbm_type)) {
AV_WN64A(bS, 0x0003000300030003ULL); AV_WN64A(bS, 0x0003000300030003ULL);
if ( (!IS_INTERLACED(mb_type|mbm_type)) if ( (!IS_INTERLACED(mb_type|mbm_type))
|| ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0)) || ((FRAME_MBAFF || (h->picture_structure != PICT_FRAME)) && (dir == 0))
) )
AV_WN64A(bS, 0x0004000400040004ULL); AV_WN64A(bS, 0x0004000400040004ULL);
} else { } else {
...@@ -579,12 +577,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -579,12 +577,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
// Do not use s->qscale as luma quantizer because it has not the same // Do not use s->qscale as luma quantizer because it has not the same
// value in IPCM macroblocks. // value in IPCM macroblocks.
if(bS[0]+bS[1]+bS[2]+bS[3]){ if(bS[0]+bS[1]+bS[2]+bS[3]){
qp = (s->current_picture.f.qscale_table[mb_xy] + s->current_picture.f.qscale_table[mbm_xy] + 1) >> 1; qp = (h->cur_pic.f.qscale_table[mb_xy] + h->cur_pic.f.qscale_table[mbm_xy] + 1) >> 1;
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], s->current_picture.qscale_table[mbn_xy]); //tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], h->cur_pic.qscale_table[mbn_xy]);
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
//{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } //{ int i; for (i = 0; i < 4; i++) tprintf(h->avctx, " bS[%d]:%d", i, bS[i]); tprintf(h->avctx, "\n"); }
chroma_qp_avg[0] = (h->chroma_qp[0] + get_chroma_qp(h, 0, s->current_picture.f.qscale_table[mbm_xy]) + 1) >> 1; chroma_qp_avg[0] = (h->chroma_qp[0] + get_chroma_qp(h, 0, h->cur_pic.f.qscale_table[mbm_xy]) + 1) >> 1;
chroma_qp_avg[1] = (h->chroma_qp[1] + get_chroma_qp(h, 1, s->current_picture.f.qscale_table[mbm_xy]) + 1) >> 1; chroma_qp_avg[1] = (h->chroma_qp[1] + get_chroma_qp(h, 1, h->cur_pic.f.qscale_table[mbm_xy]) + 1) >> 1;
if( dir == 0 ) { if( dir == 0 ) {
filter_mb_edgev( &img_y[0], linesize, bS, qp, a, b, h, 1 ); filter_mb_edgev( &img_y[0], linesize, bS, qp, a, b, h, 1 );
if (chroma) { if (chroma) {
...@@ -664,10 +662,10 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -664,10 +662,10 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
/* Filter edge */ /* Filter edge */
// Do not use s->qscale as luma quantizer because it has not the same // Do not use s->qscale as luma quantizer because it has not the same
// value in IPCM macroblocks. // value in IPCM macroblocks.
qp = s->current_picture.f.qscale_table[mb_xy]; qp = h->cur_pic.f.qscale_table[mb_xy];
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], s->current_picture.qscale_table[mbn_xy]); //tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp[0], h->cur_pic.qscale_table[mbn_xy]);
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize); tprintf(h->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
//{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } //{ int i; for (i = 0; i < 4; i++) tprintf(h->avctx, " bS[%d]:%d", i, bS[i]); tprintf(h->avctx, "\n"); }
if( dir == 0 ) { if( dir == 0 ) {
filter_mb_edgev( &img_y[4*edge << h->pixel_shift], linesize, bS, qp, a, b, h, 0 ); filter_mb_edgev( &img_y[4*edge << h->pixel_shift], linesize, bS, qp, a, b, h, 0 );
if (chroma) { if (chroma) {
...@@ -704,13 +702,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u ...@@ -704,13 +702,12 @@ static av_always_inline void filter_mb_dir(H264Context *h, int mb_x, int mb_y, u
} }
void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) {
MpegEncContext * const s = &h->s; const int mb_xy= mb_x + mb_y*h->mb_stride;
const int mb_xy= mb_x + mb_y*s->mb_stride; const int mb_type = h->cur_pic.f.mb_type[mb_xy];
const int mb_type = s->current_picture.f.mb_type[mb_xy];
const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4; const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4;
int first_vertical_edge_done = 0; int first_vertical_edge_done = 0;
av_unused int dir; av_unused int dir;
int chroma = CHROMA && !(CONFIG_GRAY && (s->flags&CODEC_FLAG_GRAY)); int chroma = CHROMA && !(CONFIG_GRAY && (h->flags&CODEC_FLAG_GRAY));
int qp_bd_offset = 6 * (h->sps.bit_depth_luma - 8); int qp_bd_offset = 6 * (h->sps.bit_depth_luma - 8);
int a = h->slice_alpha_c0_offset - qp_bd_offset; int a = h->slice_alpha_c0_offset - qp_bd_offset;
int b = h->slice_beta_offset - qp_bd_offset; int b = h->slice_beta_offset - qp_bd_offset;
...@@ -762,9 +759,9 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint ...@@ -762,9 +759,9 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint
} }
} }
mb_qp = s->current_picture.f.qscale_table[mb_xy]; mb_qp = h->cur_pic.f.qscale_table[mb_xy];
mbn0_qp = s->current_picture.f.qscale_table[h->left_mb_xy[0]]; mbn0_qp = h->cur_pic.f.qscale_table[h->left_mb_xy[0]];
mbn1_qp = s->current_picture.f.qscale_table[h->left_mb_xy[1]]; mbn1_qp = h->cur_pic.f.qscale_table[h->left_mb_xy[1]];
qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1; qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1;
bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) + bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) +
get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1; get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1;
...@@ -777,8 +774,8 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint ...@@ -777,8 +774,8 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint
get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1; get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1;
/* Filter edge */ /* Filter edge */
tprintf(s->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize); tprintf(h->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize);
{ int i; for (i = 0; i < 8; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); } { int i; for (i = 0; i < 8; i++) tprintf(h->avctx, " bS[%d]:%d", i, bS[i]); tprintf(h->avctx, "\n"); }
if(MB_FIELD){ if(MB_FIELD){
filter_mb_mbaff_edgev ( h, img_y , linesize, bS , 1, qp [0], a, b, 1 ); filter_mb_mbaff_edgev ( h, img_y , linesize, bS , 1, qp [0], a, b, 1 );
filter_mb_mbaff_edgev ( h, img_y + 8* linesize, linesize, bS+4, 1, qp [1], a, b, 1 ); filter_mb_mbaff_edgev ( h, img_y + 8* linesize, linesize, bS+4, 1, qp [1], a, b, 1 );
......
...@@ -40,39 +40,38 @@ ...@@ -40,39 +40,38 @@
static av_noinline void FUNC(hl_decode_mb)(H264Context *h) static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
{ {
MpegEncContext *const s = &h->s; const int mb_x = h->mb_x;
const int mb_x = s->mb_x; const int mb_y = h->mb_y;
const int mb_y = s->mb_y;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
const int mb_type = s->current_picture.f.mb_type[mb_xy]; const int mb_type = h->cur_pic.f.mb_type[mb_xy];
uint8_t *dest_y, *dest_cb, *dest_cr; uint8_t *dest_y, *dest_cb, *dest_cr;
int linesize, uvlinesize /*dct_offset*/; int linesize, uvlinesize /*dct_offset*/;
int i, j; int i, j;
int *block_offset = &h->block_offset[0]; int *block_offset = &h->block_offset[0];
const int transform_bypass = !SIMPLE && (s->qscale == 0 && h->sps.transform_bypass); const int transform_bypass = !SIMPLE && (h->qscale == 0 && h->sps.transform_bypass);
/* is_h264 should always be true if SVQ3 is disabled. */ /* is_h264 should always be true if SVQ3 is disabled. */
const int is_h264 = !CONFIG_SVQ3_DECODER || SIMPLE || s->codec_id == AV_CODEC_ID_H264; const int is_h264 = !CONFIG_SVQ3_DECODER || SIMPLE || h->avctx->codec_id == AV_CODEC_ID_H264;
void (*idct_add)(uint8_t *dst, int16_t *block, int stride); void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
const int block_h = 16 >> s->chroma_y_shift; const int block_h = 16 >> h->chroma_y_shift;
const int chroma422 = CHROMA422; const int chroma422 = CHROMA422;
dest_y = s->current_picture.f.data[0] + ((mb_x << PIXEL_SHIFT) + mb_y * s->linesize) * 16; dest_y = h->cur_pic.f.data[0] + ((mb_x << PIXEL_SHIFT) + mb_y * h->linesize) * 16;
dest_cb = s->current_picture.f.data[1] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * s->uvlinesize * block_h; dest_cb = h->cur_pic.f.data[1] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * h->uvlinesize * block_h;
dest_cr = s->current_picture.f.data[2] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * s->uvlinesize * block_h; dest_cr = h->cur_pic.f.data[2] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * h->uvlinesize * block_h;
s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * s->linesize + (64 << PIXEL_SHIFT), s->linesize, 4); h->vdsp.prefetch(dest_y + (h->mb_x & 3) * 4 * h->linesize + (64 << PIXEL_SHIFT), h->linesize, 4);
s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * s->uvlinesize + (64 << PIXEL_SHIFT), dest_cr - dest_cb, 2); h->vdsp.prefetch(dest_cb + (h->mb_x & 7) * h->uvlinesize + (64 << PIXEL_SHIFT), dest_cr - dest_cb, 2);
h->list_counts[mb_xy] = h->list_count; h->list_counts[mb_xy] = h->list_count;
if (!SIMPLE && MB_FIELD) { if (!SIMPLE && MB_FIELD) {
linesize = h->mb_linesize = s->linesize * 2; linesize = h->mb_linesize = h->linesize * 2;
uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2; uvlinesize = h->mb_uvlinesize = h->uvlinesize * 2;
block_offset = &h->block_offset[48]; block_offset = &h->block_offset[48];
if (mb_y & 1) { // FIXME move out of this function? if (mb_y & 1) { // FIXME move out of this function?
dest_y -= s->linesize * 15; dest_y -= h->linesize * 15;
dest_cb -= s->uvlinesize * (block_h - 1); dest_cb -= h->uvlinesize * (block_h - 1);
dest_cr -= s->uvlinesize * (block_h - 1); dest_cr -= h->uvlinesize * (block_h - 1);
} }
if (FRAME_MBAFF) { if (FRAME_MBAFF) {
int list; int list;
...@@ -81,20 +80,20 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -81,20 +80,20 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
continue; continue;
if (IS_16X16(mb_type)) { if (IS_16X16(mb_type)) {
int8_t *ref = &h->ref_cache[list][scan8[0]]; int8_t *ref = &h->ref_cache[list][scan8[0]];
fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (s->mb_y & 1), 1); fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (h->mb_y & 1), 1);
} else { } else {
for (i = 0; i < 16; i += 4) { for (i = 0; i < 16; i += 4) {
int ref = h->ref_cache[list][scan8[i]]; int ref = h->ref_cache[list][scan8[i]];
if (ref >= 0) if (ref >= 0)
fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2,
8, (16 + ref) ^ (s->mb_y & 1), 1); 8, (16 + ref) ^ (h->mb_y & 1), 1);
} }
} }
} }
} }
} else { } else {
linesize = h->mb_linesize = s->linesize; linesize = h->mb_linesize = h->linesize;
uvlinesize = h->mb_uvlinesize = s->uvlinesize; uvlinesize = h->mb_uvlinesize = h->uvlinesize;
// dct_offset = s->linesize * 16; // dct_offset = s->linesize * 16;
} }
...@@ -111,7 +110,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -111,7 +110,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
for (j = 0; j < 16; j++) for (j = 0; j < 16; j++)
tmp_y[j] = get_bits(&gb, bit_depth); tmp_y[j] = get_bits(&gb, bit_depth);
} }
if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
if (!h->sps.chroma_format_idc) { if (!h->sps.chroma_format_idc) {
for (i = 0; i < block_h; i++) { for (i = 0; i < block_h; i++) {
uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize); uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize);
...@@ -136,7 +135,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -136,7 +135,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
} else { } else {
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
memcpy(dest_y + i * linesize, (uint8_t *)h->mb + i * 16, 16); memcpy(dest_y + i * linesize, (uint8_t *)h->mb + i * 16, 16);
if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
if (!h->sps.chroma_format_idc) { if (!h->sps.chroma_format_idc) {
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
memset(dest_cb + i*uvlinesize, 1 << (bit_depth - 1), 8); memset(dest_cb + i*uvlinesize, 1 << (bit_depth - 1), 8);
...@@ -158,7 +157,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -158,7 +157,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize,
uvlinesize, 1, 0, SIMPLE, PIXEL_SHIFT); uvlinesize, 1, 0, SIMPLE, PIXEL_SHIFT);
if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) {
h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize); h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize);
h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize); h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize);
} }
...@@ -173,14 +172,14 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -173,14 +172,14 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
} else if (is_h264) { } else if (is_h264) {
if (chroma422) { if (chroma422) {
FUNC(hl_motion_422)(h, dest_y, dest_cb, dest_cr, FUNC(hl_motion_422)(h, dest_y, dest_cb, dest_cr,
s->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab, h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
s->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab, h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
h->h264dsp.weight_h264_pixels_tab, h->h264dsp.weight_h264_pixels_tab,
h->h264dsp.biweight_h264_pixels_tab); h->h264dsp.biweight_h264_pixels_tab);
} else { } else {
FUNC(hl_motion_420)(h, dest_y, dest_cb, dest_cr, FUNC(hl_motion_420)(h, dest_y, dest_cb, dest_cr,
s->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab, h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
s->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab, h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
h->h264dsp.weight_h264_pixels_tab, h->h264dsp.weight_h264_pixels_tab,
h->h264dsp.biweight_h264_pixels_tab); h->h264dsp.biweight_h264_pixels_tab);
} }
...@@ -189,7 +188,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -189,7 +188,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
hl_decode_mb_idct_luma(h, mb_type, is_h264, SIMPLE, transform_bypass, hl_decode_mb_idct_luma(h, mb_type, is_h264, SIMPLE, transform_bypass,
PIXEL_SHIFT, block_offset, linesize, dest_y, 0); PIXEL_SHIFT, block_offset, linesize, dest_y, 0);
if ((SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) && if ((SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) &&
(h->cbp & 0x30)) { (h->cbp & 0x30)) {
uint8_t *dest[2] = { dest_cb, dest_cr }; uint8_t *dest[2] = { dest_cb, dest_cr };
if (transform_bypass) { if (transform_bypass) {
...@@ -253,7 +252,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -253,7 +252,7 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
uint8_t *const ptr = dest[j - 1] + block_offset[i]; uint8_t *const ptr = dest[j - 1] + block_offset[i];
ff_svq3_add_idct_c(ptr, h->mb + i * 16, ff_svq3_add_idct_c(ptr, h->mb + i * 16,
uvlinesize, uvlinesize,
ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2); ff_h264_chroma_qp[0][h->qscale + 12] - 12, 2);
} }
} }
} }
...@@ -261,8 +260,8 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -261,8 +260,8 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
} }
} }
if (h->cbp || IS_INTRA(mb_type)) { if (h->cbp || IS_INTRA(mb_type)) {
s->dsp.clear_blocks(h->mb); h->dsp.clear_blocks(h->mb);
s->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT)); h->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT));
} }
} }
...@@ -274,33 +273,32 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h) ...@@ -274,33 +273,32 @@ static av_noinline void FUNC(hl_decode_mb)(H264Context *h)
static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h) static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h)
{ {
MpegEncContext *const s = &h->s; const int mb_x = h->mb_x;
const int mb_x = s->mb_x; const int mb_y = h->mb_y;
const int mb_y = s->mb_y;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
const int mb_type = s->current_picture.f.mb_type[mb_xy]; const int mb_type = h->cur_pic.f.mb_type[mb_xy];
uint8_t *dest[3]; uint8_t *dest[3];
int linesize; int linesize;
int i, j, p; int i, j, p;
int *block_offset = &h->block_offset[0]; int *block_offset = &h->block_offset[0];
const int transform_bypass = !SIMPLE && (s->qscale == 0 && h->sps.transform_bypass); const int transform_bypass = !SIMPLE && (h->qscale == 0 && h->sps.transform_bypass);
const int plane_count = (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) ? 3 : 1; const int plane_count = (SIMPLE || !CONFIG_GRAY || !(h->flags & CODEC_FLAG_GRAY)) ? 3 : 1;
for (p = 0; p < plane_count; p++) { for (p = 0; p < plane_count; p++) {
dest[p] = s->current_picture.f.data[p] + dest[p] = h->cur_pic.f.data[p] +
((mb_x << PIXEL_SHIFT) + mb_y * s->linesize) * 16; ((mb_x << PIXEL_SHIFT) + mb_y * h->linesize) * 16;
s->vdsp.prefetch(dest[p] + (s->mb_x & 3) * 4 * s->linesize + (64 << PIXEL_SHIFT), h->vdsp.prefetch(dest[p] + (h->mb_x & 3) * 4 * h->linesize + (64 << PIXEL_SHIFT),
s->linesize, 4); h->linesize, 4);
} }
h->list_counts[mb_xy] = h->list_count; h->list_counts[mb_xy] = h->list_count;
if (!SIMPLE && MB_FIELD) { if (!SIMPLE && MB_FIELD) {
linesize = h->mb_linesize = h->mb_uvlinesize = s->linesize * 2; linesize = h->mb_linesize = h->mb_uvlinesize = h->linesize * 2;
block_offset = &h->block_offset[48]; block_offset = &h->block_offset[48];
if (mb_y & 1) // FIXME move out of this function? if (mb_y & 1) // FIXME move out of this function?
for (p = 0; p < 3; p++) for (p = 0; p < 3; p++)
dest[p] -= s->linesize * 15; dest[p] -= h->linesize * 15;
if (FRAME_MBAFF) { if (FRAME_MBAFF) {
int list; int list;
for (list = 0; list < h->list_count; list++) { for (list = 0; list < h->list_count; list++) {
...@@ -308,19 +306,19 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h) ...@@ -308,19 +306,19 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h)
continue; continue;
if (IS_16X16(mb_type)) { if (IS_16X16(mb_type)) {
int8_t *ref = &h->ref_cache[list][scan8[0]]; int8_t *ref = &h->ref_cache[list][scan8[0]];
fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (s->mb_y & 1), 1); fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (h->mb_y & 1), 1);
} else { } else {
for (i = 0; i < 16; i += 4) { for (i = 0; i < 16; i += 4) {
int ref = h->ref_cache[list][scan8[i]]; int ref = h->ref_cache[list][scan8[i]];
if (ref >= 0) if (ref >= 0)
fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2,
8, (16 + ref) ^ (s->mb_y & 1), 1); 8, (16 + ref) ^ (h->mb_y & 1), 1);
} }
} }
} }
} }
} else { } else {
linesize = h->mb_linesize = h->mb_uvlinesize = s->linesize; linesize = h->mb_linesize = h->mb_uvlinesize = h->linesize;
} }
if (!SIMPLE && IS_INTRA_PCM(mb_type)) { if (!SIMPLE && IS_INTRA_PCM(mb_type)) {
...@@ -357,8 +355,8 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h) ...@@ -357,8 +355,8 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h)
linesize, 0, 1, SIMPLE, PIXEL_SHIFT); linesize, 0, 1, SIMPLE, PIXEL_SHIFT);
} else { } else {
FUNC(hl_motion_444)(h, dest[0], dest[1], dest[2], FUNC(hl_motion_444)(h, dest[0], dest[1], dest[2],
s->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab, h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
s->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab, h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
h->h264dsp.weight_h264_pixels_tab, h->h264dsp.weight_h264_pixels_tab,
h->h264dsp.biweight_h264_pixels_tab); h->h264dsp.biweight_h264_pixels_tab);
} }
...@@ -369,8 +367,8 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h) ...@@ -369,8 +367,8 @@ static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h)
dest[p], p); dest[p], p);
} }
if (h->cbp || IS_INTRA(mb_type)) { if (h->cbp || IS_INTRA(mb_type)) {
s->dsp.clear_blocks(h->mb); h->dsp.clear_blocks(h->mb);
s->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT)); h->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT));
} }
} }
......
...@@ -46,7 +46,7 @@ static void mc_part(H264Context *h, int n, int square, ...@@ -46,7 +46,7 @@ static void mc_part(H264Context *h, int n, int square,
int list0, int list1) int list0, int list1)
{ {
if ((h->use_weight == 2 && list0 && list1 && if ((h->use_weight == 2 && list0 && list1 &&
(h->implicit_weight[h->ref_cache[0][scan8[n]]][h->ref_cache[1][scan8[n]]][h->s.mb_y & 1] != 32)) || (h->implicit_weight[h->ref_cache[0][scan8[n]]][h->ref_cache[1][scan8[n]]][h->mb_y & 1] != 32)) ||
h->use_weight == 1) h->use_weight == 1)
mc_part_weighted(h, n, square, height, delta, dest_y, dest_cb, dest_cr, mc_part_weighted(h, n, square, height, delta, dest_y, dest_cb, dest_cr,
x_offset, y_offset, qpix_put, chroma_put, x_offset, y_offset, qpix_put, chroma_put,
...@@ -67,13 +67,12 @@ static void MCFUNC(hl_motion)(H264Context *h, uint8_t *dest_y, ...@@ -67,13 +67,12 @@ static void MCFUNC(hl_motion)(H264Context *h, uint8_t *dest_y,
h264_weight_func *weight_op, h264_weight_func *weight_op,
h264_biweight_func *weight_avg) h264_biweight_func *weight_avg)
{ {
MpegEncContext *const s = &h->s;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
const int mb_type = s->current_picture.f.mb_type[mb_xy]; const int mb_type = h->cur_pic.f.mb_type[mb_xy];
av_assert2(IS_INTER(mb_type)); av_assert2(IS_INTER(mb_type));
if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME)) if (HAVE_THREADS && (h->avctx->active_thread_type & FF_THREAD_FRAME))
await_references(h); await_references(h);
prefetch_motion(h, 0, PIXEL_SHIFT, CHROMA_IDC); prefetch_motion(h, 0, PIXEL_SHIFT, CHROMA_IDC);
......
...@@ -38,32 +38,31 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, ...@@ -38,32 +38,31 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C,
int i, int list, int part_width) int i, int list, int part_width)
{ {
const int topright_ref = h->ref_cache[list][i - 8 + part_width]; const int topright_ref = h->ref_cache[list][i - 8 + part_width];
MpegEncContext *s = &h->s;
/* there is no consistent mapping of mvs to neighboring locations that will /* there is no consistent mapping of mvs to neighboring locations that will
* make mbaff happy, so we can't move all this logic to fill_caches */ * make mbaff happy, so we can't move all this logic to fill_caches */
if (FRAME_MBAFF) { if (FRAME_MBAFF) {
#define SET_DIAG_MV(MV_OP, REF_OP, XY, Y4) \ #define SET_DIAG_MV(MV_OP, REF_OP, XY, Y4) \
const int xy = XY, y4 = Y4; \ const int xy = XY, y4 = Y4; \
const int mb_type = mb_types[xy + (y4 >> 2) * s->mb_stride]; \ const int mb_type = mb_types[xy + (y4 >> 2) * h->mb_stride]; \
if (!USES_LIST(mb_type, list)) \ if (!USES_LIST(mb_type, list)) \
return LIST_NOT_USED; \ return LIST_NOT_USED; \
mv = s->current_picture_ptr->f.motion_val[list][h->mb2b_xy[xy] + 3 + y4 * h->b_stride]; \ mv = h->cur_pic_ptr->f.motion_val[list][h->mb2b_xy[xy] + 3 + y4 * h->b_stride]; \
h->mv_cache[list][scan8[0] - 2][0] = mv[0]; \ h->mv_cache[list][scan8[0] - 2][0] = mv[0]; \
h->mv_cache[list][scan8[0] - 2][1] = mv[1] MV_OP; \ h->mv_cache[list][scan8[0] - 2][1] = mv[1] MV_OP; \
return s->current_picture_ptr->f.ref_index[list][4 * xy + 1 + (y4 & ~1)] REF_OP; return h->cur_pic_ptr->f.ref_index[list][4 * xy + 1 + (y4 & ~1)] REF_OP;
if (topright_ref == PART_NOT_AVAILABLE if (topright_ref == PART_NOT_AVAILABLE
&& i >= scan8[0] + 8 && (i & 7) == 4 && i >= scan8[0] + 8 && (i & 7) == 4
&& h->ref_cache[list][scan8[0] - 1] != PART_NOT_AVAILABLE) { && h->ref_cache[list][scan8[0] - 1] != PART_NOT_AVAILABLE) {
const uint32_t *mb_types = s->current_picture_ptr->f.mb_type; const uint32_t *mb_types = h->cur_pic_ptr->f.mb_type;
const int16_t *mv; const int16_t *mv;
AV_ZERO32(h->mv_cache[list][scan8[0] - 2]); AV_ZERO32(h->mv_cache[list][scan8[0] - 2]);
*C = h->mv_cache[list][scan8[0] - 2]; *C = h->mv_cache[list][scan8[0] - 2];
if (!MB_FIELD && IS_INTERLACED(h->left_type[0])) { if (!MB_FIELD && IS_INTERLACED(h->left_type[0])) {
SET_DIAG_MV(* 2, >> 1, h->left_mb_xy[0] + s->mb_stride, SET_DIAG_MV(* 2, >> 1, h->left_mb_xy[0] + h->mb_stride,
(s->mb_y & 1) * 2 + (i >> 5)); (h->mb_y & 1) * 2 + (i >> 5));
} }
if (MB_FIELD && !IS_INTERLACED(h->left_type[0])) { if (MB_FIELD && !IS_INTERLACED(h->left_type[0])) {
// left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK. // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK.
...@@ -77,7 +76,7 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, ...@@ -77,7 +76,7 @@ static av_always_inline int fetch_diagonal_mv(H264Context *h, const int16_t **C,
*C = h->mv_cache[list][i - 8 + part_width]; *C = h->mv_cache[list][i - 8 + part_width];
return topright_ref; return topright_ref;
} else { } else {
tprintf(s->avctx, "topright MV not available\n"); tprintf(h->avctx, "topright MV not available\n");
*C = h->mv_cache[list][i - 8 - 1]; *C = h->mv_cache[list][i - 8 - 1];
return h->ref_cache[list][i - 8 - 1]; return h->ref_cache[list][i - 8 - 1];
...@@ -115,7 +114,7 @@ static av_always_inline void pred_motion(H264Context *const h, int n, ...@@ -115,7 +114,7 @@ static av_always_inline void pred_motion(H264Context *const h, int n,
diagonal_ref = fetch_diagonal_mv(h, &C, index8, list, part_width); diagonal_ref = fetch_diagonal_mv(h, &C, index8, list, part_width);
match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref); match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count); tprintf(h->avctx, "pred_motion match_count=%d\n", match_count);
if (match_count > 1) { //most common if (match_count > 1) { //most common
*mx = mid_pred(A[0], B[0], C[0]); *mx = mid_pred(A[0], B[0], C[0]);
*my = mid_pred(A[1], B[1], C[1]); *my = mid_pred(A[1], B[1], C[1]);
...@@ -142,10 +141,10 @@ static av_always_inline void pred_motion(H264Context *const h, int n, ...@@ -142,10 +141,10 @@ static av_always_inline void pred_motion(H264Context *const h, int n,
} }
} }
tprintf(h->s.avctx, tprintf(h->avctx,
"pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", "pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n",
top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref,
A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list); A[0], A[1], ref, *mx, *my, h->mb_x, h->mb_y, n, list);
} }
/** /**
...@@ -162,8 +161,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h, ...@@ -162,8 +161,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h,
const int top_ref = h->ref_cache[list][scan8[0] - 8]; const int top_ref = h->ref_cache[list][scan8[0] - 8];
const int16_t *const B = h->mv_cache[list][scan8[0] - 8]; const int16_t *const B = h->mv_cache[list][scan8[0] - 8];
tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", tprintf(h->avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n",
top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list); top_ref, B[0], B[1], h->mb_x, h->mb_y, n, list);
if (top_ref == ref) { if (top_ref == ref) {
*mx = B[0]; *mx = B[0];
...@@ -174,8 +173,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h, ...@@ -174,8 +173,8 @@ static av_always_inline void pred_16x8_motion(H264Context *const h,
const int left_ref = h->ref_cache[list][scan8[8] - 1]; const int left_ref = h->ref_cache[list][scan8[8] - 1];
const int16_t *const A = h->mv_cache[list][scan8[8] - 1]; const int16_t *const A = h->mv_cache[list][scan8[8] - 1];
tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", tprintf(h->avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n",
left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); left_ref, A[0], A[1], h->mb_x, h->mb_y, n, list);
if (left_ref == ref) { if (left_ref == ref) {
*mx = A[0]; *mx = A[0];
...@@ -202,8 +201,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h, ...@@ -202,8 +201,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h,
const int left_ref = h->ref_cache[list][scan8[0] - 1]; const int left_ref = h->ref_cache[list][scan8[0] - 1];
const int16_t *const A = h->mv_cache[list][scan8[0] - 1]; const int16_t *const A = h->mv_cache[list][scan8[0] - 1];
tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", tprintf(h->avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n",
left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list); left_ref, A[0], A[1], h->mb_x, h->mb_y, n, list);
if (left_ref == ref) { if (left_ref == ref) {
*mx = A[0]; *mx = A[0];
...@@ -216,8 +215,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h, ...@@ -216,8 +215,8 @@ static av_always_inline void pred_8x16_motion(H264Context *const h,
diagonal_ref = fetch_diagonal_mv(h, &C, scan8[4], list, 2); diagonal_ref = fetch_diagonal_mv(h, &C, scan8[4], list, 2);
tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", tprintf(h->avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n",
diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list); diagonal_ref, C[0], C[1], h->mb_x, h->mb_y, n, list);
if (diagonal_ref == ref) { if (diagonal_ref == ref) {
*mx = C[0]; *mx = C[0];
...@@ -253,9 +252,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) ...@@ -253,9 +252,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h)
{ {
DECLARE_ALIGNED(4, static const int16_t, zeromv)[2] = { 0 }; DECLARE_ALIGNED(4, static const int16_t, zeromv)[2] = { 0 };
DECLARE_ALIGNED(4, int16_t, mvbuf)[3][2]; DECLARE_ALIGNED(4, int16_t, mvbuf)[3][2];
MpegEncContext *const s = &h->s; int8_t *ref = h->cur_pic.f.ref_index[0];
int8_t *ref = s->current_picture.f.ref_index[0]; int16_t(*mv)[2] = h->cur_pic.f.motion_val[0];
int16_t(*mv)[2] = s->current_picture.f.motion_val[0];
int top_ref, left_ref, diagonal_ref, match_count, mx, my; int top_ref, left_ref, diagonal_ref, match_count, mx, my;
const int16_t *A, *B, *C; const int16_t *A, *B, *C;
int b_stride = h->b_stride; int b_stride = h->b_stride;
...@@ -293,8 +291,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) ...@@ -293,8 +291,8 @@ static av_always_inline void pred_pskip_motion(H264Context *const h)
goto zeromv; goto zeromv;
} }
tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", tprintf(h->avctx, "pred_pskip: (%d) (%d) at %2d %2d\n",
top_ref, left_ref, h->s.mb_x, h->s.mb_y); top_ref, left_ref, h->mb_x, h->mb_y);
if (USES_LIST(h->topright_type, 0)) { if (USES_LIST(h->topright_type, 0)) {
diagonal_ref = ref[4 * h->topright_mb_xy + 2]; diagonal_ref = ref[4 * h->topright_mb_xy + 2];
...@@ -320,7 +318,7 @@ static av_always_inline void pred_pskip_motion(H264Context *const h) ...@@ -320,7 +318,7 @@ static av_always_inline void pred_pskip_motion(H264Context *const h)
} }
match_count = !diagonal_ref + !top_ref + !left_ref; match_count = !diagonal_ref + !top_ref + !left_ref;
tprintf(h->s.avctx, "pred_pskip_motion match_count=%d\n", match_count); tprintf(h->avctx, "pred_pskip_motion match_count=%d\n", match_count);
if (match_count > 1) { if (match_count > 1) {
mx = mid_pred(A[0], B[0], C[0]); mx = mid_pred(A[0], B[0], C[0]);
my = mid_pred(A[1], B[1], C[1]); my = mid_pred(A[1], B[1], C[1]);
...@@ -350,7 +348,6 @@ zeromv: ...@@ -350,7 +348,6 @@ zeromv:
static void fill_decode_neighbors(H264Context *h, int mb_type) static void fill_decode_neighbors(H264Context *h, int mb_type)
{ {
MpegEncContext *const s = &h->s;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS]; int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
static const uint8_t left_block_options[4][32] = { static const uint8_t left_block_options[4][32] = {
...@@ -362,7 +359,7 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) ...@@ -362,7 +359,7 @@ static void fill_decode_neighbors(H264Context *h, int mb_type)
h->topleft_partition = -1; h->topleft_partition = -1;
top_xy = mb_xy - (s->mb_stride << MB_FIELD); top_xy = mb_xy - (h->mb_stride << MB_FIELD);
/* Wow, what a mess, why didn't they simplify the interlacing & intra /* Wow, what a mess, why didn't they simplify the interlacing & intra
* stuff, I can't imagine that these complex rules are worth it. */ * stuff, I can't imagine that these complex rules are worth it. */
...@@ -372,16 +369,16 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) ...@@ -372,16 +369,16 @@ static void fill_decode_neighbors(H264Context *h, int mb_type)
left_xy[LBOT] = left_xy[LTOP] = mb_xy - 1; left_xy[LBOT] = left_xy[LTOP] = mb_xy - 1;
h->left_block = left_block_options[0]; h->left_block = left_block_options[0];
if (FRAME_MBAFF) { if (FRAME_MBAFF) {
const int left_mb_field_flag = IS_INTERLACED(s->current_picture.f.mb_type[mb_xy - 1]); const int left_mb_field_flag = IS_INTERLACED(h->cur_pic.f.mb_type[mb_xy - 1]);
const int curr_mb_field_flag = IS_INTERLACED(mb_type); const int curr_mb_field_flag = IS_INTERLACED(mb_type);
if (s->mb_y & 1) { if (h->mb_y & 1) {
if (left_mb_field_flag != curr_mb_field_flag) { if (left_mb_field_flag != curr_mb_field_flag) {
left_xy[LBOT] = left_xy[LTOP] = mb_xy - s->mb_stride - 1; left_xy[LBOT] = left_xy[LTOP] = mb_xy - h->mb_stride - 1;
if (curr_mb_field_flag) { if (curr_mb_field_flag) {
left_xy[LBOT] += s->mb_stride; left_xy[LBOT] += h->mb_stride;
h->left_block = left_block_options[3]; h->left_block = left_block_options[3];
} else { } else {
topleft_xy += s->mb_stride; topleft_xy += h->mb_stride;
/* take top left mv from the middle of the mb, as opposed /* take top left mv from the middle of the mb, as opposed
* to all other modes which use the bottom right partition */ * to all other modes which use the bottom right partition */
h->topleft_partition = 0; h->topleft_partition = 0;
...@@ -390,13 +387,13 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) ...@@ -390,13 +387,13 @@ static void fill_decode_neighbors(H264Context *h, int mb_type)
} }
} else { } else {
if (curr_mb_field_flag) { if (curr_mb_field_flag) {
topleft_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy - 1] >> 7) & 1) - 1); topleft_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy - 1] >> 7) & 1) - 1);
topright_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy + 1] >> 7) & 1) - 1); topright_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy + 1] >> 7) & 1) - 1);
top_xy += s->mb_stride & (((s->current_picture.f.mb_type[top_xy] >> 7) & 1) - 1); top_xy += h->mb_stride & (((h->cur_pic.f.mb_type[top_xy] >> 7) & 1) - 1);
} }
if (left_mb_field_flag != curr_mb_field_flag) { if (left_mb_field_flag != curr_mb_field_flag) {
if (curr_mb_field_flag) { if (curr_mb_field_flag) {
left_xy[LBOT] += s->mb_stride; left_xy[LBOT] += h->mb_stride;
h->left_block = left_block_options[3]; h->left_block = left_block_options[3];
} else { } else {
h->left_block = left_block_options[2]; h->left_block = left_block_options[2];
...@@ -412,11 +409,11 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) ...@@ -412,11 +409,11 @@ static void fill_decode_neighbors(H264Context *h, int mb_type)
h->left_mb_xy[LBOT] = left_xy[LBOT]; h->left_mb_xy[LBOT] = left_xy[LBOT];
//FIXME do we need all in the context? //FIXME do we need all in the context?
h->topleft_type = s->current_picture.f.mb_type[topleft_xy]; h->topleft_type = h->cur_pic.f.mb_type[topleft_xy];
h->top_type = s->current_picture.f.mb_type[top_xy]; h->top_type = h->cur_pic.f.mb_type[top_xy];
h->topright_type = s->current_picture.f.mb_type[topright_xy]; h->topright_type = h->cur_pic.f.mb_type[topright_xy];
h->left_type[LTOP] = s->current_picture.f.mb_type[left_xy[LTOP]]; h->left_type[LTOP] = h->cur_pic.f.mb_type[left_xy[LTOP]];
h->left_type[LBOT] = s->current_picture.f.mb_type[left_xy[LBOT]]; h->left_type[LBOT] = h->cur_pic.f.mb_type[left_xy[LBOT]];
if (FMO) { if (FMO) {
if (h->slice_table[topleft_xy] != h->slice_num) if (h->slice_table[topleft_xy] != h->slice_num)
...@@ -440,7 +437,6 @@ static void fill_decode_neighbors(H264Context *h, int mb_type) ...@@ -440,7 +437,6 @@ static void fill_decode_neighbors(H264Context *h, int mb_type)
static void fill_decode_caches(H264Context *h, int mb_type) static void fill_decode_caches(H264Context *h, int mb_type)
{ {
MpegEncContext *const s = &h->s;
int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS]; int topleft_xy, top_xy, topright_xy, left_xy[LEFT_MBS];
int topleft_type, top_type, topright_type, left_type[LEFT_MBS]; int topleft_type, top_type, topright_type, left_type[LEFT_MBS];
const uint8_t *left_block = h->left_block; const uint8_t *left_block = h->left_block;
...@@ -483,7 +479,7 @@ static void fill_decode_caches(H264Context *h, int mb_type) ...@@ -483,7 +479,7 @@ static void fill_decode_caches(H264Context *h, int mb_type)
h->left_samples_available &= 0xFF5F; h->left_samples_available &= 0xFF5F;
} }
} else { } else {
int left_typei = s->current_picture.f.mb_type[left_xy[LTOP] + s->mb_stride]; int left_typei = h->cur_pic.f.mb_type[left_xy[LTOP] + h->mb_stride];
av_assert2(left_xy[LTOP] == left_xy[LBOT]); av_assert2(left_xy[LTOP] == left_xy[LBOT]);
if (!((left_typei & type_mask) && (left_type[LTOP] & type_mask))) { if (!((left_typei & type_mask) && (left_type[LTOP] & type_mask))) {
...@@ -540,7 +536,7 @@ static void fill_decode_caches(H264Context *h, int mb_type) ...@@ -540,7 +536,7 @@ static void fill_decode_caches(H264Context *h, int mb_type)
if (top_type) { if (top_type) {
nnz = h->non_zero_count[top_xy]; nnz = h->non_zero_count[top_xy];
AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[4 * 3]); AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[4 * 3]);
if (!s->chroma_y_shift) { if (!h->chroma_y_shift) {
AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 7]); AV_COPY32(&nnz_cache[4 + 8 * 5], &nnz[4 * 7]);
AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 11]); AV_COPY32(&nnz_cache[4 + 8 * 10], &nnz[4 * 11]);
} else { } else {
...@@ -605,9 +601,9 @@ static void fill_decode_caches(H264Context *h, int mb_type) ...@@ -605,9 +601,9 @@ static void fill_decode_caches(H264Context *h, int mb_type)
int b_stride = h->b_stride; int b_stride = h->b_stride;
for (list = 0; list < h->list_count; list++) { for (list = 0; list < h->list_count; list++) {
int8_t *ref_cache = &h->ref_cache[list][scan8[0]]; int8_t *ref_cache = &h->ref_cache[list][scan8[0]];
int8_t *ref = s->current_picture.f.ref_index[list]; int8_t *ref = h->cur_pic.f.ref_index[list];
int16_t(*mv_cache)[2] = &h->mv_cache[list][scan8[0]]; int16_t(*mv_cache)[2] = &h->mv_cache[list][scan8[0]];
int16_t(*mv)[2] = s->current_picture.f.motion_val[list]; int16_t(*mv)[2] = h->cur_pic.f.motion_val[list];
if (!USES_LIST(mb_type, list)) if (!USES_LIST(mb_type, list))
continue; continue;
av_assert2(!(IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred)); av_assert2(!(IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred));
...@@ -799,7 +795,6 @@ static void fill_decode_caches(H264Context *h, int mb_type) ...@@ -799,7 +795,6 @@ static void fill_decode_caches(H264Context *h, int mb_type)
*/ */
static void av_unused decode_mb_skip(H264Context *h) static void av_unused decode_mb_skip(H264Context *h)
{ {
MpegEncContext *const s = &h->s;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
int mb_type = 0; int mb_type = 0;
...@@ -825,10 +820,10 @@ static void av_unused decode_mb_skip(H264Context *h) ...@@ -825,10 +820,10 @@ static void av_unused decode_mb_skip(H264Context *h)
} }
write_back_motion(h, mb_type); write_back_motion(h, mb_type);
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
s->current_picture.f.qscale_table[mb_xy] = s->qscale; h->cur_pic.f.qscale_table[mb_xy] = h->qscale;
h->slice_table[mb_xy] = h->slice_num; h->slice_table[mb_xy] = h->slice_num;
h->prev_mb_skipped = 1; h->prev_mb_skipped = 1;
} }
#endif /* AVCODEC_H264_MVPRED_H */ #endif /* AVCODEC_H264_MVPRED_H */
...@@ -36,7 +36,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si ...@@ -36,7 +36,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si
{ {
int i, j; int i, j;
uint32_t state; uint32_t state;
ParseContext *pc = &(h->s.parse_context); ParseContext *pc = &h->parse_context;
int next_avc= h->is_avc ? 0 : buf_size; int next_avc= h->is_avc ? 0 : buf_size;
// mb_addr= pc->mb_addr - 1; // mb_addr= pc->mb_addr - 1;
...@@ -45,7 +45,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si ...@@ -45,7 +45,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si
state= 7; state= 7;
if(h->is_avc && !h->nal_length_size) if(h->is_avc && !h->nal_length_size)
av_log(h->s.avctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n"); av_log(h->avctx, AV_LOG_ERROR, "AVC-parser: nal length size invalid\n");
for(i=0; i<buf_size; i++){ for(i=0; i<buf_size; i++){
if(i >= next_avc) { if(i >= next_avc) {
...@@ -54,7 +54,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si ...@@ -54,7 +54,7 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si
for(j = 0; j < h->nal_length_size; j++) for(j = 0; j < h->nal_length_size; j++)
nalsize = (nalsize << 8) | buf[i++]; nalsize = (nalsize << 8) | buf[i++];
if(nalsize <= 0 || nalsize > buf_size - i){ if(nalsize <= 0 || nalsize > buf_size - i){
av_log(h->s.avctx, AV_LOG_ERROR, "AVC-parser: nal size %d remaining %d\n", nalsize, buf_size - i); av_log(h->avctx, AV_LOG_ERROR, "AVC-parser: nal size %d remaining %d\n", nalsize, buf_size - i);
return buf_size; return buf_size;
} }
next_avc= i + nalsize; next_avc= i + nalsize;
...@@ -153,7 +153,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -153,7 +153,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
s->pict_type = AV_PICTURE_TYPE_I; s->pict_type = AV_PICTURE_TYPE_I;
s->key_frame = 0; s->key_frame = 0;
h->s.avctx= avctx; h->avctx= avctx;
h->sei_recovery_frame_cnt = -1; h->sei_recovery_frame_cnt = -1;
h->sei_dpb_output_delay = 0; h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1; h->sei_cpb_removal_delay = -1;
...@@ -171,7 +171,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -171,7 +171,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
for (i = 0; i < h->nal_length_size; i++) for (i = 0; i < h->nal_length_size; i++)
nalsize = (nalsize << 8) | *buf++; nalsize = (nalsize << 8) | *buf++;
if (nalsize <= 0 || nalsize > buf_end - buf) { if (nalsize <= 0 || nalsize > buf_end - buf) {
av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); av_log(h->avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize);
break; break;
} }
src_length = nalsize; src_length = nalsize;
...@@ -194,13 +194,13 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -194,13 +194,13 @@ static inline int parse_nal_units(AVCodecParserContext *s,
if (ptr==NULL || dst_length < 0) if (ptr==NULL || dst_length < 0)
break; break;
init_get_bits(&h->s.gb, ptr, 8*dst_length); init_get_bits(&h->gb, ptr, 8*dst_length);
switch(h->nal_unit_type) { switch(h->nal_unit_type) {
case NAL_SPS: case NAL_SPS:
ff_h264_decode_seq_parameter_set(h); ff_h264_decode_seq_parameter_set(h);
break; break;
case NAL_PPS: case NAL_PPS:
ff_h264_decode_picture_parameter_set(h, h->s.gb.size_in_bits); ff_h264_decode_picture_parameter_set(h, h->gb.size_in_bits);
break; break;
case NAL_SEI: case NAL_SEI:
ff_h264_decode_sei(h); ff_h264_decode_sei(h);
...@@ -209,40 +209,40 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -209,40 +209,40 @@ static inline int parse_nal_units(AVCodecParserContext *s,
s->key_frame = 1; s->key_frame = 1;
/* fall through */ /* fall through */
case NAL_SLICE: case NAL_SLICE:
get_ue_golomb_long(&h->s.gb); // skip first_mb_in_slice get_ue_golomb_long(&h->gb); // skip first_mb_in_slice
slice_type = get_ue_golomb_31(&h->s.gb); slice_type = get_ue_golomb_31(&h->gb);
s->pict_type = golomb_to_pict_type[slice_type % 5]; s->pict_type = golomb_to_pict_type[slice_type % 5];
if (h->sei_recovery_frame_cnt >= 0) { if (h->sei_recovery_frame_cnt >= 0) {
/* key frame, since recovery_frame_cnt is set */ /* key frame, since recovery_frame_cnt is set */
s->key_frame = 1; s->key_frame = 1;
} }
pps_id= get_ue_golomb(&h->s.gb); pps_id= get_ue_golomb(&h->gb);
if(pps_id>=MAX_PPS_COUNT) { if(pps_id>=MAX_PPS_COUNT) {
av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); av_log(h->avctx, AV_LOG_ERROR, "pps_id out of range\n");
return -1; return -1;
} }
if(!h->pps_buffers[pps_id]) { if(!h->pps_buffers[pps_id]) {
av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS referenced\n"); av_log(h->avctx, AV_LOG_ERROR, "non-existing PPS referenced\n");
return -1; return -1;
} }
h->pps= *h->pps_buffers[pps_id]; h->pps= *h->pps_buffers[pps_id];
if(!h->sps_buffers[h->pps.sps_id]) { if(!h->sps_buffers[h->pps.sps_id]) {
av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS referenced\n"); av_log(h->avctx, AV_LOG_ERROR, "non-existing SPS referenced\n");
return -1; return -1;
} }
h->sps = *h->sps_buffers[h->pps.sps_id]; h->sps = *h->sps_buffers[h->pps.sps_id];
h->frame_num = get_bits(&h->s.gb, h->sps.log2_max_frame_num); h->frame_num = get_bits(&h->gb, h->sps.log2_max_frame_num);
avctx->profile = ff_h264_get_profile(&h->sps); avctx->profile = ff_h264_get_profile(&h->sps);
avctx->level = h->sps.level_idc; avctx->level = h->sps.level_idc;
if(h->sps.frame_mbs_only_flag){ if(h->sps.frame_mbs_only_flag){
h->s.picture_structure= PICT_FRAME; h->picture_structure= PICT_FRAME;
}else{ }else{
if(get_bits1(&h->s.gb)) { //field_pic_flag if(get_bits1(&h->gb)) { //field_pic_flag
h->s.picture_structure= PICT_TOP_FIELD + get_bits1(&h->s.gb); //bottom_field_flag h->picture_structure= PICT_TOP_FIELD + get_bits1(&h->gb); //bottom_field_flag
} else { } else {
h->s.picture_structure= PICT_FRAME; h->picture_structure= PICT_FRAME;
} }
} }
...@@ -268,11 +268,11 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -268,11 +268,11 @@ static inline int parse_nal_units(AVCodecParserContext *s,
s->repeat_pict = 5; s->repeat_pict = 5;
break; break;
default: default:
s->repeat_pict = h->s.picture_structure == PICT_FRAME ? 1 : 0; s->repeat_pict = h->picture_structure == PICT_FRAME ? 1 : 0;
break; break;
} }
} else { } else {
s->repeat_pict = h->s.picture_structure == PICT_FRAME ? 1 : 0; s->repeat_pict = h->picture_structure == PICT_FRAME ? 1 : 0;
} }
return 0; /* no need to evaluate the rest */ return 0; /* no need to evaluate the rest */
...@@ -282,7 +282,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, ...@@ -282,7 +282,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
if (q264) if (q264)
return 0; return 0;
/* didn't find a picture! */ /* didn't find a picture! */
av_log(h->s.avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size); av_log(h->avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size);
return -1; return -1;
} }
...@@ -292,19 +292,19 @@ static int h264_parse(AVCodecParserContext *s, ...@@ -292,19 +292,19 @@ static int h264_parse(AVCodecParserContext *s,
const uint8_t *buf, int buf_size) const uint8_t *buf, int buf_size)
{ {
H264Context *h = s->priv_data; H264Context *h = s->priv_data;
ParseContext *pc = &h->s.parse_context; ParseContext *pc = &h->parse_context;
int next; int next;
if (!h->got_first) { if (!h->got_first) {
h->got_first = 1; h->got_first = 1;
if (avctx->extradata_size) { if (avctx->extradata_size) {
h->s.avctx = avctx; h->avctx = avctx;
// must be done like in decoder, otherwise opening the parser, // must be done like in decoder, otherwise opening the parser,
// letting it create extradata and then closing and opening again // letting it create extradata and then closing and opening again
// will cause has_b_frames to be always set. // will cause has_b_frames to be always set.
// Note that estimate_timings_from_pts does exactly this. // Note that estimate_timings_from_pts does exactly this.
if (!avctx->has_b_frames) if (!avctx->has_b_frames)
h->s.low_delay = 1; h->low_delay = 1;
ff_h264_decode_extradata(h, avctx->extradata, avctx->extradata_size); ff_h264_decode_extradata(h, avctx->extradata, avctx->extradata_size);
} }
} }
...@@ -374,7 +374,7 @@ static int h264_split(AVCodecContext *avctx, ...@@ -374,7 +374,7 @@ static int h264_split(AVCodecContext *avctx,
static void close(AVCodecParserContext *s) static void close(AVCodecParserContext *s)
{ {
H264Context *h = s->priv_data; H264Context *h = s->priv_data;
ParseContext *pc = &h->s.parse_context; ParseContext *pc = &h->parse_context;
av_free(pc->buffer); av_free(pc->buffer);
ff_h264_free_context(h); ff_h264_free_context(h);
...@@ -384,7 +384,7 @@ static int init(AVCodecParserContext *s) ...@@ -384,7 +384,7 @@ static int init(AVCodecParserContext *s)
{ {
H264Context *h = s->priv_data; H264Context *h = s->priv_data;
h->thread_context[0] = h; h->thread_context[0] = h;
h->s.slice_context_count = 1; h->slice_context_count = 1;
return 0; return 0;
} }
......
...@@ -151,46 +151,44 @@ static const uint8_t default_scaling8[2][64]={ ...@@ -151,46 +151,44 @@ static const uint8_t default_scaling8[2][64]={
}}; }};
static inline int decode_hrd_parameters(H264Context *h, SPS *sps){ static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
MpegEncContext * const s = &h->s;
int cpb_count, i; int cpb_count, i;
cpb_count = get_ue_golomb_31(&s->gb) + 1; cpb_count = get_ue_golomb_31(&h->gb) + 1;
if(cpb_count > 32U){ if(cpb_count > 32U){
av_log(h->s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count); av_log(h->avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
return -1; return -1;
} }
get_bits(&s->gb, 4); /* bit_rate_scale */ get_bits(&h->gb, 4); /* bit_rate_scale */
get_bits(&s->gb, 4); /* cpb_size_scale */ get_bits(&h->gb, 4); /* cpb_size_scale */
for(i=0; i<cpb_count; i++){ for(i=0; i<cpb_count; i++){
get_ue_golomb_long(&s->gb); /* bit_rate_value_minus1 */ get_ue_golomb_long(&h->gb); /* bit_rate_value_minus1 */
get_ue_golomb_long(&s->gb); /* cpb_size_value_minus1 */ get_ue_golomb_long(&h->gb); /* cpb_size_value_minus1 */
get_bits1(&s->gb); /* cbr_flag */ get_bits1(&h->gb); /* cbr_flag */
} }
sps->initial_cpb_removal_delay_length = get_bits(&s->gb, 5) + 1; sps->initial_cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
sps->cpb_removal_delay_length = get_bits(&s->gb, 5) + 1; sps->cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
sps->dpb_output_delay_length = get_bits(&s->gb, 5) + 1; sps->dpb_output_delay_length = get_bits(&h->gb, 5) + 1;
sps->time_offset_length = get_bits(&s->gb, 5); sps->time_offset_length = get_bits(&h->gb, 5);
sps->cpb_cnt = cpb_count; sps->cpb_cnt = cpb_count;
return 0; return 0;
} }
static inline int decode_vui_parameters(H264Context *h, SPS *sps){ static inline int decode_vui_parameters(H264Context *h, SPS *sps){
MpegEncContext * const s = &h->s;
int aspect_ratio_info_present_flag; int aspect_ratio_info_present_flag;
unsigned int aspect_ratio_idc; unsigned int aspect_ratio_idc;
aspect_ratio_info_present_flag= get_bits1(&s->gb); aspect_ratio_info_present_flag= get_bits1(&h->gb);
if( aspect_ratio_info_present_flag ) { if( aspect_ratio_info_present_flag ) {
aspect_ratio_idc= get_bits(&s->gb, 8); aspect_ratio_idc= get_bits(&h->gb, 8);
if( aspect_ratio_idc == EXTENDED_SAR ) { if( aspect_ratio_idc == EXTENDED_SAR ) {
sps->sar.num= get_bits(&s->gb, 16); sps->sar.num= get_bits(&h->gb, 16);
sps->sar.den= get_bits(&s->gb, 16); sps->sar.den= get_bits(&h->gb, 16);
}else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){ }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){
sps->sar= pixel_aspect[aspect_ratio_idc]; sps->sar= pixel_aspect[aspect_ratio_idc];
}else{ }else{
av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n"); av_log(h->avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
return -1; return -1;
} }
}else{ }else{
...@@ -199,20 +197,20 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ ...@@ -199,20 +197,20 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){
} }
// s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height); // s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
if(get_bits1(&s->gb)){ /* overscan_info_present_flag */ if(get_bits1(&h->gb)){ /* overscan_info_present_flag */
get_bits1(&s->gb); /* overscan_appropriate_flag */ get_bits1(&h->gb); /* overscan_appropriate_flag */
} }
sps->video_signal_type_present_flag = get_bits1(&s->gb); sps->video_signal_type_present_flag = get_bits1(&h->gb);
if(sps->video_signal_type_present_flag){ if(sps->video_signal_type_present_flag){
get_bits(&s->gb, 3); /* video_format */ get_bits(&h->gb, 3); /* video_format */
sps->full_range = get_bits1(&s->gb); /* video_full_range_flag */ sps->full_range = get_bits1(&h->gb); /* video_full_range_flag */
sps->colour_description_present_flag = get_bits1(&s->gb); sps->colour_description_present_flag = get_bits1(&h->gb);
if(sps->colour_description_present_flag){ if(sps->colour_description_present_flag){
sps->color_primaries = get_bits(&s->gb, 8); /* colour_primaries */ sps->color_primaries = get_bits(&h->gb, 8); /* colour_primaries */
sps->color_trc = get_bits(&s->gb, 8); /* transfer_characteristics */ sps->color_trc = get_bits(&h->gb, 8); /* transfer_characteristics */
sps->colorspace = get_bits(&s->gb, 8); /* matrix_coefficients */ sps->colorspace = get_bits(&h->gb, 8); /* matrix_coefficients */
if (sps->color_primaries >= AVCOL_PRI_NB) if (sps->color_primaries >= AVCOL_PRI_NB)
sps->color_primaries = AVCOL_PRI_UNSPECIFIED; sps->color_primaries = AVCOL_PRI_UNSPECIFIED;
if (sps->color_trc >= AVCOL_TRC_NB) if (sps->color_trc >= AVCOL_TRC_NB)
...@@ -222,58 +220,58 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ ...@@ -222,58 +220,58 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){
} }
} }
if(get_bits1(&s->gb)){ /* chroma_location_info_present_flag */ if(get_bits1(&h->gb)){ /* chroma_location_info_present_flag */
s->avctx->chroma_sample_location = get_ue_golomb(&s->gb)+1; /* chroma_sample_location_type_top_field */ h->avctx->chroma_sample_location = get_ue_golomb(&h->gb)+1; /* chroma_sample_location_type_top_field */
get_ue_golomb(&s->gb); /* chroma_sample_location_type_bottom_field */ get_ue_golomb(&h->gb); /* chroma_sample_location_type_bottom_field */
} }
sps->timing_info_present_flag = get_bits1(&s->gb); sps->timing_info_present_flag = get_bits1(&h->gb);
if(sps->timing_info_present_flag){ if(sps->timing_info_present_flag){
sps->num_units_in_tick = get_bits_long(&s->gb, 32); sps->num_units_in_tick = get_bits_long(&h->gb, 32);
sps->time_scale = get_bits_long(&s->gb, 32); sps->time_scale = get_bits_long(&h->gb, 32);
if(!sps->num_units_in_tick || !sps->time_scale){ if(!sps->num_units_in_tick || !sps->time_scale){
av_log(h->s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps->time_scale, sps->num_units_in_tick); av_log(h->avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps->time_scale, sps->num_units_in_tick);
return -1; return -1;
} }
sps->fixed_frame_rate_flag = get_bits1(&s->gb); sps->fixed_frame_rate_flag = get_bits1(&h->gb);
} }
sps->nal_hrd_parameters_present_flag = get_bits1(&s->gb); sps->nal_hrd_parameters_present_flag = get_bits1(&h->gb);
if(sps->nal_hrd_parameters_present_flag) if(sps->nal_hrd_parameters_present_flag)
if(decode_hrd_parameters(h, sps) < 0) if(decode_hrd_parameters(h, sps) < 0)
return -1; return -1;
sps->vcl_hrd_parameters_present_flag = get_bits1(&s->gb); sps->vcl_hrd_parameters_present_flag = get_bits1(&h->gb);
if(sps->vcl_hrd_parameters_present_flag) if(sps->vcl_hrd_parameters_present_flag)
if(decode_hrd_parameters(h, sps) < 0) if(decode_hrd_parameters(h, sps) < 0)
return -1; return -1;
if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag) if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
get_bits1(&s->gb); /* low_delay_hrd_flag */ get_bits1(&h->gb); /* low_delay_hrd_flag */
sps->pic_struct_present_flag = get_bits1(&s->gb); sps->pic_struct_present_flag = get_bits1(&h->gb);
if(!get_bits_left(&s->gb)) if(!get_bits_left(&h->gb))
return 0; return 0;
sps->bitstream_restriction_flag = get_bits1(&s->gb); sps->bitstream_restriction_flag = get_bits1(&h->gb);
if(sps->bitstream_restriction_flag){ if(sps->bitstream_restriction_flag){
get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */ get_bits1(&h->gb); /* motion_vectors_over_pic_boundaries_flag */
get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */ get_ue_golomb(&h->gb); /* max_bytes_per_pic_denom */
get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */ get_ue_golomb(&h->gb); /* max_bits_per_mb_denom */
get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */ get_ue_golomb(&h->gb); /* log2_max_mv_length_horizontal */
get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */ get_ue_golomb(&h->gb); /* log2_max_mv_length_vertical */
sps->num_reorder_frames= get_ue_golomb(&s->gb); sps->num_reorder_frames= get_ue_golomb(&h->gb);
get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/ get_ue_golomb(&h->gb); /*max_dec_frame_buffering*/
if (get_bits_left(&s->gb) < 0) { if (get_bits_left(&h->gb) < 0) {
sps->num_reorder_frames=0; sps->num_reorder_frames=0;
sps->bitstream_restriction_flag= 0; sps->bitstream_restriction_flag= 0;
} }
if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){ if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames); av_log(h->avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames);
return -1; return -1;
} }
} }
if (get_bits_left(&s->gb) < 0) { if (get_bits_left(&h->gb) < 0) {
av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&s->gb)); av_log(h->avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&h->gb));
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
...@@ -282,15 +280,14 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){ ...@@ -282,15 +280,14 @@ static inline int decode_vui_parameters(H264Context *h, SPS *sps){
static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
const uint8_t *jvt_list, const uint8_t *fallback_list){ const uint8_t *jvt_list, const uint8_t *fallback_list){
MpegEncContext * const s = &h->s;
int i, last = 8, next = 8; int i, last = 8, next = 8;
const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct; const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct;
if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */ if(!get_bits1(&h->gb)) /* matrix not written, we use the predicted one */
memcpy(factors, fallback_list, size*sizeof(uint8_t)); memcpy(factors, fallback_list, size*sizeof(uint8_t));
else else
for(i=0;i<size;i++){ for(i=0;i<size;i++){
if(next) if(next)
next = (last + get_se_golomb(&s->gb)) & 0xff; next = (last + get_se_golomb(&h->gb)) & 0xff;
if(!i && !next){ /* matrix not written, we use the preset one */ if(!i && !next){ /* matrix not written, we use the preset one */
memcpy(factors, jvt_list, size*sizeof(uint8_t)); memcpy(factors, jvt_list, size*sizeof(uint8_t));
break; break;
...@@ -301,7 +298,6 @@ static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, ...@@ -301,7 +298,6 @@ static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps, static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){ uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
MpegEncContext * const s = &h->s;
int fallback_sps = !is_sps && sps->scaling_matrix_present; int fallback_sps = !is_sps && sps->scaling_matrix_present;
const uint8_t *fallback[4] = { const uint8_t *fallback[4] = {
fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
...@@ -309,7 +305,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s ...@@ -309,7 +305,7 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s
fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1] fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1]
}; };
if(get_bits1(&s->gb)){ if(get_bits1(&h->gb)){
sps->scaling_matrix_present |= is_sps; sps->scaling_matrix_present |= is_sps;
decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
...@@ -331,25 +327,24 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s ...@@ -331,25 +327,24 @@ static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_s
} }
int ff_h264_decode_seq_parameter_set(H264Context *h){ int ff_h264_decode_seq_parameter_set(H264Context *h){
MpegEncContext * const s = &h->s;
int profile_idc, level_idc, constraint_set_flags = 0; int profile_idc, level_idc, constraint_set_flags = 0;
unsigned int sps_id; unsigned int sps_id;
int i, log2_max_frame_num_minus4; int i, log2_max_frame_num_minus4;
SPS *sps; SPS *sps;
profile_idc= get_bits(&s->gb, 8); profile_idc= get_bits(&h->gb, 8);
constraint_set_flags |= get_bits1(&s->gb) << 0; //constraint_set0_flag constraint_set_flags |= get_bits1(&h->gb) << 0; //constraint_set0_flag
constraint_set_flags |= get_bits1(&s->gb) << 1; //constraint_set1_flag constraint_set_flags |= get_bits1(&h->gb) << 1; //constraint_set1_flag
constraint_set_flags |= get_bits1(&s->gb) << 2; //constraint_set2_flag constraint_set_flags |= get_bits1(&h->gb) << 2; //constraint_set2_flag
constraint_set_flags |= get_bits1(&s->gb) << 3; //constraint_set3_flag constraint_set_flags |= get_bits1(&h->gb) << 3; //constraint_set3_flag
constraint_set_flags |= get_bits1(&s->gb) << 4; //constraint_set4_flag constraint_set_flags |= get_bits1(&h->gb) << 4; //constraint_set4_flag
constraint_set_flags |= get_bits1(&s->gb) << 5; //constraint_set5_flag constraint_set_flags |= get_bits1(&h->gb) << 5; //constraint_set5_flag
get_bits(&s->gb, 2); // reserved get_bits(&h->gb, 2); // reserved
level_idc= get_bits(&s->gb, 8); level_idc= get_bits(&h->gb, 8);
sps_id= get_ue_golomb_31(&s->gb); sps_id= get_ue_golomb_31(&h->gb);
if(sps_id >= MAX_SPS_COUNT) { if(sps_id >= MAX_SPS_COUNT) {
av_log(h->s.avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id); av_log(h->avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
return -1; return -1;
} }
sps= av_mallocz(sizeof(SPS)); sps= av_mallocz(sizeof(SPS));
...@@ -372,25 +367,25 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -372,25 +367,25 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
sps->profile_idc == 44 || sps->profile_idc == 83 || sps->profile_idc == 44 || sps->profile_idc == 83 ||
sps->profile_idc == 86 || sps->profile_idc == 118 || sps->profile_idc == 86 || sps->profile_idc == 118 ||
sps->profile_idc == 128 || sps->profile_idc == 144) { sps->profile_idc == 128 || sps->profile_idc == 144) {
sps->chroma_format_idc= get_ue_golomb_31(&s->gb); sps->chroma_format_idc= get_ue_golomb_31(&h->gb);
if (sps->chroma_format_idc > 3U) { if (sps->chroma_format_idc > 3U) {
av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc); av_log(h->avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc);
goto fail; goto fail;
} else if(sps->chroma_format_idc == 3) { } else if(sps->chroma_format_idc == 3) {
sps->residual_color_transform_flag = get_bits1(&s->gb); sps->residual_color_transform_flag = get_bits1(&h->gb);
if(sps->residual_color_transform_flag) { if(sps->residual_color_transform_flag) {
av_log(h->s.avctx, AV_LOG_ERROR, "separate color planes are not supported\n"); av_log(h->avctx, AV_LOG_ERROR, "separate color planes are not supported\n");
goto fail; goto fail;
} }
} }
sps->bit_depth_luma = get_ue_golomb(&s->gb) + 8; sps->bit_depth_luma = get_ue_golomb(&h->gb) + 8;
sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8; sps->bit_depth_chroma = get_ue_golomb(&h->gb) + 8;
if (sps->bit_depth_luma > 14U || sps->bit_depth_chroma > 14U) { if (sps->bit_depth_luma > 14U || sps->bit_depth_chroma > 14U) {
av_log(h->s.avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n", av_log(h->avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n",
sps->bit_depth_luma, sps->bit_depth_chroma); sps->bit_depth_luma, sps->bit_depth_chroma);
goto fail; goto fail;
} }
sps->transform_bypass = get_bits1(&s->gb); sps->transform_bypass = get_bits1(&h->gb);
decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8); decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
}else{ }else{
sps->chroma_format_idc= 1; sps->chroma_format_idc= 1;
...@@ -398,81 +393,81 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -398,81 +393,81 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
sps->bit_depth_chroma = 8; sps->bit_depth_chroma = 8;
} }
log2_max_frame_num_minus4 = get_ue_golomb(&s->gb); log2_max_frame_num_minus4 = get_ue_golomb(&h->gb);
if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 || if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 ||
log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) { log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"log2_max_frame_num_minus4 out of range (0-12): %d\n", "log2_max_frame_num_minus4 out of range (0-12): %d\n",
log2_max_frame_num_minus4); log2_max_frame_num_minus4);
goto fail; goto fail;
} }
sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4; sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4;
sps->poc_type= get_ue_golomb_31(&s->gb); sps->poc_type= get_ue_golomb_31(&h->gb);
if(sps->poc_type == 0){ //FIXME #define if(sps->poc_type == 0){ //FIXME #define
unsigned t = get_ue_golomb(&s->gb); unsigned t = get_ue_golomb(&h->gb);
if(t>12){ if(t>12){
av_log(h->s.avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t); av_log(h->avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t);
goto fail; goto fail;
} }
sps->log2_max_poc_lsb= t + 4; sps->log2_max_poc_lsb= t + 4;
} else if(sps->poc_type == 1){//FIXME #define } else if(sps->poc_type == 1){//FIXME #define
sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb); sps->delta_pic_order_always_zero_flag= get_bits1(&h->gb);
sps->offset_for_non_ref_pic= get_se_golomb(&s->gb); sps->offset_for_non_ref_pic= get_se_golomb(&h->gb);
sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb); sps->offset_for_top_to_bottom_field= get_se_golomb(&h->gb);
sps->poc_cycle_length = get_ue_golomb(&s->gb); sps->poc_cycle_length = get_ue_golomb(&h->gb);
if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){ if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length); av_log(h->avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
goto fail; goto fail;
} }
for(i=0; i<sps->poc_cycle_length; i++) for(i=0; i<sps->poc_cycle_length; i++)
sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb); sps->offset_for_ref_frame[i]= get_se_golomb(&h->gb);
}else if(sps->poc_type != 2){ }else if(sps->poc_type != 2){
av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type); av_log(h->avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
goto fail; goto fail;
} }
sps->ref_frame_count= get_ue_golomb_31(&s->gb); sps->ref_frame_count= get_ue_golomb_31(&h->gb);
if (h->s.avctx->codec_tag == MKTAG('S', 'M', 'V', '2')) if (h->avctx->codec_tag == MKTAG('S', 'M', 'V', '2'))
sps->ref_frame_count= FFMAX(2, sps->ref_frame_count); sps->ref_frame_count= FFMAX(2, sps->ref_frame_count);
if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count > 16U){ if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count > 16U){
av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n"); av_log(h->avctx, AV_LOG_ERROR, "too many reference frames\n");
goto fail; goto fail;
} }
sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb); sps->gaps_in_frame_num_allowed_flag= get_bits1(&h->gb);
sps->mb_width = get_ue_golomb(&s->gb) + 1; sps->mb_width = get_ue_golomb(&h->gb) + 1;
sps->mb_height= get_ue_golomb(&s->gb) + 1; sps->mb_height= get_ue_golomb(&h->gb) + 1;
if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 || if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->s.avctx)){ av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->avctx)){
av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n"); av_log(h->avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
goto fail; goto fail;
} }
sps->frame_mbs_only_flag= get_bits1(&s->gb); sps->frame_mbs_only_flag= get_bits1(&h->gb);
if(!sps->frame_mbs_only_flag) if(!sps->frame_mbs_only_flag)
sps->mb_aff= get_bits1(&s->gb); sps->mb_aff= get_bits1(&h->gb);
else else
sps->mb_aff= 0; sps->mb_aff= 0;
sps->direct_8x8_inference_flag= get_bits1(&s->gb); sps->direct_8x8_inference_flag= get_bits1(&h->gb);
#ifndef ALLOW_INTERLACE #ifndef ALLOW_INTERLACE
if(sps->mb_aff) if(sps->mb_aff)
av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); av_log(h->avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
#endif #endif
sps->crop= get_bits1(&s->gb); sps->crop= get_bits1(&h->gb);
if(sps->crop){ if(sps->crop){
int crop_vertical_limit = sps->chroma_format_idc & 2 ? 16 : 8; int crop_vertical_limit = sps->chroma_format_idc & 2 ? 16 : 8;
int crop_horizontal_limit = sps->chroma_format_idc == 3 ? 16 : 8; int crop_horizontal_limit = sps->chroma_format_idc == 3 ? 16 : 8;
sps->crop_left = get_ue_golomb(&s->gb); sps->crop_left = get_ue_golomb(&h->gb);
sps->crop_right = get_ue_golomb(&s->gb); sps->crop_right = get_ue_golomb(&h->gb);
sps->crop_top = get_ue_golomb(&s->gb); sps->crop_top = get_ue_golomb(&h->gb);
sps->crop_bottom= get_ue_golomb(&s->gb); sps->crop_bottom= get_ue_golomb(&h->gb);
if (h->s.avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) { if (h->avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) {
av_log(h->s.avctx, AV_LOG_DEBUG, av_log(h->avctx, AV_LOG_DEBUG,
"discarding sps cropping, " "discarding sps cropping, "
"original values are l:%u r:%u t:%u b:%u\n", "original values are l:%u r:%u t:%u b:%u\n",
sps->crop_left, sps->crop_left,
...@@ -486,10 +481,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -486,10 +481,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
sps->crop_bottom = 0; sps->crop_bottom = 0;
} }
if(sps->crop_left || sps->crop_top){ if(sps->crop_left || sps->crop_top){
av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ... (left: %d, top: %d)\n", sps->crop_left, sps->crop_top); av_log(h->avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ... (left: %d, top: %d)\n", sps->crop_left, sps->crop_top);
} }
if(sps->crop_right >= crop_horizontal_limit || sps->crop_bottom >= crop_vertical_limit){ if(sps->crop_right >= crop_horizontal_limit || sps->crop_bottom >= crop_vertical_limit){
av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, cropping disabled (right: %d, bottom: %d)\n", sps->crop_right, sps->crop_bottom); av_log(h->avctx, AV_LOG_ERROR, "brainfart cropping not supported, cropping disabled (right: %d, bottom: %d)\n", sps->crop_right, sps->crop_bottom);
/* It is very unlikely that partial cropping will make anybody happy. /* It is very unlikely that partial cropping will make anybody happy.
* Not cropping at all fixes for example playback of Sisvel 3D streams * Not cropping at all fixes for example playback of Sisvel 3D streams
* in applications supporting Sisvel 3D. */ * in applications supporting Sisvel 3D. */
...@@ -505,7 +500,7 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -505,7 +500,7 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
sps->crop_bottom= 0; sps->crop_bottom= 0;
} }
sps->vui_parameters_present_flag= get_bits1(&s->gb); sps->vui_parameters_present_flag= get_bits1(&h->gb);
if( sps->vui_parameters_present_flag ) if( sps->vui_parameters_present_flag )
if (decode_vui_parameters(h, sps) < 0) if (decode_vui_parameters(h, sps) < 0)
goto fail; goto fail;
...@@ -513,9 +508,9 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){ ...@@ -513,9 +508,9 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
if(!sps->sar.den) if(!sps->sar.den)
sps->sar.den= 1; sps->sar.den= 1;
if(s->avctx->debug&FF_DEBUG_PICT_INFO){ if(h->avctx->debug&FF_DEBUG_PICT_INFO){
static const char csp[4][5] = { "Gray", "420", "422", "444" }; static const char csp[4][5] = { "Gray", "420", "422", "444" };
av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d b%d reo:%d\n", av_log(h->avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d b%d reo:%d\n",
sps_id, sps->profile_idc, sps->level_idc, sps_id, sps->profile_idc, sps->level_idc,
sps->poc_type, sps->poc_type,
sps->ref_frame_count, sps->ref_frame_count,
...@@ -561,7 +556,7 @@ static int more_rbsp_data_in_pps(H264Context *h, PPS *pps) ...@@ -561,7 +556,7 @@ static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
if ((profile_idc == 66 || profile_idc == 77 || if ((profile_idc == 66 || profile_idc == 77 ||
profile_idc == 88) && (sps->constraint_set_flags & 7)) { profile_idc == 88) && (sps->constraint_set_flags & 7)) {
av_log(h->s.avctx, AV_LOG_VERBOSE, av_log(h->avctx, AV_LOG_VERBOSE,
"Current profile doesn't provide more RBSP data in PPS, skipping\n"); "Current profile doesn't provide more RBSP data in PPS, skipping\n");
return 0; return 0;
} }
...@@ -570,38 +565,37 @@ static int more_rbsp_data_in_pps(H264Context *h, PPS *pps) ...@@ -570,38 +565,37 @@ static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
} }
int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
MpegEncContext * const s = &h->s; unsigned int pps_id= get_ue_golomb(&h->gb);
unsigned int pps_id= get_ue_golomb(&s->gb);
PPS *pps; PPS *pps;
const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8); const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
int bits_left; int bits_left;
if(pps_id >= MAX_PPS_COUNT) { if(pps_id >= MAX_PPS_COUNT) {
av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id); av_log(h->avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
return -1; return -1;
} else if (h->sps.bit_depth_luma > 14) { } else if (h->sps.bit_depth_luma > 14) {
av_log(h->s.avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma); av_log(h->avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) { } else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) {
av_log(h->s.avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma); av_log(h->avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma);
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
pps= av_mallocz(sizeof(PPS)); pps= av_mallocz(sizeof(PPS));
if(pps == NULL) if(pps == NULL)
return -1; return -1;
pps->sps_id= get_ue_golomb_31(&s->gb); pps->sps_id= get_ue_golomb_31(&h->gb);
if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){ if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n"); av_log(h->avctx, AV_LOG_ERROR, "sps_id out of range\n");
goto fail; goto fail;
} }
pps->cabac= get_bits1(&s->gb); pps->cabac= get_bits1(&h->gb);
pps->pic_order_present= get_bits1(&s->gb); pps->pic_order_present= get_bits1(&h->gb);
pps->slice_group_count= get_ue_golomb(&s->gb) + 1; pps->slice_group_count= get_ue_golomb(&h->gb) + 1;
if(pps->slice_group_count > 1 ){ if(pps->slice_group_count > 1 ){
pps->mb_slice_group_map_type= get_ue_golomb(&s->gb); pps->mb_slice_group_map_type= get_ue_golomb(&h->gb);
av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n"); av_log(h->avctx, AV_LOG_ERROR, "FMO not supported\n");
switch(pps->mb_slice_group_map_type){ switch(pps->mb_slice_group_map_type){
case 0: case 0:
#if 0 #if 0
...@@ -636,32 +630,32 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ ...@@ -636,32 +630,32 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
break; break;
} }
} }
pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; pps->ref_count[0]= get_ue_golomb(&h->gb) + 1;
pps->ref_count[1]= get_ue_golomb(&s->gb) + 1; pps->ref_count[1]= get_ue_golomb(&h->gb) + 1;
if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){ if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n"); av_log(h->avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
goto fail; goto fail;
} }
pps->weighted_pred= get_bits1(&s->gb); pps->weighted_pred= get_bits1(&h->gb);
pps->weighted_bipred_idc= get_bits(&s->gb, 2); pps->weighted_bipred_idc= get_bits(&h->gb, 2);
pps->init_qp= get_se_golomb(&s->gb) + 26 + qp_bd_offset; pps->init_qp= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
pps->init_qs= get_se_golomb(&s->gb) + 26 + qp_bd_offset; pps->init_qs= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb); pps->chroma_qp_index_offset[0]= get_se_golomb(&h->gb);
pps->deblocking_filter_parameters_present= get_bits1(&s->gb); pps->deblocking_filter_parameters_present= get_bits1(&h->gb);
pps->constrained_intra_pred= get_bits1(&s->gb); pps->constrained_intra_pred= get_bits1(&h->gb);
pps->redundant_pic_cnt_present = get_bits1(&s->gb); pps->redundant_pic_cnt_present = get_bits1(&h->gb);
pps->transform_8x8_mode= 0; pps->transform_8x8_mode= 0;
h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4)); memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8)); memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
bits_left = bit_length - get_bits_count(&s->gb); bits_left = bit_length - get_bits_count(&h->gb);
if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){ if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){
pps->transform_8x8_mode= get_bits1(&s->gb); pps->transform_8x8_mode= get_bits1(&h->gb);
decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8); decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset pps->chroma_qp_index_offset[1]= get_se_golomb(&h->gb); //second_chroma_qp_index_offset
} else { } else {
pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0]; pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
} }
...@@ -671,8 +665,8 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ ...@@ -671,8 +665,8 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1]) if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
pps->chroma_qp_diff= 1; pps->chroma_qp_diff= 1;
if(s->avctx->debug&FF_DEBUG_PICT_INFO){ if(h->avctx->debug&FF_DEBUG_PICT_INFO){
av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n", av_log(h->avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n",
pps_id, pps->sps_id, pps_id, pps->sps_id,
pps->cabac ? "CABAC" : "CAVLC", pps->cabac ? "CABAC" : "CAVLC",
pps->slice_group_count, pps->slice_group_count,
......
...@@ -107,7 +107,6 @@ static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int d ...@@ -107,7 +107,6 @@ static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int d
} }
int ff_h264_fill_default_ref_list(H264Context *h){ int ff_h264_fill_default_ref_list(H264Context *h){
MpegEncContext * const s = &h->s;
int i, len; int i, len;
if(h->slice_type_nos==AV_PICTURE_TYPE_B){ if(h->slice_type_nos==AV_PICTURE_TYPE_B){
...@@ -116,16 +115,16 @@ int ff_h264_fill_default_ref_list(H264Context *h){ ...@@ -116,16 +115,16 @@ int ff_h264_fill_default_ref_list(H264Context *h){
int lens[2]; int lens[2];
if(FIELD_PICTURE) if(FIELD_PICTURE)
cur_poc= s->current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ]; cur_poc= h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD];
else else
cur_poc= s->current_picture_ptr->poc; cur_poc= h->cur_pic_ptr->poc;
for(list= 0; list<2; list++){ for(list= 0; list<2; list++){
len= add_sorted(sorted , h->short_ref, h->short_ref_count, cur_poc, 1^list); len= add_sorted(sorted , h->short_ref, h->short_ref_count, cur_poc, 1^list);
len+=add_sorted(sorted+len, h->short_ref, h->short_ref_count, cur_poc, 0^list); len+=add_sorted(sorted+len, h->short_ref, h->short_ref_count, cur_poc, 0^list);
av_assert0(len<=32); av_assert0(len<=32);
len= build_def_list(h->default_ref_list[list] , sorted , len, 0, s->picture_structure); len= build_def_list(h->default_ref_list[list] , sorted , len, 0, h->picture_structure);
len+=build_def_list(h->default_ref_list[list]+len, h->long_ref, 16 , 1, s->picture_structure); len+=build_def_list(h->default_ref_list[list]+len, h->long_ref, 16 , 1, h->picture_structure);
av_assert0(len<=32); av_assert0(len<=32);
if(len < h->ref_count[list]) if(len < h->ref_count[list])
...@@ -139,19 +138,19 @@ int ff_h264_fill_default_ref_list(H264Context *h){ ...@@ -139,19 +138,19 @@ int ff_h264_fill_default_ref_list(H264Context *h){
FFSWAP(Picture, h->default_ref_list[1][0], h->default_ref_list[1][1]); FFSWAP(Picture, h->default_ref_list[1][0], h->default_ref_list[1][1]);
} }
}else{ }else{
len = build_def_list(h->default_ref_list[0] , h->short_ref, h->short_ref_count, 0, s->picture_structure); len = build_def_list(h->default_ref_list[0] , h->short_ref, h->short_ref_count, 0, h->picture_structure);
len+= build_def_list(h->default_ref_list[0]+len, h-> long_ref, 16 , 1, s->picture_structure); len+= build_def_list(h->default_ref_list[0]+len, h-> long_ref, 16 , 1, h->picture_structure);
av_assert0(len<=32); av_assert0(len<=32);
if(len < h->ref_count[0]) if(len < h->ref_count[0])
memset(&h->default_ref_list[0][len], 0, sizeof(Picture)*(h->ref_count[0] - len)); memset(&h->default_ref_list[0][len], 0, sizeof(Picture)*(h->ref_count[0] - len));
} }
#ifdef TRACE #ifdef TRACE
for (i=0; i<h->ref_count[0]; i++) { for (i=0; i<h->ref_count[0]; i++) {
tprintf(h->s.avctx, "List0: %s fn:%d 0x%p\n", (h->default_ref_list[0][i].long_ref ? "LT" : "ST"), h->default_ref_list[0][i].pic_id, h->default_ref_list[0][i].f.data[0]); tprintf(h->avctx, "List0: %s fn:%d 0x%p\n", (h->default_ref_list[0][i].long_ref ? "LT" : "ST"), h->default_ref_list[0][i].pic_id, h->default_ref_list[0][i].f.data[0]);
} }
if(h->slice_type_nos==AV_PICTURE_TYPE_B){ if(h->slice_type_nos==AV_PICTURE_TYPE_B){
for (i=0; i<h->ref_count[1]; i++) { for (i=0; i<h->ref_count[1]; i++) {
tprintf(h->s.avctx, "List1: %s fn:%d 0x%p\n", (h->default_ref_list[1][i].long_ref ? "LT" : "ST"), h->default_ref_list[1][i].pic_id, h->default_ref_list[1][i].f.data[0]); tprintf(h->avctx, "List1: %s fn:%d 0x%p\n", (h->default_ref_list[1][i].long_ref ? "LT" : "ST"), h->default_ref_list[1][i].pic_id, h->default_ref_list[1][i].f.data[0]);
} }
} }
#endif #endif
...@@ -172,9 +171,7 @@ static void print_long_term(H264Context *h); ...@@ -172,9 +171,7 @@ static void print_long_term(H264Context *h);
* described by pic_num * described by pic_num
*/ */
static int pic_num_extract(H264Context *h, int pic_num, int *structure){ static int pic_num_extract(H264Context *h, int pic_num, int *structure){
MpegEncContext * const s = &h->s; *structure = h->picture_structure;
*structure = s->picture_structure;
if(FIELD_PICTURE){ if(FIELD_PICTURE){
if (!(pic_num & 1)) if (!(pic_num & 1))
/* opposite field */ /* opposite field */
...@@ -186,7 +183,6 @@ static int pic_num_extract(H264Context *h, int pic_num, int *structure){ ...@@ -186,7 +183,6 @@ static int pic_num_extract(H264Context *h, int pic_num, int *structure){
} }
int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
MpegEncContext * const s = &h->s;
int list, index, pic_structure; int list, index, pic_structure;
print_short_term(h); print_short_term(h);
...@@ -195,11 +191,11 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -195,11 +191,11 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
for(list=0; list<h->list_count; list++){ for(list=0; list<h->list_count; list++){
memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]); memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
if(get_bits1(&s->gb)){ if(get_bits1(&h->gb)){
int pred= h->curr_pic_num; int pred= h->curr_pic_num;
for(index=0; ; index++){ for(index=0; ; index++){
unsigned int reordering_of_pic_nums_idc= get_ue_golomb_31(&s->gb); unsigned int reordering_of_pic_nums_idc= get_ue_golomb_31(&h->gb);
unsigned int pic_id; unsigned int pic_id;
int i; int i;
Picture *ref = NULL; Picture *ref = NULL;
...@@ -208,17 +204,17 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -208,17 +204,17 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
break; break;
if(index >= h->ref_count[list]){ if(index >= h->ref_count[list]){
av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflow\n"); av_log(h->avctx, AV_LOG_ERROR, "reference count overflow\n");
return -1; return -1;
} }
if(reordering_of_pic_nums_idc<3){ if(reordering_of_pic_nums_idc<3){
if(reordering_of_pic_nums_idc<2){ if(reordering_of_pic_nums_idc<2){
const unsigned int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1; const unsigned int abs_diff_pic_num= get_ue_golomb(&h->gb) + 1;
int frame_num; int frame_num;
if(abs_diff_pic_num > h->max_pic_num){ if(abs_diff_pic_num > h->max_pic_num){
av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n"); av_log(h->avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n");
return -1; return -1;
} }
...@@ -242,12 +238,12 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -242,12 +238,12 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
ref->pic_id= pred; ref->pic_id= pred;
}else{ }else{
int long_idx; int long_idx;
pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx pic_id= get_ue_golomb(&h->gb); //long_term_pic_idx
long_idx= pic_num_extract(h, pic_id, &pic_structure); long_idx= pic_num_extract(h, pic_id, &pic_structure);
if(long_idx>31){ if(long_idx>31){
av_log(h->s.avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n"); av_log(h->avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n");
return -1; return -1;
} }
ref = h->long_ref[long_idx]; ref = h->long_ref[long_idx];
...@@ -262,7 +258,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -262,7 +258,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
} }
if (i < 0) { if (i < 0) {
av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reorder\n"); av_log(h->avctx, AV_LOG_ERROR, "reference picture missing during reorder\n");
memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
} else { } else {
for(i=index; i+1<h->ref_count[list]; i++){ for(i=index; i+1<h->ref_count[list]; i++){
...@@ -278,7 +274,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -278,7 +274,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
} }
} }
}else{ }else{
av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n"); av_log(h->avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n");
return -1; return -1;
} }
} }
...@@ -288,7 +284,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ ...@@ -288,7 +284,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){
for(index= 0; index < h->ref_count[list]; index++){ for(index= 0; index < h->ref_count[list]; index++){
if (!h->ref_list[list][index].f.data[0]) { if (!h->ref_list[list][index].f.data[0]) {
int i; int i;
av_log(h->s.avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref_list[list][0].poc); av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref_list[list][0].poc);
for (i=0; i<FF_ARRAY_ELEMS(h->last_pocs); i++) for (i=0; i<FF_ARRAY_ELEMS(h->last_pocs); i++)
h->last_pocs[i] = INT_MIN; h->last_pocs[i] = INT_MIN;
if (h->default_ref_list[list][0].f.data[0]) if (h->default_ref_list[list][0].f.data[0])
...@@ -363,13 +359,12 @@ static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){ ...@@ -363,13 +359,12 @@ static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){
* frame number is found * frame number is found
*/ */
static Picture * find_short(H264Context *h, int frame_num, int *idx){ static Picture * find_short(H264Context *h, int frame_num, int *idx){
MpegEncContext * const s = &h->s;
int i; int i;
for(i=0; i<h->short_ref_count; i++){ for(i=0; i<h->short_ref_count; i++){
Picture *pic= h->short_ref[i]; Picture *pic= h->short_ref[i];
if(s->avctx->debug&FF_DEBUG_MMCO) if(h->avctx->debug&FF_DEBUG_MMCO)
av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic); av_log(h->avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
if(pic->frame_num == frame_num) { if(pic->frame_num == frame_num) {
*idx = i; *idx = i;
return pic; return pic;
...@@ -396,12 +391,11 @@ static void remove_short_at_index(H264Context *h, int i){ ...@@ -396,12 +391,11 @@ static void remove_short_at_index(H264Context *h, int i){
* @return the removed picture or NULL if an error occurs * @return the removed picture or NULL if an error occurs
*/ */
static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){ static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){
MpegEncContext * const s = &h->s;
Picture *pic; Picture *pic;
int i; int i;
if(s->avctx->debug&FF_DEBUG_MMCO) if(h->avctx->debug&FF_DEBUG_MMCO)
av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count); av_log(h->avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
pic = find_short(h, frame_num, &i); pic = find_short(h, frame_num, &i);
if (pic){ if (pic){
...@@ -456,11 +450,11 @@ void ff_h264_remove_all_refs(H264Context *h){ ...@@ -456,11 +450,11 @@ void ff_h264_remove_all_refs(H264Context *h){
*/ */
static void print_short_term(H264Context *h) { static void print_short_term(H264Context *h) {
uint32_t i; uint32_t i;
if(h->s.avctx->debug&FF_DEBUG_MMCO) { if(h->avctx->debug&FF_DEBUG_MMCO) {
av_log(h->s.avctx, AV_LOG_DEBUG, "short term list:\n"); av_log(h->avctx, AV_LOG_DEBUG, "short term list:\n");
for(i=0; i<h->short_ref_count; i++){ for(i=0; i<h->short_ref_count; i++){
Picture *pic= h->short_ref[i]; Picture *pic= h->short_ref[i];
av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", av_log(h->avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n",
i, pic->frame_num, pic->poc, pic->f.data[0]); i, pic->frame_num, pic->poc, pic->f.data[0]);
} }
} }
...@@ -471,12 +465,12 @@ static void print_short_term(H264Context *h) { ...@@ -471,12 +465,12 @@ static void print_short_term(H264Context *h) {
*/ */
static void print_long_term(H264Context *h) { static void print_long_term(H264Context *h) {
uint32_t i; uint32_t i;
if(h->s.avctx->debug&FF_DEBUG_MMCO) { if(h->avctx->debug&FF_DEBUG_MMCO) {
av_log(h->s.avctx, AV_LOG_DEBUG, "long term list:\n"); av_log(h->avctx, AV_LOG_DEBUG, "long term list:\n");
for(i = 0; i < 16; i++){ for(i = 0; i < 16; i++){
Picture *pic= h->long_ref[i]; Picture *pic= h->long_ref[i];
if (pic) { if (pic) {
av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", av_log(h->avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n",
i, pic->frame_num, pic->poc, pic->f.data[0]); i, pic->frame_num, pic->poc, pic->f.data[0]);
} }
} }
...@@ -500,14 +494,12 @@ static int check_opcodes(MMCO *mmco1, MMCO *mmco2, int n_mmcos) ...@@ -500,14 +494,12 @@ static int check_opcodes(MMCO *mmco1, MMCO *mmco2, int n_mmcos)
int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice) int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
{ {
MpegEncContext * const s = &h->s;
MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp; MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp;
int mmco_index = 0, i; int mmco_index = 0, i;
if (h->short_ref_count && if (h->short_ref_count &&
h->long_ref_count + h->short_ref_count >= h->sps.ref_frame_count && h->long_ref_count + h->short_ref_count >= h->sps.ref_frame_count &&
!(FIELD_PICTURE && !s->first_field && !(FIELD_PICTURE && !h->first_field && h->cur_pic_ptr->f.reference)) {
s->current_picture_ptr->f.reference)) {
mmco[0].opcode = MMCO_SHORT2UNUSED; mmco[0].opcode = MMCO_SHORT2UNUSED;
mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num; mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
mmco_index = 1; mmco_index = 1;
...@@ -524,7 +516,7 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice) ...@@ -524,7 +516,7 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
} else if (!first_slice && mmco_index >= 0 && } else if (!first_slice && mmco_index >= 0 &&
(mmco_index != h->mmco_index || (mmco_index != h->mmco_index ||
(i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) { (i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"Inconsistent MMCO state between slices [%d, %d]\n", "Inconsistent MMCO state between slices [%d, %d]\n",
mmco_index, h->mmco_index); mmco_index, h->mmco_index);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -533,18 +525,17 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice) ...@@ -533,18 +525,17 @@ int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
} }
int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
MpegEncContext * const s = &h->s;
int i, av_uninit(j); int i, av_uninit(j);
int current_ref_assigned=0, err=0; int current_ref_assigned=0, err=0;
Picture *av_uninit(pic); Picture *av_uninit(pic);
if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0) if((h->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0)
av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco here\n"); av_log(h->avctx, AV_LOG_DEBUG, "no mmco here\n");
for(i=0; i<mmco_count; i++){ for(i=0; i<mmco_count; i++){
int av_uninit(structure), av_uninit(frame_num); int av_uninit(structure), av_uninit(frame_num);
if(s->avctx->debug&FF_DEBUG_MMCO) if(h->avctx->debug&FF_DEBUG_MMCO)
av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_pic_num, h->mmco[i].long_arg); av_log(h->avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_pic_num, h->mmco[i].long_arg);
if( mmco[i].opcode == MMCO_SHORT2UNUSED if( mmco[i].opcode == MMCO_SHORT2UNUSED
|| mmco[i].opcode == MMCO_SHORT2LONG){ || mmco[i].opcode == MMCO_SHORT2LONG){
...@@ -553,7 +544,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -553,7 +544,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
if(!pic){ if(!pic){
if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg] if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg]
|| h->long_ref[mmco[i].long_arg]->frame_num != frame_num) { || h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
av_log(h->s.avctx, AV_LOG_ERROR, "mmco: unref short failure\n"); av_log(h->avctx, AV_LOG_ERROR, "mmco: unref short failure\n");
err = AVERROR_INVALIDDATA; err = AVERROR_INVALIDDATA;
} }
continue; continue;
...@@ -562,8 +553,8 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -562,8 +553,8 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
switch(mmco[i].opcode){ switch(mmco[i].opcode){
case MMCO_SHORT2UNUSED: case MMCO_SHORT2UNUSED:
if(s->avctx->debug&FF_DEBUG_MMCO) if(h->avctx->debug&FF_DEBUG_MMCO)
av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n", h->mmco[i].short_pic_num, h->short_ref_count); av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n", h->mmco[i].short_pic_num, h->short_ref_count);
remove_short(h, frame_num, structure ^ PICT_FRAME); remove_short(h, frame_num, structure ^ PICT_FRAME);
break; break;
case MMCO_SHORT2LONG: case MMCO_SHORT2LONG:
...@@ -582,8 +573,8 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -582,8 +573,8 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
pic = h->long_ref[j]; pic = h->long_ref[j];
if (pic) { if (pic) {
remove_long(h, j, structure ^ PICT_FRAME); remove_long(h, j, structure ^ PICT_FRAME);
} else if(s->avctx->debug&FF_DEBUG_MMCO) } else if(h->avctx->debug&FF_DEBUG_MMCO)
av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref long failure\n"); av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
break; break;
case MMCO_LONG: case MMCO_LONG:
// Comment below left from previous code as it is an interresting note. // Comment below left from previous code as it is an interresting note.
...@@ -594,15 +585,15 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -594,15 +585,15 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
* and mark this field valid. * and mark this field valid.
*/ */
if (h->long_ref[mmco[i].long_arg] != s->current_picture_ptr) { if (h->long_ref[mmco[i].long_arg] != h->cur_pic_ptr) {
remove_long(h, mmco[i].long_arg, 0); remove_long(h, mmco[i].long_arg, 0);
h->long_ref[ mmco[i].long_arg ]= s->current_picture_ptr; h->long_ref[ mmco[i].long_arg ]= h->cur_pic_ptr;
h->long_ref[ mmco[i].long_arg ]->long_ref=1; h->long_ref[ mmco[i].long_arg ]->long_ref=1;
h->long_ref_count++; h->long_ref_count++;
} }
s->current_picture_ptr->f.reference |= s->picture_structure; h->cur_pic_ptr->f.reference |= h->picture_structure;
current_ref_assigned=1; current_ref_assigned=1;
break; break;
case MMCO_SET_MAX_LONG: case MMCO_SET_MAX_LONG:
...@@ -620,9 +611,9 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -620,9 +611,9 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
remove_long(h, j, 0); remove_long(h, j, 0);
} }
h->frame_num= h->frame_num=
s->current_picture_ptr->frame_num= 0; h->cur_pic_ptr->frame_num= 0;
h->mmco_reset = 1; h->mmco_reset = 1;
s->current_picture_ptr->mmco_reset=1; h->cur_pic_ptr->mmco_reset=1;
for (j = 0; j < MAX_DELAYED_PIC_COUNT; j++) for (j = 0; j < MAX_DELAYED_PIC_COUNT; j++)
h->last_pocs[j] = INT_MIN; h->last_pocs[j] = INT_MIN;
break; break;
...@@ -637,28 +628,28 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -637,28 +628,28 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
* in long_ref; trying to put it on the short list here is an * in long_ref; trying to put it on the short list here is an
* error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3). * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
*/ */
if (h->short_ref_count && h->short_ref[0] == s->current_picture_ptr) { if (h->short_ref_count && h->short_ref[0] == h->cur_pic_ptr) {
/* Just mark the second field valid */ /* Just mark the second field valid */
s->current_picture_ptr->f.reference = PICT_FRAME; h->cur_pic_ptr->f.reference = PICT_FRAME;
} else if (s->current_picture_ptr->long_ref) { } else if (h->cur_pic_ptr->long_ref) {
av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term reference " av_log(h->avctx, AV_LOG_ERROR, "illegal short term reference "
"assignment for second field " "assignment for second field "
"in complementary field pair " "in complementary field pair "
"(first field is long term)\n"); "(first field is long term)\n");
err = AVERROR_INVALIDDATA; err = AVERROR_INVALIDDATA;
} else { } else {
pic= remove_short(h, s->current_picture_ptr->frame_num, 0); pic= remove_short(h, h->cur_pic_ptr->frame_num, 0);
if(pic){ if(pic){
av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n"); av_log(h->avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
err = AVERROR_INVALIDDATA; err = AVERROR_INVALIDDATA;
} }
if(h->short_ref_count) if(h->short_ref_count)
memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*)); memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*));
h->short_ref[0]= s->current_picture_ptr; h->short_ref[0]= h->cur_pic_ptr;
h->short_ref_count++; h->short_ref_count++;
s->current_picture_ptr->f.reference |= s->picture_structure; h->cur_pic_ptr->f.reference |= h->picture_structure;
} }
} }
...@@ -668,7 +659,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -668,7 +659,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
* stream. Need to discard one frame. Prevents overrun of the * stream. Need to discard one frame. Prevents overrun of the
* short_ref and long_ref buffers. * short_ref and long_ref buffers.
*/ */
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"number of reference frames (%d+%d) exceeds max (%d; probably " "number of reference frames (%d+%d) exceeds max (%d; probably "
"corrupt input), discarding one\n", "corrupt input), discarding one\n",
h->long_ref_count, h->short_ref_count, h->sps.ref_frame_count); h->long_ref_count, h->short_ref_count, h->sps.ref_frame_count);
...@@ -690,25 +681,24 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ ...@@ -690,25 +681,24 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
print_short_term(h); print_short_term(h);
print_long_term(h); print_long_term(h);
if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 + (s->picture_structure != PICT_FRAME) && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){ if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 + (h->picture_structure != PICT_FRAME) && h->cur_pic_ptr->f.pict_type == AV_PICTURE_TYPE_I){
s->current_picture_ptr->sync |= 1; h->cur_pic_ptr->sync |= 1;
if(!h->s.avctx->has_b_frames) if(!h->avctx->has_b_frames)
h->sync = 2; h->sync = 2;
} }
return (h->s.avctx->err_recognition & AV_EF_EXPLODE) ? err : 0; return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
} }
int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
int first_slice) int first_slice)
{ {
MpegEncContext * const s = &h->s;
int i, ret; int i, ret;
MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp; MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp;
int mmco_index = 0; int mmco_index = 0;
if (h->nal_unit_type == NAL_IDR_SLICE){ // FIXME fields if (h->nal_unit_type == NAL_IDR_SLICE){ // FIXME fields
s->broken_link = get_bits1(gb) - 1; skip_bits1(gb); // broken_link
if (get_bits1(gb)){ if (get_bits1(gb)){
mmco[0].opcode = MMCO_LONG; mmco[0].opcode = MMCO_LONG;
mmco[0].long_arg = 0; mmco[0].long_arg = 0;
...@@ -741,7 +731,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, ...@@ -741,7 +731,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
(long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG && (long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
long_arg == 16) && long_arg == 16) &&
!(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE))){ !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE))){
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"illegal long ref in memory management control " "illegal long ref in memory management control "
"operation %d\n", opcode); "operation %d\n", opcode);
return -1; return -1;
...@@ -750,7 +740,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, ...@@ -750,7 +740,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
} }
if (opcode > (unsigned) MMCO_LONG){ if (opcode > (unsigned) MMCO_LONG){
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"illegal memory management control operation %d\n", "illegal memory management control operation %d\n",
opcode); opcode);
return -1; return -1;
...@@ -762,7 +752,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, ...@@ -762,7 +752,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
} else { } else {
if (first_slice) { if (first_slice) {
ret = ff_generate_sliding_window_mmcos(h, first_slice); ret = ff_generate_sliding_window_mmcos(h, first_slice);
if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE) if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE)
return ret; return ret;
} }
mmco_index = -1; mmco_index = -1;
...@@ -774,7 +764,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, ...@@ -774,7 +764,7 @@ int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb,
} else if (!first_slice && mmco_index >= 0 && } else if (!first_slice && mmco_index >= 0 &&
(mmco_index != h->mmco_index || (mmco_index != h->mmco_index ||
(i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) { (i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"Inconsistent MMCO state between slices [%d, %d]\n", "Inconsistent MMCO state between slices [%d, %d]\n",
mmco_index, h->mmco_index); mmco_index, h->mmco_index);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
......
...@@ -45,14 +45,13 @@ void ff_h264_reset_sei(H264Context *h) { ...@@ -45,14 +45,13 @@ void ff_h264_reset_sei(H264Context *h) {
} }
static int decode_picture_timing(H264Context *h){ static int decode_picture_timing(H264Context *h){
MpegEncContext * const s = &h->s;
if(h->sps.nal_hrd_parameters_present_flag || h->sps.vcl_hrd_parameters_present_flag){ if(h->sps.nal_hrd_parameters_present_flag || h->sps.vcl_hrd_parameters_present_flag){
h->sei_cpb_removal_delay = get_bits_long(&s->gb, h->sps.cpb_removal_delay_length); h->sei_cpb_removal_delay = get_bits_long(&h->gb, h->sps.cpb_removal_delay_length);
h->sei_dpb_output_delay = get_bits_long(&s->gb, h->sps.dpb_output_delay_length); h->sei_dpb_output_delay = get_bits_long(&h->gb, h->sps.dpb_output_delay_length);
} }
if(h->sps.pic_struct_present_flag){ if(h->sps.pic_struct_present_flag){
unsigned int i, num_clock_ts; unsigned int i, num_clock_ts;
h->sei_pic_struct = get_bits(&s->gb, 4); h->sei_pic_struct = get_bits(&h->gb, 4);
h->sei_ct_type = 0; h->sei_ct_type = 0;
if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING) if (h->sei_pic_struct > SEI_PIC_STRUCT_FRAME_TRIPLING)
...@@ -61,42 +60,41 @@ static int decode_picture_timing(H264Context *h){ ...@@ -61,42 +60,41 @@ static int decode_picture_timing(H264Context *h){
num_clock_ts = sei_num_clock_ts_table[h->sei_pic_struct]; num_clock_ts = sei_num_clock_ts_table[h->sei_pic_struct];
for (i = 0 ; i < num_clock_ts ; i++){ for (i = 0 ; i < num_clock_ts ; i++){
if(get_bits(&s->gb, 1)){ /* clock_timestamp_flag */ if(get_bits(&h->gb, 1)){ /* clock_timestamp_flag */
unsigned int full_timestamp_flag; unsigned int full_timestamp_flag;
h->sei_ct_type |= 1<<get_bits(&s->gb, 2); h->sei_ct_type |= 1<<get_bits(&h->gb, 2);
skip_bits(&s->gb, 1); /* nuit_field_based_flag */ skip_bits(&h->gb, 1); /* nuit_field_based_flag */
skip_bits(&s->gb, 5); /* counting_type */ skip_bits(&h->gb, 5); /* counting_type */
full_timestamp_flag = get_bits(&s->gb, 1); full_timestamp_flag = get_bits(&h->gb, 1);
skip_bits(&s->gb, 1); /* discontinuity_flag */ skip_bits(&h->gb, 1); /* discontinuity_flag */
skip_bits(&s->gb, 1); /* cnt_dropped_flag */ skip_bits(&h->gb, 1); /* cnt_dropped_flag */
skip_bits(&s->gb, 8); /* n_frames */ skip_bits(&h->gb, 8); /* n_frames */
if(full_timestamp_flag){ if(full_timestamp_flag){
skip_bits(&s->gb, 6); /* seconds_value 0..59 */ skip_bits(&h->gb, 6); /* seconds_value 0..59 */
skip_bits(&s->gb, 6); /* minutes_value 0..59 */ skip_bits(&h->gb, 6); /* minutes_value 0..59 */
skip_bits(&s->gb, 5); /* hours_value 0..23 */ skip_bits(&h->gb, 5); /* hours_value 0..23 */
}else{ }else{
if(get_bits(&s->gb, 1)){ /* seconds_flag */ if(get_bits(&h->gb, 1)){ /* seconds_flag */
skip_bits(&s->gb, 6); /* seconds_value range 0..59 */ skip_bits(&h->gb, 6); /* seconds_value range 0..59 */
if(get_bits(&s->gb, 1)){ /* minutes_flag */ if(get_bits(&h->gb, 1)){ /* minutes_flag */
skip_bits(&s->gb, 6); /* minutes_value 0..59 */ skip_bits(&h->gb, 6); /* minutes_value 0..59 */
if(get_bits(&s->gb, 1)) /* hours_flag */ if(get_bits(&h->gb, 1)) /* hours_flag */
skip_bits(&s->gb, 5); /* hours_value 0..23 */ skip_bits(&h->gb, 5); /* hours_value 0..23 */
} }
} }
} }
if(h->sps.time_offset_length > 0) if(h->sps.time_offset_length > 0)
skip_bits(&s->gb, h->sps.time_offset_length); /* time_offset */ skip_bits(&h->gb, h->sps.time_offset_length); /* time_offset */
} }
} }
if(s->avctx->debug & FF_DEBUG_PICT_INFO) if(h->avctx->debug & FF_DEBUG_PICT_INFO)
av_log(s->avctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n", h->sei_ct_type, h->sei_pic_struct); av_log(h->avctx, AV_LOG_DEBUG, "ct_type:%X pic_struct:%d\n", h->sei_ct_type, h->sei_pic_struct);
} }
return 0; return 0;
} }
static int decode_user_data_itu_t_t35(H264Context *h, int size) { static int decode_user_data_itu_t_t35(H264Context *h, int size) {
MpegEncContext * const s = &h->s;
uint32_t user_identifier; uint32_t user_identifier;
int dtg_active_format; int dtg_active_format;
...@@ -104,28 +102,28 @@ static int decode_user_data_itu_t_t35(H264Context *h, int size) { ...@@ -104,28 +102,28 @@ static int decode_user_data_itu_t_t35(H264Context *h, int size) {
return -1; return -1;
size -= 7; size -= 7;
skip_bits(&s->gb, 8); // country_code skip_bits(&h->gb, 8); // country_code
skip_bits(&s->gb, 16); // provider_code skip_bits(&h->gb, 16); // provider_code
user_identifier = get_bits_long(&s->gb, 32); user_identifier = get_bits_long(&h->gb, 32);
switch (user_identifier) { switch (user_identifier) {
case 0x44544731: // "DTG1" - AFD_data case 0x44544731: // "DTG1" - AFD_data
if (size < 1) if (size < 1)
return -1; return -1;
skip_bits(&s->gb, 1); skip_bits(&h->gb, 1);
if (get_bits(&s->gb, 1)) { if (get_bits(&h->gb, 1)) {
skip_bits(&s->gb, 6); skip_bits(&h->gb, 6);
if (size < 2) if (size < 2)
return -1; return -1;
skip_bits(&s->gb, 4); skip_bits(&h->gb, 4);
dtg_active_format = get_bits(&s->gb, 4); dtg_active_format = get_bits(&h->gb, 4);
s->avctx->dtg_active_format = dtg_active_format; h->avctx->dtg_active_format = dtg_active_format;
} else { } else {
skip_bits(&s->gb, 6); skip_bits(&h->gb, 6);
} }
break; break;
default: default:
skip_bits(&s->gb, size * 8); skip_bits(&h->gb, size * 8);
break; break;
} }
...@@ -133,7 +131,6 @@ static int decode_user_data_itu_t_t35(H264Context *h, int size) { ...@@ -133,7 +131,6 @@ static int decode_user_data_itu_t_t35(H264Context *h, int size) {
} }
static int decode_unregistered_user_data(H264Context *h, int size){ static int decode_unregistered_user_data(H264Context *h, int size){
MpegEncContext * const s = &h->s;
uint8_t user_data[16+256]; uint8_t user_data[16+256];
int e, build, i; int e, build, i;
...@@ -141,7 +138,7 @@ static int decode_unregistered_user_data(H264Context *h, int size){ ...@@ -141,7 +138,7 @@ static int decode_unregistered_user_data(H264Context *h, int size){
return -1; return -1;
for(i=0; i<sizeof(user_data)-1 && i<size; i++){ for(i=0; i<sizeof(user_data)-1 && i<size; i++){
user_data[i]= get_bits(&s->gb, 8); user_data[i]= get_bits(&h->gb, 8);
} }
user_data[i]= 0; user_data[i]= 0;
...@@ -151,33 +148,30 @@ static int decode_unregistered_user_data(H264Context *h, int size){ ...@@ -151,33 +148,30 @@ static int decode_unregistered_user_data(H264Context *h, int size){
if(e==1 && build==1 && !strncmp(user_data+16, "x264 - core 0000", 16)) if(e==1 && build==1 && !strncmp(user_data+16, "x264 - core 0000", 16))
h->x264_build = 67; h->x264_build = 67;
if(s->avctx->debug & FF_DEBUG_BUGS) if(h->avctx->debug & FF_DEBUG_BUGS)
av_log(s->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data+16); av_log(h->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data+16);
for(; i<size; i++) for(; i<size; i++)
skip_bits(&s->gb, 8); skip_bits(&h->gb, 8);
return 0; return 0;
} }
static int decode_recovery_point(H264Context *h){ static int decode_recovery_point(H264Context *h){
MpegEncContext * const s = &h->s; h->sei_recovery_frame_cnt = get_ue_golomb(&h->gb);
skip_bits(&h->gb, 4); /* 1b exact_match_flag, 1b broken_link_flag, 2b changing_slice_group_idc */
h->sei_recovery_frame_cnt = get_ue_golomb(&s->gb);
skip_bits(&s->gb, 4); /* 1b exact_match_flag, 1b broken_link_flag, 2b changing_slice_group_idc */
return 0; return 0;
} }
static int decode_buffering_period(H264Context *h){ static int decode_buffering_period(H264Context *h){
MpegEncContext * const s = &h->s;
unsigned int sps_id; unsigned int sps_id;
int sched_sel_idx; int sched_sel_idx;
SPS *sps; SPS *sps;
sps_id = get_ue_golomb_31(&s->gb); sps_id = get_ue_golomb_31(&h->gb);
if(sps_id > 31 || !h->sps_buffers[sps_id]) { if(sps_id > 31 || !h->sps_buffers[sps_id]) {
av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS %d referenced in buffering period\n", sps_id); av_log(h->avctx, AV_LOG_ERROR, "non-existing SPS %d referenced in buffering period\n", sps_id);
return -1; return -1;
} }
sps = h->sps_buffers[sps_id]; sps = h->sps_buffers[sps_id];
...@@ -185,14 +179,14 @@ static int decode_buffering_period(H264Context *h){ ...@@ -185,14 +179,14 @@ static int decode_buffering_period(H264Context *h){
// NOTE: This is really so duplicated in the standard... See H.264, D.1.1 // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
if (sps->nal_hrd_parameters_present_flag) { if (sps->nal_hrd_parameters_present_flag) {
for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) { for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
h->initial_cpb_removal_delay[sched_sel_idx] = get_bits_long(&s->gb, sps->initial_cpb_removal_delay_length); h->initial_cpb_removal_delay[sched_sel_idx] = get_bits_long(&h->gb, sps->initial_cpb_removal_delay_length);
skip_bits(&s->gb, sps->initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset skip_bits(&h->gb, sps->initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset
} }
} }
if (sps->vcl_hrd_parameters_present_flag) { if (sps->vcl_hrd_parameters_present_flag) {
for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) { for (sched_sel_idx = 0; sched_sel_idx < sps->cpb_cnt; sched_sel_idx++) {
h->initial_cpb_removal_delay[sched_sel_idx] = get_bits_long(&s->gb, sps->initial_cpb_removal_delay_length); h->initial_cpb_removal_delay[sched_sel_idx] = get_bits_long(&h->gb, sps->initial_cpb_removal_delay_length);
skip_bits(&s->gb, sps->initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset skip_bits(&h->gb, sps->initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset
} }
} }
...@@ -201,27 +195,25 @@ static int decode_buffering_period(H264Context *h){ ...@@ -201,27 +195,25 @@ static int decode_buffering_period(H264Context *h){
} }
int ff_h264_decode_sei(H264Context *h){ int ff_h264_decode_sei(H264Context *h){
MpegEncContext * const s = &h->s; while (get_bits_left(&h->gb) > 16) {
while (get_bits_left(&s->gb) > 16) {
int size, type; int size, type;
type=0; type=0;
do{ do{
if (get_bits_left(&s->gb) < 8) if (get_bits_left(&h->gb) < 8)
return -1; return -1;
type+= show_bits(&s->gb, 8); type+= show_bits(&h->gb, 8);
}while(get_bits(&s->gb, 8) == 255); }while(get_bits(&h->gb, 8) == 255);
size=0; size=0;
do{ do{
if (get_bits_left(&s->gb) < 8) if (get_bits_left(&h->gb) < 8)
return -1; return -1;
size+= show_bits(&s->gb, 8); size+= show_bits(&h->gb, 8);
}while(get_bits(&s->gb, 8) == 255); }while(get_bits(&h->gb, 8) == 255);
if(s->avctx->debug&FF_DEBUG_STARTCODE) if(h->avctx->debug&FF_DEBUG_STARTCODE)
av_log(h->s.avctx, AV_LOG_DEBUG, "SEI %d len:%d\n", type, size); av_log(h->avctx, AV_LOG_DEBUG, "SEI %d len:%d\n", type, size);
switch(type){ switch(type){
case SEI_TYPE_PIC_TIMING: // Picture timing SEI case SEI_TYPE_PIC_TIMING: // Picture timing SEI
...@@ -245,11 +237,11 @@ int ff_h264_decode_sei(H264Context *h){ ...@@ -245,11 +237,11 @@ int ff_h264_decode_sei(H264Context *h){
return -1; return -1;
break; break;
default: default:
skip_bits(&s->gb, 8*size); skip_bits(&h->gb, 8*size);
} }
//FIXME check bits here //FIXME check bits here
align_get_bits(&s->gb); align_get_bits(&h->gb);
} }
return 0; return 0;
......
...@@ -410,8 +410,6 @@ static void pred8x8_tm_vp8_c(uint8_t *src, ptrdiff_t stride) ...@@ -410,8 +410,6 @@ static void pred8x8_tm_vp8_c(uint8_t *src, ptrdiff_t stride)
void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth, void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth,
int chroma_format_idc) int chroma_format_idc)
{ {
// MpegEncContext * const s = &h->s;
#undef FUNC #undef FUNC
#undef FUNCC #undef FUNCC
#define FUNC(a, depth) a ## _ ## depth #define FUNC(a, depth) a ## _ ## depth
......
...@@ -143,7 +143,7 @@ typedef struct Picture{ ...@@ -143,7 +143,7 @@ typedef struct Picture{
uint16_t *mc_mb_var; ///< Table for motion compensated MB variances uint16_t *mc_mb_var; ///< Table for motion compensated MB variances
uint8_t *mb_mean; ///< Table for MB luminance uint8_t *mb_mean; ///< Table for MB luminance
int b_frame_score; /* */ int b_frame_score; /* */
struct MpegEncContext *owner2; ///< pointer to the MpegEncContext that allocated this picture void *owner2; ///< pointer to the context that allocated this picture
int needs_realloc; ///< Picture needs to be reallocated (eg due to a frame size change) int needs_realloc; ///< Picture needs to be reallocated (eg due to a frame size change)
int period_since_free; ///< "cycles" since this Picture has been freed int period_since_free; ///< "cycles" since this Picture has been freed
} Picture; } Picture;
......
...@@ -66,6 +66,9 @@ ...@@ -66,6 +66,9 @@
typedef struct { typedef struct {
H264Context h; H264Context h;
Picture *cur_pic;
Picture *next_pic;
Picture *last_pic;
int halfpel_flag; int halfpel_flag;
int thirdpel_flag; int thirdpel_flag;
int unknown_flag; int unknown_flag;
...@@ -73,6 +76,11 @@ typedef struct { ...@@ -73,6 +76,11 @@ typedef struct {
uint32_t watermark_key; uint32_t watermark_key;
uint8_t *buf; uint8_t *buf;
int buf_size; int buf_size;
int adaptive_quant;
int next_p_frame_damaged;
int h_edge_pos;
int v_edge_pos;
int last_frame_output;
} SVQ3Context; } SVQ3Context;
#define FULLPEL_MODE 1 #define FULLPEL_MODE 1
...@@ -271,12 +279,13 @@ static inline int svq3_decode_block(GetBitContext *gb, int16_t *block, ...@@ -271,12 +279,13 @@ static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
return 0; return 0;
} }
static inline void svq3_mc_dir_part(MpegEncContext *s, static inline void svq3_mc_dir_part(SVQ3Context *s,
int x, int y, int width, int height, int x, int y, int width, int height,
int mx, int my, int dxy, int mx, int my, int dxy,
int thirdpel, int dir, int avg) int thirdpel, int dir, int avg)
{ {
const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture; H264Context *h = &s->h;
const Picture *pic = (dir == 0) ? s->last_pic : s->next_pic;
uint8_t *src, *dest; uint8_t *src, *dest;
int i, emu = 0; int i, emu = 0;
int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
...@@ -286,7 +295,7 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, ...@@ -286,7 +295,7 @@ static inline void svq3_mc_dir_part(MpegEncContext *s,
if (mx < 0 || mx >= s->h_edge_pos - width - 1 || if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
my < 0 || my >= s->v_edge_pos - height - 1) { my < 0 || my >= s->v_edge_pos - height - 1) {
if ((s->flags & CODEC_FLAG_EMU_EDGE)) if ((h->flags & CODEC_FLAG_EMU_EDGE))
emu = 1; emu = 1;
mx = av_clip(mx, -16, s->h_edge_pos - width + 15); mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
...@@ -294,25 +303,25 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, ...@@ -294,25 +303,25 @@ static inline void svq3_mc_dir_part(MpegEncContext *s,
} }
/* form component predictions */ /* form component predictions */
dest = s->current_picture.f.data[0] + x + y * s->linesize; dest = h->cur_pic.f.data[0] + x + y * h->linesize;
src = pic->f.data[0] + mx + my * s->linesize; src = pic->f.data[0] + mx + my * h->linesize;
if (emu) { if (emu) {
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src, h->linesize,
width + 1, height + 1, width + 1, height + 1,
mx, my, s->h_edge_pos, s->v_edge_pos); mx, my, s->h_edge_pos, s->v_edge_pos);
src = s->edge_emu_buffer; src = h->edge_emu_buffer;
} }
if (thirdpel) if (thirdpel)
(avg ? s->dsp.avg_tpel_pixels_tab (avg ? h->dsp.avg_tpel_pixels_tab
: s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, : h->dsp.put_tpel_pixels_tab)[dxy](dest, src, h->linesize,
width, height); width, height);
else else
(avg ? s->dsp.avg_pixels_tab (avg ? h->dsp.avg_pixels_tab
: s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, : h->dsp.put_pixels_tab)[blocksize][dxy](dest, src, h->linesize,
height); height);
if (!(s->flags & CODEC_FLAG_GRAY)) { if (!(h->flags & CODEC_FLAG_GRAY)) {
mx = mx + (mx < (int) x) >> 1; mx = mx + (mx < (int) x) >> 1;
my = my + (my < (int) y) >> 1; my = my + (my < (int) y) >> 1;
width = width >> 1; width = width >> 1;
...@@ -320,35 +329,35 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, ...@@ -320,35 +329,35 @@ static inline void svq3_mc_dir_part(MpegEncContext *s,
blocksize++; blocksize++;
for (i = 1; i < 3; i++) { for (i = 1; i < 3; i++) {
dest = s->current_picture.f.data[i] + (x >> 1) + (y >> 1) * s->uvlinesize; dest = h->cur_pic.f.data[i] + (x >> 1) + (y >> 1) * h->uvlinesize;
src = pic->f.data[i] + mx + my * s->uvlinesize; src = pic->f.data[i] + mx + my * h->uvlinesize;
if (emu) { if (emu) {
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src, h->uvlinesize,
width + 1, height + 1, width + 1, height + 1,
mx, my, (s->h_edge_pos >> 1), mx, my, (s->h_edge_pos >> 1),
s->v_edge_pos >> 1); s->v_edge_pos >> 1);
src = s->edge_emu_buffer; src = h->edge_emu_buffer;
} }
if (thirdpel) if (thirdpel)
(avg ? s->dsp.avg_tpel_pixels_tab (avg ? h->dsp.avg_tpel_pixels_tab
: s->dsp.put_tpel_pixels_tab)[dxy](dest, src, : h->dsp.put_tpel_pixels_tab)[dxy](dest, src,
s->uvlinesize, h->uvlinesize,
width, height); width, height);
else else
(avg ? s->dsp.avg_pixels_tab (avg ? h->dsp.avg_pixels_tab
: s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, : h->dsp.put_pixels_tab)[blocksize][dxy](dest, src,
s->uvlinesize, h->uvlinesize,
height); height);
} }
} }
} }
static inline int svq3_mc_dir(H264Context *h, int size, int mode, static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
int dir, int avg) int dir, int avg)
{ {
int i, j, k, mx, my, dx, dy, x, y; int i, j, k, mx, my, dx, dy, x, y;
MpegEncContext *const s = (MpegEncContext *)h; H264Context *h = &s->h;
const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1); const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
const int part_height = 16 >> ((unsigned)(size + 1) / 3); const int part_height = 16 >> ((unsigned)(size + 1) / 3);
const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0; const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
...@@ -357,19 +366,19 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, ...@@ -357,19 +366,19 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode,
for (i = 0; i < 16; i += part_height) for (i = 0; i < 16; i += part_height)
for (j = 0; j < 16; j += part_width) { for (j = 0; j < 16; j += part_width) {
const int b_xy = (4 * s->mb_x + (j >> 2)) + const int b_xy = (4 * h->mb_x + (j >> 2)) +
(4 * s->mb_y + (i >> 2)) * h->b_stride; (4 * h->mb_y + (i >> 2)) * h->b_stride;
int dxy; int dxy;
x = 16 * s->mb_x + j; x = 16 * h->mb_x + j;
y = 16 * s->mb_y + i; y = 16 * h->mb_y + i;
k = (j >> 2 & 1) + (i >> 1 & 2) + k = (j >> 2 & 1) + (i >> 1 & 2) +
(j >> 1 & 4) + (i & 8); (j >> 1 & 4) + (i & 8);
if (mode != PREDICT_MODE) { if (mode != PREDICT_MODE) {
pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my); pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
} else { } else {
mx = s->next_picture.f.motion_val[0][b_xy][0] << 1; mx = s->next_pic->f.motion_val[0][b_xy][0] << 1;
my = s->next_picture.f.motion_val[0][b_xy][1] << 1; my = s->next_pic->f.motion_val[0][b_xy][1] << 1;
if (dir == 0) { if (dir == 0) {
mx = mx * h->frame_num_offset / mx = mx * h->frame_num_offset /
...@@ -392,11 +401,11 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, ...@@ -392,11 +401,11 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode,
if (mode == PREDICT_MODE) { if (mode == PREDICT_MODE) {
dx = dy = 0; dx = dy = 0;
} else { } else {
dy = svq3_get_se_golomb(&s->gb); dy = svq3_get_se_golomb(&h->gb);
dx = svq3_get_se_golomb(&s->gb); dx = svq3_get_se_golomb(&h->gb);
if (dx == INVALID_VLC || dy == INVALID_VLC) { if (dx == INVALID_VLC || dy == INVALID_VLC) {
av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n"); av_log(h->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
return -1; return -1;
} }
} }
...@@ -450,7 +459,7 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, ...@@ -450,7 +459,7 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode,
} }
/* write back motion vectors */ /* write back motion vectors */
fill_rectangle(s->current_picture.f.motion_val[dir][b_xy], fill_rectangle(h->cur_pic.f.motion_val[dir][b_xy],
part_width >> 2, part_height >> 2, h->b_stride, part_width >> 2, part_height >> 2, h->b_stride,
pack16to32(mx, my), 4); pack16to32(mx, my), 4);
} }
...@@ -458,46 +467,45 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, ...@@ -458,46 +467,45 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode,
return 0; return 0;
} }
static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
{ {
H264Context *h = &svq3->h; H264Context *h = &s->h;
int i, j, k, m, dir, mode; int i, j, k, m, dir, mode;
int cbp = 0; int cbp = 0;
uint32_t vlc; uint32_t vlc;
int8_t *top, *left; int8_t *top, *left;
MpegEncContext *const s = (MpegEncContext *)h;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
const int b_xy = 4 * s->mb_x + 4 * s->mb_y * h->b_stride; const int b_xy = 4 * h->mb_x + 4 * h->mb_y * h->b_stride;
h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; h->top_samples_available = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; h->left_samples_available = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
h->topright_samples_available = 0xFFFF; h->topright_samples_available = 0xFFFF;
if (mb_type == 0) { /* SKIP */ if (mb_type == 0) { /* SKIP */
if (s->pict_type == AV_PICTURE_TYPE_P || if (h->pict_type == AV_PICTURE_TYPE_P ||
s->next_picture.f.mb_type[mb_xy] == -1) { s->next_pic->f.mb_type[mb_xy] == -1) {
svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16, svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0);
if (s->pict_type == AV_PICTURE_TYPE_B) if (h->pict_type == AV_PICTURE_TYPE_B)
svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16, svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
0, 0, 0, 0, 1, 1); 0, 0, 0, 0, 1, 1);
mb_type = MB_TYPE_SKIP; mb_type = MB_TYPE_SKIP;
} else { } else {
mb_type = FFMIN(s->next_picture.f.mb_type[mb_xy], 6); mb_type = FFMIN(s->next_pic->f.mb_type[mb_xy], 6);
if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 0, 0) < 0) if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
return -1; return -1;
if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 1, 1) < 0) if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
return -1; return -1;
mb_type = MB_TYPE_16x16; mb_type = MB_TYPE_16x16;
} }
} else if (mb_type < 8) { /* INTER */ } else if (mb_type < 8) { /* INTER */
if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1(&s->gb)) if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&h->gb))
mode = THIRDPEL_MODE; mode = THIRDPEL_MODE;
else if (svq3->halfpel_flag && else if (s->halfpel_flag &&
svq3->thirdpel_flag == !get_bits1(&s->gb)) s->thirdpel_flag == !get_bits1(&h->gb))
mode = HALFPEL_MODE; mode = HALFPEL_MODE;
else else
mode = FULLPEL_MODE; mode = FULLPEL_MODE;
...@@ -512,63 +520,63 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -512,63 +520,63 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
*/ */
for (m = 0; m < 2; m++) { for (m = 0; m < 2; m++) {
if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) { if (h->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i * 8], AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i * 8],
s->current_picture.f.motion_val[m][b_xy - 1 + i * h->b_stride]); h->cur_pic.f.motion_val[m][b_xy - 1 + i * h->b_stride]);
} else { } else {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i * 8]); AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i * 8]);
} }
if (s->mb_y > 0) { if (h->mb_y > 0) {
memcpy(h->mv_cache[m][scan8[0] - 1 * 8], memcpy(h->mv_cache[m][scan8[0] - 1 * 8],
s->current_picture.f.motion_val[m][b_xy - h->b_stride], h->cur_pic.f.motion_val[m][b_xy - h->b_stride],
4 * 2 * sizeof(int16_t)); 4 * 2 * sizeof(int16_t));
memset(&h->ref_cache[m][scan8[0] - 1 * 8], memset(&h->ref_cache[m][scan8[0] - 1 * 8],
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4); (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
if (s->mb_x < s->mb_width - 1) { if (h->mb_x < h->mb_width - 1) {
AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8], AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8],
s->current_picture.f.motion_val[m][b_xy - h->b_stride + 4]); h->cur_pic.f.motion_val[m][b_xy - h->b_stride + 4]);
h->ref_cache[m][scan8[0] + 4 - 1 * 8] = h->ref_cache[m][scan8[0] + 4 - 1 * 8] =
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 || (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride + 1] + 6] == -1 ||
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1; h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
} else } else
h->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE; h->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
if (s->mb_x > 0) { if (h->mb_x > 0) {
AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1 * 8], AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1 * 8],
s->current_picture.f.motion_val[m][b_xy - h->b_stride - 1]); h->cur_pic.f.motion_val[m][b_xy - h->b_stride - 1]);
h->ref_cache[m][scan8[0] - 1 - 1 * 8] = h->ref_cache[m][scan8[0] - 1 - 1 * 8] =
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1; (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
} else } else
h->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE; h->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
} else } else
memset(&h->ref_cache[m][scan8[0] - 1 * 8 - 1], memset(&h->ref_cache[m][scan8[0] - 1 * 8 - 1],
PART_NOT_AVAILABLE, 8); PART_NOT_AVAILABLE, 8);
if (s->pict_type != AV_PICTURE_TYPE_B) if (h->pict_type != AV_PICTURE_TYPE_B)
break; break;
} }
/* decode motion vector(s) and form prediction(s) */ /* decode motion vector(s) and form prediction(s) */
if (s->pict_type == AV_PICTURE_TYPE_P) { if (h->pict_type == AV_PICTURE_TYPE_P) {
if (svq3_mc_dir(h, mb_type - 1, mode, 0, 0) < 0) if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
return -1; return -1;
} else { /* AV_PICTURE_TYPE_B */ } else { /* AV_PICTURE_TYPE_B */
if (mb_type != 2) { if (mb_type != 2) {
if (svq3_mc_dir(h, 0, mode, 0, 0) < 0) if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
return -1; return -1;
} else { } else {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
memset(s->current_picture.f.motion_val[0][b_xy + i * h->b_stride], memset(h->cur_pic.f.motion_val[0][b_xy + i * h->b_stride],
0, 4 * 2 * sizeof(int16_t)); 0, 4 * 2 * sizeof(int16_t));
} }
if (mb_type != 1) { if (mb_type != 1) {
if (svq3_mc_dir(h, 0, mode, 1, mb_type == 3) < 0) if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
return -1; return -1;
} else { } else {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
memset(s->current_picture.f.motion_val[1][b_xy + i * h->b_stride], memset(h->cur_pic.f.motion_val[1][b_xy + i * h->b_stride],
0, 4 * 2 * sizeof(int16_t)); 0, 4 * 2 * sizeof(int16_t));
} }
} }
...@@ -578,17 +586,17 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -578,17 +586,17 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
memset(h->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t)); memset(h->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
if (mb_type == 8) { if (mb_type == 8) {
if (s->mb_x > 0) { if (h->mb_x > 0) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
h->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i]; h->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i];
if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
h->left_samples_available = 0x5F5F; h->left_samples_available = 0x5F5F;
} }
if (s->mb_y > 0) { if (h->mb_y > 0) {
h->intra4x4_pred_mode_cache[4 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 0]; h->intra4x4_pred_mode_cache[4 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 0];
h->intra4x4_pred_mode_cache[5 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 1]; h->intra4x4_pred_mode_cache[5 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 1];
h->intra4x4_pred_mode_cache[6 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 2]; h->intra4x4_pred_mode_cache[6 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 2];
h->intra4x4_pred_mode_cache[7 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride] + 3]; h->intra4x4_pred_mode_cache[7 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 3];
if (h->intra4x4_pred_mode_cache[4 + 8 * 0] == -1) if (h->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
h->top_samples_available = 0x33FF; h->top_samples_available = 0x33FF;
...@@ -596,10 +604,10 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -596,10 +604,10 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
/* decode prediction codes for luma blocks */ /* decode prediction codes for luma blocks */
for (i = 0; i < 16; i += 2) { for (i = 0; i < 16; i += 2) {
vlc = svq3_get_ue_golomb(&s->gb); vlc = svq3_get_ue_golomb(&h->gb);
if (vlc >= 25U) { if (vlc >= 25U) {
av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc); av_log(h->avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
return -1; return -1;
} }
...@@ -610,7 +618,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -610,7 +618,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
if (left[1] == -1 || left[2] == -1) { if (left[1] == -1 || left[2] == -1) {
av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n"); av_log(h->avctx, AV_LOG_ERROR, "weird prediction\n");
return -1; return -1;
} }
} }
...@@ -624,8 +632,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -624,8 +632,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
if (mb_type == 8) { if (mb_type == 8) {
ff_h264_check_intra4x4_pred_mode(h); ff_h264_check_intra4x4_pred_mode(h);
h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; h->top_samples_available = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; h->left_samples_available = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
} else { } else {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4); memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
...@@ -640,7 +648,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -640,7 +648,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1; dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1) { if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1) {
av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n"); av_log(h->avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
return -1; return -1;
} }
...@@ -648,29 +656,29 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -648,29 +656,29 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
mb_type = MB_TYPE_INTRA16x16; mb_type = MB_TYPE_INTRA16x16;
} }
if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) { if (!IS_INTER(mb_type) && h->pict_type != AV_PICTURE_TYPE_I) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
memset(s->current_picture.f.motion_val[0][b_xy + i * h->b_stride], memset(h->cur_pic.f.motion_val[0][b_xy + i * h->b_stride],
0, 4 * 2 * sizeof(int16_t)); 0, 4 * 2 * sizeof(int16_t));
if (s->pict_type == AV_PICTURE_TYPE_B) { if (h->pict_type == AV_PICTURE_TYPE_B) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
memset(s->current_picture.f.motion_val[1][b_xy + i * h->b_stride], memset(h->cur_pic.f.motion_val[1][b_xy + i * h->b_stride],
0, 4 * 2 * sizeof(int16_t)); 0, 4 * 2 * sizeof(int16_t));
} }
} }
if (!IS_INTRA4x4(mb_type)) { if (!IS_INTRA4x4(mb_type)) {
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8); memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8);
} }
if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) { if (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B) {
memset(h->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t)); memset(h->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
s->dsp.clear_blocks(h->mb + 0); h->dsp.clear_blocks(h->mb + 0);
s->dsp.clear_blocks(h->mb + 384); h->dsp.clear_blocks(h->mb + 384);
} }
if (!IS_INTRA16x16(mb_type) && if (!IS_INTRA16x16(mb_type) &&
(!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) { (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B)) {
if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48U){ if ((vlc = svq3_get_ue_golomb(&h->gb)) >= 48U){
av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc); av_log(h->avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
return -1; return -1;
} }
...@@ -678,19 +686,19 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -678,19 +686,19 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
: golomb_to_inter_cbp[vlc]; : golomb_to_inter_cbp[vlc];
} }
if (IS_INTRA16x16(mb_type) || if (IS_INTRA16x16(mb_type) ||
(s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) { (h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
s->qscale += svq3_get_se_golomb(&s->gb); h->qscale += svq3_get_se_golomb(&h->gb);
if (s->qscale > 31u) { if (h->qscale > 31u) {
av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale); av_log(h->avctx, AV_LOG_ERROR, "qscale:%d\n", h->qscale);
return -1; return -1;
} }
} }
if (IS_INTRA16x16(mb_type)) { if (IS_INTRA16x16(mb_type)) {
AV_ZERO128(h->mb_luma_dc[0] + 0); AV_ZERO128(h->mb_luma_dc[0] + 0);
AV_ZERO128(h->mb_luma_dc[0] + 8); AV_ZERO128(h->mb_luma_dc[0] + 8);
if (svq3_decode_block(&s->gb, h->mb_luma_dc[0], 0, 1)) { if (svq3_decode_block(&h->gb, h->mb_luma_dc[0], 0, 1)) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"error while decoding intra luma dc\n"); "error while decoding intra luma dc\n");
return -1; return -1;
} }
...@@ -698,7 +706,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -698,7 +706,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
if (cbp) { if (cbp) {
const int index = IS_INTRA16x16(mb_type) ? 1 : 0; const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1); const int type = ((h->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
if ((cbp & (1 << i))) { if ((cbp & (1 << i))) {
...@@ -708,8 +716,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -708,8 +716,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
: (4 * i + j); : (4 * i + j);
h->non_zero_count_cache[scan8[k]] = 1; h->non_zero_count_cache[scan8[k]] = 1;
if (svq3_decode_block(&s->gb, &h->mb[16 * k], index, type)) { if (svq3_decode_block(&h->gb, &h->mb[16 * k], index, type)) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"error while decoding block\n"); "error while decoding block\n");
return -1; return -1;
} }
...@@ -718,8 +726,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -718,8 +726,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
if ((cbp & 0x30)) { if ((cbp & 0x30)) {
for (i = 1; i < 3; ++i) for (i = 1; i < 3; ++i)
if (svq3_decode_block(&s->gb, &h->mb[16 * 16 * i], 0, 3)) { if (svq3_decode_block(&h->gb, &h->mb[16 * 16 * i], 0, 3)) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"error while decoding chroma dc block\n"); "error while decoding chroma dc block\n");
return -1; return -1;
} }
...@@ -730,8 +738,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -730,8 +738,8 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
k = 16 * i + j; k = 16 * i + j;
h->non_zero_count_cache[scan8[k]] = 1; h->non_zero_count_cache[scan8[k]] = 1;
if (svq3_decode_block(&s->gb, &h->mb[16 * k], 1, 1)) { if (svq3_decode_block(&h->gb, &h->mb[16 * k], 1, 1)) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"error while decoding chroma ac block\n"); "error while decoding chroma ac block\n");
return -1; return -1;
} }
...@@ -742,7 +750,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -742,7 +750,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
} }
h->cbp = cbp; h->cbp = cbp;
s->current_picture.f.mb_type[mb_xy] = mb_type; h->cur_pic.f.mb_type[mb_xy] = mb_type;
if (IS_INTRA(mb_type)) if (IS_INTRA(mb_type))
h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1); h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
...@@ -752,14 +760,13 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) ...@@ -752,14 +760,13 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
static int svq3_decode_slice_header(AVCodecContext *avctx) static int svq3_decode_slice_header(AVCodecContext *avctx)
{ {
SVQ3Context *svq3 = avctx->priv_data; SVQ3Context *s = avctx->priv_data;
H264Context *h = &svq3->h; H264Context *h = &s->h;
MpegEncContext *s = &h->s;
const int mb_xy = h->mb_xy; const int mb_xy = h->mb_xy;
int i, header; int i, header;
unsigned slice_id; unsigned slice_id;
header = get_bits(&s->gb, 8); header = get_bits(&h->gb, 8);
if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) { if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
/* TODO: what? */ /* TODO: what? */
...@@ -768,75 +775,75 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) ...@@ -768,75 +775,75 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
} else { } else {
int length = header >> 5 & 3; int length = header >> 5 & 3;
svq3->next_slice_index = get_bits_count(&s->gb) + s->next_slice_index = get_bits_count(&h->gb) +
8 * show_bits(&s->gb, 8 * length) + 8 * show_bits(&h->gb, 8 * length) +
8 * length; 8 * length;
if (svq3->next_slice_index > s->gb.size_in_bits) { if (s->next_slice_index > h->gb.size_in_bits) {
av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n"); av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
return -1; return -1;
} }
s->gb.size_in_bits = svq3->next_slice_index - 8 * (length - 1); h->gb.size_in_bits = s->next_slice_index - 8 * (length - 1);
skip_bits(&s->gb, 8); skip_bits(&h->gb, 8);
if (svq3->watermark_key) { if (s->watermark_key) {
uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb) >> 3) + 1]); uint32_t header = AV_RL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1]);
AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb) >> 3) + 1], AV_WL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1],
header ^ svq3->watermark_key); header ^ s->watermark_key);
} }
if (length > 0) { if (length > 0) {
memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3], memcpy((uint8_t *) &h->gb.buffer[get_bits_count(&h->gb) >> 3],
&s->gb.buffer[s->gb.size_in_bits >> 3], length - 1); &h->gb.buffer[h->gb.size_in_bits >> 3], length - 1);
} }
skip_bits_long(&s->gb, 0); skip_bits_long(&h->gb, 0);
} }
if ((slice_id = svq3_get_ue_golomb(&s->gb)) >= 3) { if ((slice_id = svq3_get_ue_golomb(&h->gb)) >= 3) {
av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", slice_id); av_log(h->avctx, AV_LOG_ERROR, "illegal slice type %d \n", slice_id);
return -1; return -1;
} }
h->slice_type = golomb_to_pict_type[slice_id]; h->slice_type = golomb_to_pict_type[slice_id];
if ((header & 0x9F) == 2) { if ((header & 0x9F) == 2) {
i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1)); i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1));
s->mb_skip_run = get_bits(&s->gb, i) - h->mb_skip_run = get_bits(&h->gb, i) -
(s->mb_y * s->mb_width + s->mb_x); (h->mb_y * h->mb_width + h->mb_x);
} else { } else {
skip_bits1(&s->gb); skip_bits1(&h->gb);
s->mb_skip_run = 0; h->mb_skip_run = 0;
} }
h->slice_num = get_bits(&s->gb, 8); h->slice_num = get_bits(&h->gb, 8);
s->qscale = get_bits(&s->gb, 5); h->qscale = get_bits(&h->gb, 5);
s->adaptive_quant = get_bits1(&s->gb); s->adaptive_quant = get_bits1(&h->gb);
/* unknown fields */ /* unknown fields */
skip_bits1(&s->gb); skip_bits1(&h->gb);
if (svq3->unknown_flag) if (s->unknown_flag)
skip_bits1(&s->gb); skip_bits1(&h->gb);
skip_bits1(&s->gb); skip_bits1(&h->gb);
skip_bits(&s->gb, 2); skip_bits(&h->gb, 2);
while (get_bits1(&s->gb)) while (get_bits1(&h->gb))
skip_bits(&s->gb, 8); skip_bits(&h->gb, 8);
/* reset intra predictors and invalidate motion vector references */ /* reset intra predictors and invalidate motion vector references */
if (s->mb_x > 0) { if (h->mb_x > 0) {
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3, memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3,
-1, 4 * sizeof(int8_t)); -1, 4 * sizeof(int8_t));
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - s->mb_x], memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_x],
-1, 8 * sizeof(int8_t) * s->mb_x); -1, 8 * sizeof(int8_t) * h->mb_x);
} }
if (s->mb_y > 0) { if (h->mb_y > 0) {
memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - s->mb_stride], memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_stride],
-1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x)); -1, 8 * sizeof(int8_t) * (h->mb_width - h->mb_x));
if (s->mb_x > 0) if (h->mb_x > 0)
h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1; h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] = -1;
} }
return 0; return 0;
...@@ -844,30 +851,39 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) ...@@ -844,30 +851,39 @@ static int svq3_decode_slice_header(AVCodecContext *avctx)
static av_cold int svq3_decode_init(AVCodecContext *avctx) static av_cold int svq3_decode_init(AVCodecContext *avctx)
{ {
SVQ3Context *svq3 = avctx->priv_data; SVQ3Context *s = avctx->priv_data;
H264Context *h = &svq3->h; H264Context *h = &s->h;
MpegEncContext *s = &h->s;
int m; int m;
unsigned char *extradata; unsigned char *extradata;
unsigned char *extradata_end; unsigned char *extradata_end;
unsigned int size; unsigned int size;
int marker_found = 0; int marker_found = 0;
s->cur_pic = av_mallocz(sizeof(*s->cur_pic));
s->last_pic = av_mallocz(sizeof(*s->last_pic));
s->next_pic = av_mallocz(sizeof(*s->next_pic));
if (!s->next_pic || !s->last_pic || !s->cur_pic) {
av_freep(&s->cur_pic);
av_freep(&s->last_pic);
av_freep(&s->next_pic);
return AVERROR(ENOMEM);
}
if (ff_h264_decode_init(avctx) < 0) if (ff_h264_decode_init(avctx) < 0)
return -1; return -1;
s->flags = avctx->flags; h->flags = avctx->flags;
s->flags2 = avctx->flags2;
s->unrestricted_mv = 1;
h->is_complex = 1; h->is_complex = 1;
h->sps.chroma_format_idc = 1; h->sps.chroma_format_idc = 1;
h->picture_structure = PICT_FRAME;
avctx->pix_fmt = avctx->codec->pix_fmts[0]; avctx->pix_fmt = avctx->codec->pix_fmts[0];
h->chroma_qp[0] = h->chroma_qp[1] = 4; h->chroma_qp[0] = h->chroma_qp[1] = 4;
h->chroma_x_shift = h->chroma_y_shift = 1;
svq3->halfpel_flag = 1; s->halfpel_flag = 1;
svq3->thirdpel_flag = 1; s->thirdpel_flag = 1;
svq3->unknown_flag = 0; s->unknown_flag = 0;
/* prowl for the "SEQH" marker in the extradata */ /* prowl for the "SEQH" marker in the extradata */
extradata = (unsigned char *)avctx->extradata; extradata = (unsigned char *)avctx->extradata;
...@@ -929,8 +945,8 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -929,8 +945,8 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
break; break;
} }
svq3->halfpel_flag = get_bits1(&gb); s->halfpel_flag = get_bits1(&gb);
svq3->thirdpel_flag = get_bits1(&gb); s->thirdpel_flag = get_bits1(&gb);
/* unknown fields */ /* unknown fields */
skip_bits1(&gb); skip_bits1(&gb);
...@@ -938,7 +954,7 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -938,7 +954,7 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
skip_bits1(&gb); skip_bits1(&gb);
skip_bits1(&gb); skip_bits1(&gb);
s->low_delay = get_bits1(&gb); h->low_delay = get_bits1(&gb);
/* unknown field */ /* unknown field */
skip_bits1(&gb); skip_bits1(&gb);
...@@ -946,9 +962,9 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -946,9 +962,9 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
while (get_bits1(&gb)) while (get_bits1(&gb))
skip_bits(&gb, 8); skip_bits(&gb, 8);
svq3->unknown_flag = get_bits1(&gb); s->unknown_flag = get_bits1(&gb);
avctx->has_b_frames = !s->low_delay; avctx->has_b_frames = !h->low_delay;
if (svq3->unknown_flag) { if (s->unknown_flag) {
#if CONFIG_ZLIB #if CONFIG_ZLIB
unsigned watermark_width = svq3_get_ue_golomb(&gb); unsigned watermark_width = svq3_get_ue_golomb(&gb);
unsigned watermark_height = svq3_get_ue_golomb(&gb); unsigned watermark_height = svq3_get_ue_golomb(&gb);
...@@ -977,11 +993,10 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -977,11 +993,10 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
av_free(buf); av_free(buf);
return -1; return -1;
} }
svq3->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0); s->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
svq3->watermark_key = svq3->watermark_key << 16 | s->watermark_key = s->watermark_key << 16 | s->watermark_key;
svq3->watermark_key;
av_log(avctx, AV_LOG_DEBUG, av_log(avctx, AV_LOG_DEBUG,
"watermark key %#x\n", svq3->watermark_key); "watermark key %#x\n", s->watermark_key);
av_free(buf); av_free(buf);
#else #else
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
...@@ -991,13 +1006,15 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -991,13 +1006,15 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
} }
} }
s->width = avctx->width; h->width = avctx->width;
s->height = avctx->height; h->height = avctx->height;
h->mb_width = (h->width + 15) / 16;
if (ff_MPV_common_init(s) < 0) h->mb_height = (h->height + 15) / 16;
return -1; h->mb_stride = h->mb_width + 1;
h->mb_num = h->mb_width * h->mb_height;
h->b_stride = 4 * s->mb_width; h->b_stride = 4 * h->mb_width;
s->h_edge_pos = h->mb_width * 16;
s->v_edge_pos = h->mb_height * 16;
if (ff_h264_alloc_tables(h) < 0) { if (ff_h264_alloc_tables(h) < 0) {
av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n"); av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n");
...@@ -1007,84 +1024,165 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -1007,84 +1024,165 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
return 0; return 0;
} }
static int get_buffer(AVCodecContext *avctx, Picture *pic)
{
SVQ3Context *s = avctx->priv_data;
H264Context *h = &s->h;
const int big_mb_num = h->mb_stride * (h->mb_height + 1) + 1;
const int mb_array_size = h->mb_stride * h->mb_height;
const int b4_stride = h->mb_width * 4 + 1;
const int b4_array_size = b4_stride * h->mb_height * 4;
int ret;
if (!pic->motion_val_base[0]) {
int i;
pic->mb_type_base = av_mallocz((big_mb_num + h->mb_stride) * sizeof(uint32_t));
if (!pic->mb_type_base)
return AVERROR(ENOMEM);
pic->f.mb_type = pic->mb_type_base + 2 * h->mb_stride + 1;
for (i = 0; i < 2; i++) {
pic->motion_val_base[i] = av_mallocz(2 * (b4_array_size + 4) * sizeof(int16_t));
pic->f.ref_index[i] = av_mallocz(4 * mb_array_size);
if (!pic->motion_val_base[i] || !pic->f.ref_index[i])
return AVERROR(ENOMEM);
pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
}
}
pic->f.motion_subsample_log2 = 2;
pic->f.reference = !(h->pict_type == AV_PICTURE_TYPE_B);
ret = ff_get_buffer(avctx, &pic->f);
h->linesize = pic->f.linesize[0];
h->uvlinesize = pic->f.linesize[1];
return ret;
}
static int svq3_decode_frame(AVCodecContext *avctx, void *data, static int svq3_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame, AVPacket *avpkt) int *got_frame, AVPacket *avpkt)
{ {
SVQ3Context *svq3 = avctx->priv_data; SVQ3Context *s = avctx->priv_data;
H264Context *h = &svq3->h; H264Context *h = &s->h;
MpegEncContext *s = &h->s;
int buf_size = avpkt->size; int buf_size = avpkt->size;
int m, left; int left;
uint8_t *buf; uint8_t *buf;
int ret, m, i;
/* special case for last picture */ /* special case for last picture */
if (buf_size == 0) { if (buf_size == 0) {
if (s->next_picture_ptr && !s->low_delay) { if (s->next_pic->f.data[0] && !h->low_delay && !s->last_frame_output) {
*(AVFrame *) data = s->next_picture.f; *(AVFrame *) data = s->next_pic->f;
s->next_picture_ptr = NULL; s->last_frame_output = 1;
*got_frame = 1; *got_frame = 1;
} }
return 0; return 0;
} }
s->mb_x = s->mb_y = h->mb_xy = 0; h->mb_x = h->mb_y = h->mb_xy = 0;
if (svq3->watermark_key) { if (s->watermark_key) {
av_fast_malloc(&svq3->buf, &svq3->buf_size, av_fast_malloc(&s->buf, &s->buf_size,
buf_size+FF_INPUT_BUFFER_PADDING_SIZE); buf_size+FF_INPUT_BUFFER_PADDING_SIZE);
if (!svq3->buf) if (!s->buf)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
memcpy(svq3->buf, avpkt->data, buf_size); memcpy(s->buf, avpkt->data, buf_size);
buf = svq3->buf; buf = s->buf;
} else { } else {
buf = avpkt->data; buf = avpkt->data;
} }
init_get_bits(&s->gb, buf, 8 * buf_size); init_get_bits(&h->gb, buf, 8 * buf_size);
if (svq3_decode_slice_header(avctx)) if (svq3_decode_slice_header(avctx))
return -1; return -1;
s->pict_type = h->slice_type; h->pict_type = h->slice_type;
s->picture_number = h->slice_num;
if (avctx->debug & FF_DEBUG_PICT_INFO) if (h->pict_type != AV_PICTURE_TYPE_B)
av_log(h->s.avctx, AV_LOG_DEBUG, FFSWAP(Picture*, s->next_pic, s->last_pic);
"%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
av_get_picture_type_char(s->pict_type), if (s->cur_pic->f.data[0])
svq3->halfpel_flag, svq3->thirdpel_flag, avctx->release_buffer(avctx, &s->cur_pic->f);
s->adaptive_quant, s->qscale, h->slice_num);
/* for skipping the frame */ /* for skipping the frame */
s->current_picture.f.pict_type = s->pict_type; s->cur_pic->f.pict_type = h->pict_type;
s->current_picture.f.key_frame = (s->pict_type == AV_PICTURE_TYPE_I); s->cur_pic->f.key_frame = (h->pict_type == AV_PICTURE_TYPE_I);
/* Skip B-frames if we do not have reference frames. */ ret = get_buffer(avctx, s->cur_pic);
if (s->last_picture_ptr == NULL && s->pict_type == AV_PICTURE_TYPE_B) if (ret < 0)
return 0; return ret;
if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I || h->cur_pic_ptr = s->cur_pic;
h->cur_pic = *s->cur_pic;
for (i = 0; i < 16; i++) {
h->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
h->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
}
for (i = 0; i < 16; i++) {
h->block_offset[16 + i] =
h->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
h->block_offset[48 + 16 + i] =
h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
}
if (h->pict_type != AV_PICTURE_TYPE_I) {
if (!s->last_pic->f.data[0]) {
av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
ret = get_buffer(avctx, s->last_pic);
if (ret < 0)
return ret;
memset(s->last_pic->f.data[0], 0, avctx->height * s->last_pic->f.linesize[0]);
memset(s->last_pic->f.data[1], 0x80, (avctx->height / 2) *
s->last_pic->f.linesize[1]);
memset(s->last_pic->f.data[2], 0x80, (avctx->height / 2) *
s->last_pic->f.linesize[2]);
}
if (h->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f.data[0]) {
av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
ret = get_buffer(avctx, s->next_pic);
if (ret < 0)
return ret;
memset(s->next_pic->f.data[0], 0, avctx->height * s->next_pic->f.linesize[0]);
memset(s->next_pic->f.data[1], 0x80, (avctx->height / 2) *
s->next_pic->f.linesize[1]);
memset(s->next_pic->f.data[2], 0x80, (avctx->height / 2) *
s->next_pic->f.linesize[2]);
}
}
if (avctx->debug & FF_DEBUG_PICT_INFO)
av_log(h->avctx, AV_LOG_DEBUG,
"%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
av_get_picture_type_char(h->pict_type),
s->halfpel_flag, s->thirdpel_flag,
s->adaptive_quant, h->qscale, h->slice_num);
if (avctx->skip_frame >= AVDISCARD_NONREF && h->pict_type == AV_PICTURE_TYPE_B ||
avctx->skip_frame >= AVDISCARD_NONKEY && h->pict_type != AV_PICTURE_TYPE_I ||
avctx->skip_frame >= AVDISCARD_ALL) avctx->skip_frame >= AVDISCARD_ALL)
return 0; return 0;
if (s->next_p_frame_damaged) { if (s->next_p_frame_damaged) {
if (s->pict_type == AV_PICTURE_TYPE_B) if (h->pict_type == AV_PICTURE_TYPE_B)
return 0; return 0;
else else
s->next_p_frame_damaged = 0; s->next_p_frame_damaged = 0;
} }
if (ff_h264_frame_start(h) < 0) if (h->pict_type == AV_PICTURE_TYPE_B) {
return -1;
if (s->pict_type == AV_PICTURE_TYPE_B) {
h->frame_num_offset = h->slice_num - h->prev_frame_num; h->frame_num_offset = h->slice_num - h->prev_frame_num;
if (h->frame_num_offset < 0) if (h->frame_num_offset < 0)
h->frame_num_offset += 256; h->frame_num_offset += 256;
if (h->frame_num_offset == 0 || if (h->frame_num_offset == 0 ||
h->frame_num_offset >= h->prev_frame_num_offset) { h->frame_num_offset >= h->prev_frame_num_offset) {
av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n"); av_log(h->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
return -1; return -1;
} }
} else { } else {
...@@ -1107,16 +1205,16 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1107,16 +1205,16 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
} }
} }
for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { for (h->mb_y = 0; h->mb_y < h->mb_height; h->mb_y++) {
for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { for (h->mb_x = 0; h->mb_x < h->mb_width; h->mb_x++) {
unsigned mb_type; unsigned mb_type;
h->mb_xy = s->mb_x + s->mb_y * s->mb_stride; h->mb_xy = h->mb_x + h->mb_y * h->mb_stride;
if ((get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits && if ((get_bits_count(&h->gb) + 7) >= h->gb.size_in_bits &&
((get_bits_count(&s->gb) & 7) == 0 || ((get_bits_count(&h->gb) & 7) == 0 ||
show_bits(&s->gb, -get_bits_count(&s->gb) & 7) == 0)) { show_bits(&h->gb, -get_bits_count(&h->gb) & 7) == 0)) {
skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb)); skip_bits(&h->gb, s->next_slice_index - get_bits_count(&h->gb));
s->gb.size_in_bits = 8 * buf_size; h->gb.size_in_bits = 8 * buf_size;
if (svq3_decode_slice_header(avctx)) if (svq3_decode_slice_header(avctx))
return -1; return -1;
...@@ -1124,33 +1222,35 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1124,33 +1222,35 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
/* TODO: support s->mb_skip_run */ /* TODO: support s->mb_skip_run */
} }
mb_type = svq3_get_ue_golomb(&s->gb); mb_type = svq3_get_ue_golomb(&h->gb);
if (s->pict_type == AV_PICTURE_TYPE_I) if (h->pict_type == AV_PICTURE_TYPE_I)
mb_type += 8; mb_type += 8;
else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4) else if (h->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
mb_type += 4; mb_type += 4;
if (mb_type > 33 || svq3_decode_mb(svq3, mb_type)) { if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
av_log(h->s.avctx, AV_LOG_ERROR, av_log(h->avctx, AV_LOG_ERROR,
"error while decoding MB %d %d\n", s->mb_x, s->mb_y); "error while decoding MB %d %d\n", h->mb_x, h->mb_y);
return -1; return -1;
} }
if (mb_type != 0) if (mb_type != 0)
ff_h264_hl_decode_mb(h); ff_h264_hl_decode_mb(h);
if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay) if (h->pict_type != AV_PICTURE_TYPE_B && !h->low_delay)
s->current_picture.f.mb_type[s->mb_x + s->mb_y * s->mb_stride] = h->cur_pic.f.mb_type[h->mb_x + h->mb_y * h->mb_stride] =
(s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1; (h->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
} }
ff_mpeg_draw_horiz_band(s, 16 * s->mb_y, 16); ff_draw_horiz_band(avctx, &h->dsp, s->cur_pic, s->last_pic->f.data[0] ? s->last_pic : NULL,
16 * h->mb_y, 16, h->picture_structure, 0, 1,
h->low_delay, h->mb_height * 16, h->mb_width * 16);
} }
left = buf_size*8 - get_bits_count(&s->gb); left = buf_size*8 - get_bits_count(&h->gb);
if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) { if (h->mb_y != h->mb_height || h->mb_x != h->mb_width) {
av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, s->mb_y, s->mb_x, left); av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, h->mb_y, h->mb_x, left);
//av_hex_dump(stderr, buf+buf_size-8, 8); //av_hex_dump(stderr, buf+buf_size-8, 8);
} }
...@@ -1159,32 +1259,49 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, ...@@ -1159,32 +1259,49 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data,
return -1; return -1;
} }
ff_MPV_frame_end(s); if (h->pict_type == AV_PICTURE_TYPE_B || h->low_delay)
*(AVFrame *)data = s->cur_pic->f;
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
*(AVFrame *)data = s->current_picture.f;
else else
*(AVFrame *)data = s->last_picture.f; *(AVFrame *)data = s->last_pic->f;
/* Do not output the last pic after seeking. */ /* Do not output the last pic after seeking. */
if (s->last_picture_ptr || s->low_delay) if (s->last_pic->f.data[0] || h->low_delay)
*got_frame = 1; *got_frame = 1;
if (h->pict_type != AV_PICTURE_TYPE_B) {
FFSWAP(Picture*, s->cur_pic, s->next_pic);
}
return buf_size; return buf_size;
} }
static void free_picture(AVCodecContext *avctx, Picture *pic)
{
int i;
for (i = 0; i < 2; i++) {
av_freep(&pic->motion_val_base[i]);
av_freep(&pic->f.ref_index[i]);
}
av_freep(&pic->mb_type_base);
if (pic->f.data[0])
avctx->release_buffer(avctx, &pic->f);
av_freep(&pic);
}
static int svq3_decode_end(AVCodecContext *avctx) static int svq3_decode_end(AVCodecContext *avctx)
{ {
SVQ3Context *svq3 = avctx->priv_data; SVQ3Context *s = avctx->priv_data;
H264Context *h = &svq3->h; H264Context *h = &s->h;
MpegEncContext *s = &h->s;
ff_h264_free_context(h); free_picture(avctx, s->cur_pic);
free_picture(avctx, s->next_pic);
free_picture(avctx, s->last_pic);
ff_MPV_common_end(s); ff_h264_free_context(h);
av_freep(&svq3->buf); av_freep(&s->buf);
svq3->buf_size = 0; s->buf_size = 0;
return 0; return 0;
} }
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "h264.h"
#include "vaapi_internal.h" #include "vaapi_internal.h"
/** /**
...@@ -40,7 +41,7 @@ static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int ...@@ -40,7 +41,7 @@ static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int
} }
} }
static int render_picture(struct vaapi_context *vactx, VASurfaceID surface) int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface)
{ {
VABufferID va_buffers[3]; VABufferID va_buffers[3];
unsigned int n_va_buffers = 0; unsigned int n_va_buffers = 0;
...@@ -77,7 +78,7 @@ static int render_picture(struct vaapi_context *vactx, VASurfaceID surface) ...@@ -77,7 +78,7 @@ static int render_picture(struct vaapi_context *vactx, VASurfaceID surface)
return 0; return 0;
} }
static int commit_slices(struct vaapi_context *vactx) int ff_vaapi_commit_slices(struct vaapi_context *vactx)
{ {
VABufferID *slice_buf_ids; VABufferID *slice_buf_ids;
VABufferID slice_param_buf_id, slice_data_buf_id; VABufferID slice_param_buf_id, slice_data_buf_id;
...@@ -152,7 +153,7 @@ VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, co ...@@ -152,7 +153,7 @@ VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, co
if (!vactx->slice_data) if (!vactx->slice_data)
vactx->slice_data = buffer; vactx->slice_data = buffer;
if (vactx->slice_data + vactx->slice_data_size != buffer) { if (vactx->slice_data + vactx->slice_data_size != buffer) {
if (commit_slices(vactx) < 0) if (ff_vaapi_commit_slices(vactx) < 0)
return NULL; return NULL;
vactx->slice_data = buffer; vactx->slice_data = buffer;
} }
...@@ -175,23 +176,12 @@ VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, co ...@@ -175,23 +176,12 @@ VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, co
return slice_param; return slice_param;
} }
int ff_vaapi_common_end_frame(MpegEncContext *s) void ff_vaapi_common_end_frame(AVCodecContext *avctx)
{ {
struct vaapi_context * const vactx = s->avctx->hwaccel_context; struct vaapi_context * const vactx = avctx->hwaccel_context;
int ret = -1;
av_dlog(s->avctx, "ff_vaapi_common_end_frame()\n"); av_dlog(avctx, "ff_vaapi_common_end_frame()\n");
if (commit_slices(vactx) < 0)
goto done;
if (vactx->n_slice_buf_ids > 0) {
if (render_picture(vactx, ff_vaapi_get_surface_id(s->current_picture_ptr)) < 0)
goto done;
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
}
ret = 0;
done:
destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1); destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1); destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1); destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
...@@ -202,6 +192,27 @@ done: ...@@ -202,6 +192,27 @@ done:
vactx->slice_buf_ids_alloc = 0; vactx->slice_buf_ids_alloc = 0;
vactx->slice_count = 0; vactx->slice_count = 0;
vactx->slice_params_alloc = 0; vactx->slice_params_alloc = 0;
}
int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx)
{
struct vaapi_context * const vactx = avctx->hwaccel_context;
MpegEncContext *s = avctx->priv_data;
int ret;
ret = ff_vaapi_commit_slices(vactx);
if (ret < 0)
goto finish;
ret = ff_vaapi_render_picture(vactx,
ff_vaapi_get_surface_id(s->current_picture_ptr));
if (ret < 0)
goto finish;
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
finish:
ff_vaapi_common_end_frame(avctx->priv_data);
return ret; return ret;
} }
......
...@@ -224,7 +224,6 @@ static int start_frame(AVCodecContext *avctx, ...@@ -224,7 +224,6 @@ static int start_frame(AVCodecContext *avctx,
av_unused uint32_t size) av_unused uint32_t size)
{ {
H264Context * const h = avctx->priv_data; H264Context * const h = avctx->priv_data;
MpegEncContext * const s = &h->s;
struct vaapi_context * const vactx = avctx->hwaccel_context; struct vaapi_context * const vactx = avctx->hwaccel_context;
VAPictureParameterBufferH264 *pic_param; VAPictureParameterBufferH264 *pic_param;
VAIQMatrixBufferH264 *iq_matrix; VAIQMatrixBufferH264 *iq_matrix;
...@@ -237,11 +236,11 @@ static int start_frame(AVCodecContext *avctx, ...@@ -237,11 +236,11 @@ static int start_frame(AVCodecContext *avctx,
pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferH264)); pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferH264));
if (!pic_param) if (!pic_param)
return -1; return -1;
fill_vaapi_pic(&pic_param->CurrPic, s->current_picture_ptr, s->picture_structure); fill_vaapi_pic(&pic_param->CurrPic, h->cur_pic_ptr, h->picture_structure);
if (fill_vaapi_ReferenceFrames(pic_param, h) < 0) if (fill_vaapi_ReferenceFrames(pic_param, h) < 0)
return -1; return -1;
pic_param->picture_width_in_mbs_minus1 = s->mb_width - 1; pic_param->picture_width_in_mbs_minus1 = h->mb_width - 1;
pic_param->picture_height_in_mbs_minus1 = s->mb_height - 1; pic_param->picture_height_in_mbs_minus1 = h->mb_height - 1;
pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8; pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8; pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
pic_param->num_ref_frames = h->sps.ref_frame_count; pic_param->num_ref_frames = h->sps.ref_frame_count;
...@@ -269,7 +268,7 @@ static int start_frame(AVCodecContext *avctx, ...@@ -269,7 +268,7 @@ static int start_frame(AVCodecContext *avctx,
pic_param->pic_fields.bits.weighted_pred_flag = h->pps.weighted_pred; pic_param->pic_fields.bits.weighted_pred_flag = h->pps.weighted_pred;
pic_param->pic_fields.bits.weighted_bipred_idc = h->pps.weighted_bipred_idc; pic_param->pic_fields.bits.weighted_bipred_idc = h->pps.weighted_bipred_idc;
pic_param->pic_fields.bits.transform_8x8_mode_flag = h->pps.transform_8x8_mode; pic_param->pic_fields.bits.transform_8x8_mode_flag = h->pps.transform_8x8_mode;
pic_param->pic_fields.bits.field_pic_flag = s->picture_structure != PICT_FRAME; pic_param->pic_fields.bits.field_pic_flag = h->picture_structure != PICT_FRAME;
pic_param->pic_fields.bits.constrained_intra_pred_flag = h->pps.constrained_intra_pred; pic_param->pic_fields.bits.constrained_intra_pred_flag = h->pps.constrained_intra_pred;
pic_param->pic_fields.bits.pic_order_present_flag = h->pps.pic_order_present; pic_param->pic_fields.bits.pic_order_present_flag = h->pps.pic_order_present;
pic_param->pic_fields.bits.deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present; pic_param->pic_fields.bits.deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present;
...@@ -290,10 +289,24 @@ static int start_frame(AVCodecContext *avctx, ...@@ -290,10 +289,24 @@ static int start_frame(AVCodecContext *avctx,
/** End a hardware decoding based frame. */ /** End a hardware decoding based frame. */
static int end_frame(AVCodecContext *avctx) static int end_frame(AVCodecContext *avctx)
{ {
struct vaapi_context * const vactx = avctx->hwaccel_context;
H264Context * const h = avctx->priv_data; H264Context * const h = avctx->priv_data;
int ret;
av_dlog(avctx, "end_frame()\n"); av_dlog(avctx, "end_frame()\n");
return ff_vaapi_common_end_frame(&h->s); ret = ff_vaapi_commit_slices(vactx);
if (ret < 0)
goto finish;
ret = ff_vaapi_render_picture(vactx, ff_vaapi_get_surface_id(h->cur_pic_ptr));
if (ret < 0)
goto finish;
ff_h264_draw_horiz_band(h, 0, h->avctx->height);
finish:
ff_vaapi_common_end_frame(avctx);
return ret;
} }
/** Decode the given H.264 slice with VA API. */ /** Decode the given H.264 slice with VA API. */
...@@ -302,7 +315,6 @@ static int decode_slice(AVCodecContext *avctx, ...@@ -302,7 +315,6 @@ static int decode_slice(AVCodecContext *avctx,
uint32_t size) uint32_t size)
{ {
H264Context * const h = avctx->priv_data; H264Context * const h = avctx->priv_data;
MpegEncContext * const s = &h->s;
VASliceParameterBufferH264 *slice_param; VASliceParameterBufferH264 *slice_param;
av_dlog(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size); av_dlog(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size);
...@@ -311,14 +323,14 @@ static int decode_slice(AVCodecContext *avctx, ...@@ -311,14 +323,14 @@ static int decode_slice(AVCodecContext *avctx,
slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size); slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
if (!slice_param) if (!slice_param)
return -1; return -1;
slice_param->slice_data_bit_offset = get_bits_count(&h->s.gb) + 8; /* bit buffer started beyond nal_unit_type */ slice_param->slice_data_bit_offset = get_bits_count(&h->gb) + 8; /* bit buffer started beyond nal_unit_type */
slice_param->first_mb_in_slice = (s->mb_y >> FIELD_OR_MBAFF_PICTURE) * s->mb_width + s->mb_x; slice_param->first_mb_in_slice = (h->mb_y >> FIELD_OR_MBAFF_PICTURE) * h->mb_width + h->mb_x;
slice_param->slice_type = ff_h264_get_slice_type(h); slice_param->slice_type = ff_h264_get_slice_type(h);
slice_param->direct_spatial_mv_pred_flag = h->slice_type == AV_PICTURE_TYPE_B ? h->direct_spatial_mv_pred : 0; slice_param->direct_spatial_mv_pred_flag = h->slice_type == AV_PICTURE_TYPE_B ? h->direct_spatial_mv_pred : 0;
slice_param->num_ref_idx_l0_active_minus1 = h->list_count > 0 ? h->ref_count[0] - 1 : 0; slice_param->num_ref_idx_l0_active_minus1 = h->list_count > 0 ? h->ref_count[0] - 1 : 0;
slice_param->num_ref_idx_l1_active_minus1 = h->list_count > 1 ? h->ref_count[1] - 1 : 0; slice_param->num_ref_idx_l1_active_minus1 = h->list_count > 1 ? h->ref_count[1] - 1 : 0;
slice_param->cabac_init_idc = h->cabac_init_idc; slice_param->cabac_init_idc = h->cabac_init_idc;
slice_param->slice_qp_delta = s->qscale - h->pps.init_qp; slice_param->slice_qp_delta = h->qscale - h->pps.init_qp;
slice_param->disable_deblocking_filter_idc = h->deblocking_filter < 2 ? !h->deblocking_filter : h->deblocking_filter; slice_param->disable_deblocking_filter_idc = h->deblocking_filter < 2 ? !h->deblocking_filter : h->deblocking_filter;
slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2 - 26; slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2 - 26;
slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2 - 26; slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2 - 26;
......
...@@ -42,7 +42,7 @@ static inline VASurfaceID ff_vaapi_get_surface_id(Picture *pic) ...@@ -42,7 +42,7 @@ static inline VASurfaceID ff_vaapi_get_surface_id(Picture *pic)
} }
/** Common AVHWAccel.end_frame() implementation */ /** Common AVHWAccel.end_frame() implementation */
int ff_vaapi_common_end_frame(MpegEncContext *s); void ff_vaapi_common_end_frame(AVCodecContext *avctx);
/** Allocate a new picture parameter buffer */ /** Allocate a new picture parameter buffer */
void *ff_vaapi_alloc_pic_param(struct vaapi_context *vactx, unsigned int size); void *ff_vaapi_alloc_pic_param(struct vaapi_context *vactx, unsigned int size);
...@@ -63,6 +63,10 @@ uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size); ...@@ -63,6 +63,10 @@ uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size);
*/ */
VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size); VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size);
int ff_vaapi_mpeg_end_frame(AVCodecContext *avctx);
int ff_vaapi_commit_slices(struct vaapi_context *vactx);
int ff_vaapi_render_picture(struct vaapi_context *vactx, VASurfaceID surface);
/* @} */ /* @} */
#endif /* AVCODEC_VAAPI_INTERNAL_H */ #endif /* AVCODEC_VAAPI_INTERNAL_H */
...@@ -99,11 +99,6 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_ ...@@ -99,11 +99,6 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_
return 0; return 0;
} }
static int vaapi_mpeg2_end_frame(AVCodecContext *avctx)
{
return ff_vaapi_common_end_frame(avctx->priv_data);
}
static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
{ {
MpegEncContext * const s = avctx->priv_data; MpegEncContext * const s = avctx->priv_data;
...@@ -144,6 +139,6 @@ AVHWAccel ff_mpeg2_vaapi_hwaccel = { ...@@ -144,6 +139,6 @@ AVHWAccel ff_mpeg2_vaapi_hwaccel = {
.id = AV_CODEC_ID_MPEG2VIDEO, .id = AV_CODEC_ID_MPEG2VIDEO,
.pix_fmt = AV_PIX_FMT_VAAPI_VLD, .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
.start_frame = vaapi_mpeg2_start_frame, .start_frame = vaapi_mpeg2_start_frame,
.end_frame = vaapi_mpeg2_end_frame, .end_frame = ff_vaapi_mpeg_end_frame,
.decode_slice = vaapi_mpeg2_decode_slice, .decode_slice = vaapi_mpeg2_decode_slice,
}; };
...@@ -115,11 +115,6 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_ ...@@ -115,11 +115,6 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_
return 0; return 0;
} }
static int vaapi_mpeg4_end_frame(AVCodecContext *avctx)
{
return ff_vaapi_common_end_frame(avctx->priv_data);
}
static int vaapi_mpeg4_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) static int vaapi_mpeg4_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
{ {
MpegEncContext * const s = avctx->priv_data; MpegEncContext * const s = avctx->priv_data;
...@@ -156,7 +151,7 @@ AVHWAccel ff_mpeg4_vaapi_hwaccel = { ...@@ -156,7 +151,7 @@ AVHWAccel ff_mpeg4_vaapi_hwaccel = {
.id = AV_CODEC_ID_MPEG4, .id = AV_CODEC_ID_MPEG4,
.pix_fmt = AV_PIX_FMT_VAAPI_VLD, .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
.start_frame = vaapi_mpeg4_start_frame, .start_frame = vaapi_mpeg4_start_frame,
.end_frame = vaapi_mpeg4_end_frame, .end_frame = ff_vaapi_mpeg_end_frame,
.decode_slice = vaapi_mpeg4_decode_slice, .decode_slice = vaapi_mpeg4_decode_slice,
}; };
#endif #endif
...@@ -168,7 +163,7 @@ AVHWAccel ff_h263_vaapi_hwaccel = { ...@@ -168,7 +163,7 @@ AVHWAccel ff_h263_vaapi_hwaccel = {
.id = AV_CODEC_ID_H263, .id = AV_CODEC_ID_H263,
.pix_fmt = AV_PIX_FMT_VAAPI_VLD, .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
.start_frame = vaapi_mpeg4_start_frame, .start_frame = vaapi_mpeg4_start_frame,
.end_frame = vaapi_mpeg4_end_frame, .end_frame = ff_vaapi_mpeg_end_frame,
.decode_slice = vaapi_mpeg4_decode_slice, .decode_slice = vaapi_mpeg4_decode_slice,
}; };
#endif #endif
...@@ -310,13 +310,6 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t ...@@ -310,13 +310,6 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t
return 0; return 0;
} }
static int vaapi_vc1_end_frame(AVCodecContext *avctx)
{
VC1Context * const v = avctx->priv_data;
return ff_vaapi_common_end_frame(&v->s);
}
static int vaapi_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) static int vaapi_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size)
{ {
VC1Context * const v = avctx->priv_data; VC1Context * const v = avctx->priv_data;
...@@ -347,7 +340,7 @@ AVHWAccel ff_wmv3_vaapi_hwaccel = { ...@@ -347,7 +340,7 @@ AVHWAccel ff_wmv3_vaapi_hwaccel = {
.id = AV_CODEC_ID_WMV3, .id = AV_CODEC_ID_WMV3,
.pix_fmt = AV_PIX_FMT_VAAPI_VLD, .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
.start_frame = vaapi_vc1_start_frame, .start_frame = vaapi_vc1_start_frame,
.end_frame = vaapi_vc1_end_frame, .end_frame = ff_vaapi_mpeg_end_frame,
.decode_slice = vaapi_vc1_decode_slice, .decode_slice = vaapi_vc1_decode_slice,
}; };
#endif #endif
...@@ -358,6 +351,6 @@ AVHWAccel ff_vc1_vaapi_hwaccel = { ...@@ -358,6 +351,6 @@ AVHWAccel ff_vc1_vaapi_hwaccel = {
.id = AV_CODEC_ID_VC1, .id = AV_CODEC_ID_VC1,
.pix_fmt = AV_PIX_FMT_VAAPI_VLD, .pix_fmt = AV_PIX_FMT_VAAPI_VLD,
.start_frame = vaapi_vc1_start_frame, .start_frame = vaapi_vc1_start_frame,
.end_frame = vaapi_vc1_end_frame, .end_frame = ff_vaapi_mpeg_end_frame,
.decode_slice = vaapi_vc1_decode_slice, .decode_slice = vaapi_vc1_decode_slice,
}; };
...@@ -243,7 +243,7 @@ static int end_frame(AVCodecContext *avctx) ...@@ -243,7 +243,7 @@ static int end_frame(AVCodecContext *avctx)
{ {
H264Context *h = avctx->priv_data; H264Context *h = avctx->priv_data;
struct vda_context *vda_ctx = avctx->hwaccel_context; struct vda_context *vda_ctx = avctx->hwaccel_context;
AVFrame *frame = &h->s.current_picture_ptr->f; AVFrame *frame = &h->cur_pic_ptr->f;
int status; int status;
if (!vda_ctx->decoder || !vda_ctx->priv_bitstream) if (!vda_ctx->decoder || !vda_ctx->priv_bitstream)
......
...@@ -48,20 +48,18 @@ int ff_vdpau_common_start_frame(AVCodecContext *avctx, ...@@ -48,20 +48,18 @@ int ff_vdpau_common_start_frame(AVCodecContext *avctx,
return 0; return 0;
} }
int ff_vdpau_common_end_frame(AVCodecContext *avctx) int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx)
{ {
MpegEncContext * const s = avctx->priv_data;
AVVDPAUContext *hwctx = avctx->hwaccel_context; AVVDPAUContext *hwctx = avctx->hwaccel_context;
MpegEncContext *s = avctx->priv_data;
VdpVideoSurface surf = ff_vdpau_get_surface_id(s->current_picture_ptr);
if (hwctx->bitstream_buffers_used) { hwctx->render(hwctx->decoder, surf, (void *)&hwctx->info,
VdpVideoSurface surf = ff_vdpau_get_surface_id(s->current_picture_ptr); hwctx->bitstream_buffers_used, hwctx->bitstream_buffers);
hwctx->render(hwctx->decoder, surf, (void *)&hwctx->info, ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
hwctx->bitstream_buffers_used, hwctx->bitstream_buffers); hwctx->bitstream_buffers_used = 0;
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
hwctx->bitstream_buffers_used = 0;
}
return 0; return 0;
} }
...@@ -87,15 +85,14 @@ int ff_vdpau_add_buffer(AVCodecContext *avctx, ...@@ -87,15 +85,14 @@ int ff_vdpau_add_buffer(AVCodecContext *avctx,
/* Obsolete non-hwaccel VDPAU support below... */ /* Obsolete non-hwaccel VDPAU support below... */
void ff_vdpau_h264_set_reference_frames(MpegEncContext *s) void ff_vdpau_h264_set_reference_frames(H264Context *h)
{ {
H264Context *h = s->avctx->priv_data;
struct vdpau_render_state *render, *render_ref; struct vdpau_render_state *render, *render_ref;
VdpReferenceFrameH264 *rf, *rf2; VdpReferenceFrameH264 *rf, *rf2;
Picture *pic; Picture *pic;
int i, list, pic_frame_idx; int i, list, pic_frame_idx;
render = (struct vdpau_render_state *)s->current_picture_ptr->f.data[0]; render = (struct vdpau_render_state *)h->cur_pic_ptr->f.data[0];
assert(render); assert(render);
rf = &render->info.h264.referenceFrames[0]; rf = &render->info.h264.referenceFrames[0];
...@@ -156,12 +153,9 @@ void ff_vdpau_h264_set_reference_frames(MpegEncContext *s) ...@@ -156,12 +153,9 @@ void ff_vdpau_h264_set_reference_frames(MpegEncContext *s)
} }
} }
void ff_vdpau_add_data_chunk(MpegEncContext *s, void ff_vdpau_add_data_chunk(uint8_t *data, const uint8_t *buf, int buf_size)
const uint8_t *buf, int buf_size)
{ {
struct vdpau_render_state *render; struct vdpau_render_state *render = (struct vdpau_render_state*)data;
render = (struct vdpau_render_state *)s->current_picture_ptr->f.data[0];
assert(render); assert(render);
render->bitstream_buffers= av_fast_realloc( render->bitstream_buffers= av_fast_realloc(
...@@ -176,17 +170,16 @@ void ff_vdpau_add_data_chunk(MpegEncContext *s, ...@@ -176,17 +170,16 @@ void ff_vdpau_add_data_chunk(MpegEncContext *s,
render->bitstream_buffers_used++; render->bitstream_buffers_used++;
} }
void ff_vdpau_h264_picture_start(MpegEncContext *s) void ff_vdpau_h264_picture_start(H264Context *h)
{ {
H264Context *h = s->avctx->priv_data;
struct vdpau_render_state *render; struct vdpau_render_state *render;
int i; int i;
render = (struct vdpau_render_state *)s->current_picture_ptr->f.data[0]; render = (struct vdpau_render_state *)h->cur_pic_ptr->f.data[0];
assert(render); assert(render);
for (i = 0; i < 2; ++i) { for (i = 0; i < 2; ++i) {
int foc = s->current_picture_ptr->field_poc[i]; int foc = h->cur_pic_ptr->field_poc[i];
if (foc == INT_MAX) if (foc == INT_MAX)
foc = 0; foc = 0;
render->info.h264.field_order_cnt[i] = foc; render->info.h264.field_order_cnt[i] = foc;
...@@ -195,21 +188,20 @@ void ff_vdpau_h264_picture_start(MpegEncContext *s) ...@@ -195,21 +188,20 @@ void ff_vdpau_h264_picture_start(MpegEncContext *s)
render->info.h264.frame_num = h->frame_num; render->info.h264.frame_num = h->frame_num;
} }
void ff_vdpau_h264_picture_complete(MpegEncContext *s) void ff_vdpau_h264_picture_complete(H264Context *h)
{ {
H264Context *h = s->avctx->priv_data;
struct vdpau_render_state *render; struct vdpau_render_state *render;
render = (struct vdpau_render_state *)s->current_picture_ptr->f.data[0]; render = (struct vdpau_render_state *)h->cur_pic_ptr->f.data[0];
assert(render); assert(render);
render->info.h264.slice_count = h->slice_num; render->info.h264.slice_count = h->slice_num;
if (render->info.h264.slice_count < 1) if (render->info.h264.slice_count < 1)
return; return;
render->info.h264.is_reference = (s->current_picture_ptr->f.reference & 3) ? VDP_TRUE : VDP_FALSE; render->info.h264.is_reference = (h->cur_pic_ptr->f.reference & 3) ? VDP_TRUE : VDP_FALSE;
render->info.h264.field_pic_flag = s->picture_structure != PICT_FRAME; render->info.h264.field_pic_flag = h->picture_structure != PICT_FRAME;
render->info.h264.bottom_field_flag = s->picture_structure == PICT_BOTTOM_FIELD; render->info.h264.bottom_field_flag = h->picture_structure == PICT_BOTTOM_FIELD;
render->info.h264.num_ref_frames = h->sps.ref_frame_count; render->info.h264.num_ref_frames = h->sps.ref_frame_count;
render->info.h264.mb_adaptive_frame_field_flag = h->sps.mb_aff && !render->info.h264.field_pic_flag; render->info.h264.mb_adaptive_frame_field_flag = h->sps.mb_aff && !render->info.h264.field_pic_flag;
render->info.h264.constrained_intra_pred_flag = h->pps.constrained_intra_pred; render->info.h264.constrained_intra_pred_flag = h->pps.constrained_intra_pred;
...@@ -235,7 +227,7 @@ void ff_vdpau_h264_picture_complete(MpegEncContext *s) ...@@ -235,7 +227,7 @@ void ff_vdpau_h264_picture_complete(MpegEncContext *s)
memcpy(render->info.h264.scaling_lists_8x8[0], h->pps.scaling_matrix8[0], sizeof(render->info.h264.scaling_lists_8x8[0])); memcpy(render->info.h264.scaling_lists_8x8[0], h->pps.scaling_matrix8[0], sizeof(render->info.h264.scaling_lists_8x8[0]));
memcpy(render->info.h264.scaling_lists_8x8[1], h->pps.scaling_matrix8[3], sizeof(render->info.h264.scaling_lists_8x8[0])); memcpy(render->info.h264.scaling_lists_8x8[1], h->pps.scaling_matrix8[3], sizeof(render->info.h264.scaling_lists_8x8[0]));
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height); ff_h264_draw_horiz_band(h, 0, h->avctx->height);
render->bitstream_buffers_used = 0; render->bitstream_buffers_used = 0;
} }
...@@ -287,7 +279,7 @@ void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, ...@@ -287,7 +279,7 @@ void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf,
render->info.mpeg.forward_reference = last->surface; render->info.mpeg.forward_reference = last->surface;
} }
ff_vdpau_add_data_chunk(s, buf, buf_size); ff_vdpau_add_data_chunk(s->current_picture_ptr->f.data[0], buf, buf_size);
render->info.mpeg.slice_count = slice_count; render->info.mpeg.slice_count = slice_count;
...@@ -357,7 +349,7 @@ void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf, ...@@ -357,7 +349,7 @@ void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf,
render->info.vc1.forward_reference = last->surface; render->info.vc1.forward_reference = last->surface;
} }
ff_vdpau_add_data_chunk(s, buf, buf_size); ff_vdpau_add_data_chunk(s->current_picture_ptr->f.data[0], buf, buf_size);
render->info.vc1.slice_count = 1; render->info.vc1.slice_count = 1;
...@@ -413,7 +405,7 @@ void ff_vdpau_mpeg4_decode_picture(MpegEncContext *s, const uint8_t *buf, ...@@ -413,7 +405,7 @@ void ff_vdpau_mpeg4_decode_picture(MpegEncContext *s, const uint8_t *buf,
render->info.mpeg4.forward_reference = last->surface; render->info.mpeg4.forward_reference = last->surface;
} }
ff_vdpau_add_data_chunk(s, buf, buf_size); ff_vdpau_add_data_chunk(s->current_picture_ptr->f.data[0], buf, buf_size);
ff_mpeg_draw_horiz_band(s, 0, s->avctx->height); ff_mpeg_draw_horiz_band(s, 0, s->avctx->height);
render->bitstream_buffers_used = 0; render->bitstream_buffers_used = 0;
......
...@@ -119,9 +119,8 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx, ...@@ -119,9 +119,8 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx,
{ {
H264Context * const h = avctx->priv_data; H264Context * const h = avctx->priv_data;
AVVDPAUContext *hwctx = avctx->hwaccel_context; AVVDPAUContext *hwctx = avctx->hwaccel_context;
MpegEncContext * const s = &h->s;
VdpPictureInfoH264 *info = &hwctx->info.h264; VdpPictureInfoH264 *info = &hwctx->info.h264;
Picture *pic = s->current_picture_ptr; Picture *pic = h->cur_pic_ptr;
/* init VdpPictureInfoH264 */ /* init VdpPictureInfoH264 */
info->slice_count = 0; info->slice_count = 0;
...@@ -129,8 +128,8 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx, ...@@ -129,8 +128,8 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx,
info->field_order_cnt[1] = h264_foc(pic->field_poc[1]); info->field_order_cnt[1] = h264_foc(pic->field_poc[1]);
info->is_reference = h->nal_ref_idc != 0; info->is_reference = h->nal_ref_idc != 0;
info->frame_num = h->frame_num; info->frame_num = h->frame_num;
info->field_pic_flag = s->picture_structure != PICT_FRAME; info->field_pic_flag = h->picture_structure != PICT_FRAME;
info->bottom_field_flag = s->picture_structure == PICT_BOTTOM_FIELD; info->bottom_field_flag = h->picture_structure == PICT_BOTTOM_FIELD;
info->num_ref_frames = h->sps.ref_frame_count; info->num_ref_frames = h->sps.ref_frame_count;
info->mb_adaptive_frame_field_flag = h->sps.mb_aff && !info->field_pic_flag; info->mb_adaptive_frame_field_flag = h->sps.mb_aff && !info->field_pic_flag;
info->constrained_intra_pred_flag = h->pps.constrained_intra_pred; info->constrained_intra_pred_flag = h->pps.constrained_intra_pred;
...@@ -185,12 +184,27 @@ static int vdpau_h264_decode_slice(AVCodecContext *avctx, ...@@ -185,12 +184,27 @@ static int vdpau_h264_decode_slice(AVCodecContext *avctx,
return 0; return 0;
} }
static int vdpau_h264_end_frame(AVCodecContext *avctx)
{
AVVDPAUContext *hwctx = avctx->hwaccel_context;
H264Context *h = avctx->priv_data;
VdpVideoSurface surf = ff_vdpau_get_surface_id(h->cur_pic_ptr);
hwctx->render(hwctx->decoder, surf, (void *)&hwctx->info,
hwctx->bitstream_buffers_used, hwctx->bitstream_buffers);
ff_h264_draw_horiz_band(h, 0, h->avctx->height);
hwctx->bitstream_buffers_used = 0;
return 0;
}
AVHWAccel ff_h264_vdpau_hwaccel = { AVHWAccel ff_h264_vdpau_hwaccel = {
.name = "h264_vdpau", .name = "h264_vdpau",
.type = AVMEDIA_TYPE_VIDEO, .type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_H264, .id = AV_CODEC_ID_H264,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_h264_start_frame, .start_frame = vdpau_h264_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = vdpau_h264_end_frame,
.decode_slice = vdpau_h264_decode_slice, .decode_slice = vdpau_h264_decode_slice,
}; };
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define AVCODEC_VDPAU_INTERNAL_H #define AVCODEC_VDPAU_INTERNAL_H
#include <stdint.h> #include <stdint.h>
#include "h264.h"
#include "mpegvideo.h" #include "mpegvideo.h"
/** Extract VdpVideoSurface from a Picture */ /** Extract VdpVideoSurface from a Picture */
...@@ -35,20 +36,20 @@ static inline uintptr_t ff_vdpau_get_surface_id(Picture *pic) ...@@ -35,20 +36,20 @@ static inline uintptr_t ff_vdpau_get_surface_id(Picture *pic)
int ff_vdpau_common_start_frame(AVCodecContext *avctx, int ff_vdpau_common_start_frame(AVCodecContext *avctx,
const uint8_t *buffer, uint32_t size); const uint8_t *buffer, uint32_t size);
int ff_vdpau_common_end_frame(AVCodecContext *avctx); int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx);
int ff_vdpau_add_buffer(AVCodecContext *avctx, int ff_vdpau_add_buffer(AVCodecContext *avctx,
const uint8_t *buf, uint32_t buf_size); const uint8_t *buf, uint32_t buf_size);
void ff_vdpau_add_data_chunk(MpegEncContext *s, const uint8_t *buf, void ff_vdpau_add_data_chunk(uint8_t *data, const uint8_t *buf,
int buf_size); int buf_size);
void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf,
int buf_size, int slice_count); int buf_size, int slice_count);
void ff_vdpau_h264_picture_start(MpegEncContext *s); void ff_vdpau_h264_picture_start(H264Context *h);
void ff_vdpau_h264_set_reference_frames(MpegEncContext *s); void ff_vdpau_h264_set_reference_frames(H264Context *h);
void ff_vdpau_h264_picture_complete(MpegEncContext *s); void ff_vdpau_h264_picture_complete(H264Context *h);
void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf, void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf,
int buf_size); int buf_size);
......
...@@ -98,7 +98,7 @@ AVHWAccel ff_mpeg1_vdpau_hwaccel = { ...@@ -98,7 +98,7 @@ AVHWAccel ff_mpeg1_vdpau_hwaccel = {
.id = AV_CODEC_ID_MPEG1VIDEO, .id = AV_CODEC_ID_MPEG1VIDEO,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_mpeg_start_frame, .start_frame = vdpau_mpeg_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_mpeg_decode_slice, .decode_slice = vdpau_mpeg_decode_slice,
}; };
#endif #endif
...@@ -110,7 +110,7 @@ AVHWAccel ff_mpeg2_vdpau_hwaccel = { ...@@ -110,7 +110,7 @@ AVHWAccel ff_mpeg2_vdpau_hwaccel = {
.id = AV_CODEC_ID_MPEG2VIDEO, .id = AV_CODEC_ID_MPEG2VIDEO,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_mpeg_start_frame, .start_frame = vdpau_mpeg_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_mpeg_decode_slice, .decode_slice = vdpau_mpeg_decode_slice,
}; };
#endif #endif
...@@ -92,7 +92,7 @@ AVHWAccel ff_h263_vdpau_hwaccel = { ...@@ -92,7 +92,7 @@ AVHWAccel ff_h263_vdpau_hwaccel = {
.id = AV_CODEC_ID_H263, .id = AV_CODEC_ID_H263,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_mpeg4_start_frame, .start_frame = vdpau_mpeg4_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_mpeg4_decode_slice, .decode_slice = vdpau_mpeg4_decode_slice,
}; };
#endif #endif
...@@ -104,7 +104,7 @@ AVHWAccel ff_mpeg4_vdpau_hwaccel = { ...@@ -104,7 +104,7 @@ AVHWAccel ff_mpeg4_vdpau_hwaccel = {
.id = AV_CODEC_ID_MPEG4, .id = AV_CODEC_ID_MPEG4,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_mpeg4_start_frame, .start_frame = vdpau_mpeg4_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_mpeg4_decode_slice, .decode_slice = vdpau_mpeg4_decode_slice,
}; };
#endif #endif
...@@ -112,7 +112,7 @@ AVHWAccel ff_wmv3_vdpau_hwaccel = { ...@@ -112,7 +112,7 @@ AVHWAccel ff_wmv3_vdpau_hwaccel = {
.id = AV_CODEC_ID_WMV3, .id = AV_CODEC_ID_WMV3,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_vc1_start_frame, .start_frame = vdpau_vc1_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_vc1_decode_slice, .decode_slice = vdpau_vc1_decode_slice,
}; };
#endif #endif
...@@ -123,6 +123,6 @@ AVHWAccel ff_vc1_vdpau_hwaccel = { ...@@ -123,6 +123,6 @@ AVHWAccel ff_vc1_vdpau_hwaccel = {
.id = AV_CODEC_ID_VC1, .id = AV_CODEC_ID_VC1,
.pix_fmt = AV_PIX_FMT_VDPAU, .pix_fmt = AV_PIX_FMT_VDPAU,
.start_frame = vdpau_vc1_start_frame, .start_frame = vdpau_vc1_start_frame,
.end_frame = ff_vdpau_common_end_frame, .end_frame = ff_vdpau_mpeg_end_frame,
.decode_slice = vdpau_vc1_decode_slice, .decode_slice = vdpau_vc1_decode_slice,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment