FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Macros | Functions | Variables
h264_slice.c File Reference

H.264 / AVC / MPEG-4 part10 codec. More...

#include "libavutil/avassert.h"
#include "libavutil/display.h"
#include "libavutil/imgutils.h"
#include "libavutil/stereo3d.h"
#include "libavutil/timer.h"
#include "internal.h"
#include "cabac.h"
#include "cabac_functions.h"
#include "error_resilience.h"
#include "avcodec.h"
#include "h264.h"
#include "h264dec.h"
#include "h264data.h"
#include "h264chroma.h"
#include "h264_mvpred.h"
#include "h264_ps.h"
#include "golomb.h"
#include "mathops.h"
#include "mpegutils.h"
#include "rectangle.h"
#include "thread.h"

Go to the source code of this file.

Macros

#define IN_RANGE(a, b, size)   (((void*)(a) >= (void*)(b)) && ((void*)(a) < (void*)((b) + (size))))
 
#define REBASE_PICTURE(pic, new_ctx, old_ctx)
 
#define TRANSPOSE(x)   ((x) >> 2) | (((x) << 2) & 0xF)
 
#define TRANSPOSE(x)   ((x) >> 3) | (((x) & 7) << 3)
 
#define HWACCEL_MAX
 

Functions

static void release_unused_pictures (H264Context *h, int remove_current)
 
static int alloc_scratch_buffers (H264SliceContext *sl, int linesize)
 
static int init_table_pools (H264Context *h)
 
static int alloc_picture (H264Context *h, H264Picture *pic)
 
static int pic_is_unused (H264Context *h, H264Picture *pic)
 
static int find_unused_picture (H264Context *h)
 
static void copy_picture_range (H264Picture **to, H264Picture **from, int count, H264Context *new_base, H264Context *old_base)
 
static int h264_slice_header_init (H264Context *h)
 
int ff_h264_update_thread_context (AVCodecContext *dst, const AVCodecContext *src)
 
static int h264_frame_start (H264Context *h)
 
static av_always_inline void backup_mb_border (const H264Context *h, H264SliceContext *sl, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int simple)
 
static void implicit_weight_table (const H264Context *h, H264SliceContext *sl, int field)
 Initialize implicit_weight table. More...
 
static void init_scan_tables (H264Context *h)
 initialize scan tables More...
 
static enum AVPixelFormat get_pixel_format (H264Context *h, int force_callback)
 
static int init_dimensions (H264Context *h)
 
static enum AVPixelFormat non_j_pixfmt (enum AVPixelFormat a)
 
static int h264_init_ps (H264Context *h, const H264SliceContext *sl, int first_slice)
 
static int h264_export_frame_props (H264Context *h)
 
static int h264_field_start (H264Context *h, const H264SliceContext *sl, const H2645NAL *nal, int first_slice)
 
static int h264_slice_header_parse (const H264Context *h, H264SliceContext *sl, const H2645NAL *nal)
 
int ff_h264_decode_slice_header (H264Context *h, H264SliceContext *sl, const H2645NAL *nal)
 Decode a slice header. More...
 
int ff_h264_get_slice_type (const H264SliceContext *sl)
 Reconstruct bitstream slice_type. More...
 
static av_always_inline void fill_filter_caches_inter (const H264Context *h, H264SliceContext *sl, int mb_type, int top_xy, int left_xy[LEFT_MBS], int top_type, int left_type[LEFT_MBS], int mb_xy, int list)
 
static int fill_filter_caches (const H264Context *h, H264SliceContext *sl, int mb_type)
 
static void loop_filter (const H264Context *h, H264SliceContext *sl, int start_x, int end_x)
 
static void predict_field_decoding_flag (const H264Context *h, H264SliceContext *sl)
 
static void decode_finish_row (const H264Context *h, H264SliceContext *sl)
 Draw edges and report progress for the last MB row. More...
 
static void er_add_slice (H264SliceContext *sl, int startx, int starty, int endx, int endy, int status)
 
static int decode_slice (struct AVCodecContext *avctx, void *arg)
 
int ff_h264_execute_decode_slices (H264Context *h, unsigned context_count)
 Call decode_slice() for each context. More...
 

Variables

static const uint8_t field_scan [16+1]
 
static const uint8_t field_scan8x8 [64+1]
 
static const uint8_t field_scan8x8_cavlc [64+1]
 
static const uint8_t zigzag_scan8x8_cavlc [64+1]
 

Detailed Description

H.264 / AVC / MPEG-4 part10 codec.

Author
Michael Niedermayer micha.nosp@m.elni.nosp@m.@gmx..nosp@m.at

Definition in file h264_slice.c.

Macro Definition Documentation

#define IN_RANGE (   a,
  b,
  size 
)    (((void*)(a) >= (void*)(b)) && ((void*)(a) < (void*)((b) + (size))))

Definition at line 278 of file h264_slice.c.

Referenced by copy_picture_range().

#define REBASE_PICTURE (   pic,
  new_ctx,
  old_ctx 
)
Value:
(((pic) && (pic) >= (old_ctx)->DPB && \
(pic) < (old_ctx)->DPB + H264_MAX_PICTURE_COUNT) ? \
&(new_ctx)->DPB[(pic) - (old_ctx)->DPB] : NULL)
#define NULL
Definition: coverity.c:32
Decoded Picture Buffer (DPB).
Definition: vaapi_h264.c:82
#define H264_MAX_PICTURE_COUNT
Definition: h264dec.h:52

Definition at line 280 of file h264_slice.c.

Referenced by copy_picture_range(), and ff_h264_update_thread_context().

#define TRANSPOSE (   x)    ((x) >> 2) | (((x) << 2) & 0xF)
#define TRANSPOSE (   x)    ((x) >> 3) | (((x) & 7) << 3)
#define HWACCEL_MAX
Value:
(CONFIG_H264_DXVA2_HWACCEL + \
CONFIG_H264_D3D11VA_HWACCEL + \
CONFIG_H264_VAAPI_HWACCEL + \
(CONFIG_H264_VDA_HWACCEL * 2) + \
CONFIG_H264_VIDEOTOOLBOX_HWACCEL + \
CONFIG_H264_VDPAU_HWACCEL)

Referenced by get_pixel_format().

Function Documentation

static void release_unused_pictures ( H264Context h,
int  remove_current 
)
static

Definition at line 115 of file h264_slice.c.

Referenced by h264_field_start(), and h264_frame_start().

static int alloc_scratch_buffers ( H264SliceContext sl,
int  linesize 
)
static

Definition at line 128 of file h264_slice.c.

Referenced by decode_slice().

static int init_table_pools ( H264Context h)
static

Definition at line 160 of file h264_slice.c.

Referenced by alloc_picture().

static int alloc_picture ( H264Context h,
H264Picture pic 
)
static

Definition at line 187 of file h264_slice.c.

Referenced by h264_frame_start().

static int pic_is_unused ( H264Context h,
H264Picture pic 
)
inlinestatic

Definition at line 256 of file h264_slice.c.

Referenced by find_unused_picture().

static int find_unused_picture ( H264Context h)
static

Definition at line 263 of file h264_slice.c.

Referenced by h264_frame_start().

static void copy_picture_range ( H264Picture **  to,
H264Picture **  from,
int  count,
H264Context new_base,
H264Context old_base 
)
static

Definition at line 285 of file h264_slice.c.

Referenced by ff_h264_update_thread_context().

static int h264_slice_header_init ( H264Context h)
static

Definition at line 906 of file h264_slice.c.

Referenced by ff_h264_update_thread_context(), and h264_init_ps().

int ff_h264_update_thread_context ( AVCodecContext dst,
const AVCodecContext src 
)

Definition at line 301 of file h264_slice.c.

static int h264_frame_start ( H264Context h)
static

Definition at line 464 of file h264_slice.c.

Referenced by h264_field_start().

static av_always_inline void backup_mb_border ( const H264Context h,
H264SliceContext sl,
uint8_t src_y,
uint8_t src_cb,
uint8_t src_cr,
int  linesize,
int  uvlinesize,
int  simple 
)
static

Definition at line 567 of file h264_slice.c.

Referenced by loop_filter().

static void implicit_weight_table ( const H264Context h,
H264SliceContext sl,
int  field 
)
static

Initialize implicit_weight table.

Parameters
field0/1 initialize the weight for interlaced MBAFF -1 initializes the rest

Definition at line 669 of file h264_slice.c.

Referenced by ff_h264_decode_slice_header().

static void init_scan_tables ( H264Context h)
static

initialize scan tables

Definition at line 733 of file h264_slice.c.

Referenced by h264_slice_header_init().

static enum AVPixelFormat get_pixel_format ( H264Context h,
int  force_callback 
)
static

Definition at line 767 of file h264_slice.c.

Referenced by h264_init_ps().

static int init_dimensions ( H264Context h)
static

Definition at line 880 of file h264_slice.c.

Referenced by h264_init_ps().

static enum AVPixelFormat non_j_pixfmt ( enum AVPixelFormat  a)
static

Definition at line 1001 of file h264_slice.c.

Referenced by h264_init_ps().

static int h264_init_ps ( H264Context h,
const H264SliceContext sl,
int  first_slice 
)
static

Definition at line 1012 of file h264_slice.c.

Referenced by h264_field_start().

static int h264_export_frame_props ( H264Context h)
static

Definition at line 1131 of file h264_slice.c.

Referenced by h264_field_start().

static int h264_field_start ( H264Context h,
const H264SliceContext sl,
const H2645NAL nal,
int  first_slice 
)
static

Definition at line 1290 of file h264_slice.c.

Referenced by ff_h264_decode_slice_header().

static int h264_slice_header_parse ( const H264Context h,
H264SliceContext sl,
const H2645NAL nal 
)
static

Definition at line 1546 of file h264_slice.c.

Referenced by ff_h264_decode_slice_header().

int ff_h264_decode_slice_header ( H264Context h,
H264SliceContext sl,
const H2645NAL nal 
)

Decode a slice header.

This will (re)initialize the decoder and call h264_frame_start() as needed.

Parameters
hh264context
Returns
0 if okay, <0 if an error occurred

Definition at line 1763 of file h264_slice.c.

Referenced by decode_nal_units().

int ff_h264_get_slice_type ( const H264SliceContext sl)

Reconstruct bitstream slice_type.

Definition at line 2001 of file h264_slice.c.

Referenced by fill_slice_long(), and vaapi_h264_decode_slice().

static av_always_inline void fill_filter_caches_inter ( const H264Context h,
H264SliceContext sl,
int  mb_type,
int  top_xy,
int  left_xy[LEFT_MBS],
int  top_type,
int  left_type[LEFT_MBS],
int  mb_xy,
int  list 
)
static

Definition at line 2019 of file h264_slice.c.

Referenced by fill_filter_caches().

static int fill_filter_caches ( const H264Context h,
H264SliceContext sl,
int  mb_type 
)
static
Returns
non zero if the loop filter can be skipped

Definition at line 2103 of file h264_slice.c.

Referenced by loop_filter().

static void loop_filter ( const H264Context h,
H264SliceContext sl,
int  start_x,
int  end_x 
)
static

Definition at line 2245 of file h264_slice.c.

Referenced by decode_slice(), ff_h264_execute_decode_slices(), and xmv_read_extradata().

static void predict_field_decoding_flag ( const H264Context h,
H264SliceContext sl 
)
static

Definition at line 2315 of file h264_slice.c.

Referenced by decode_slice().

static void decode_finish_row ( const H264Context h,
H264SliceContext sl 
)
static

Draw edges and report progress for the last MB row.

Definition at line 2328 of file h264_slice.c.

Referenced by decode_slice().

static void er_add_slice ( H264SliceContext sl,
int  startx,
int  starty,
int  endx,
int  endy,
int  status 
)
static

Definition at line 2359 of file h264_slice.c.

Referenced by decode_slice().

static int decode_slice ( struct AVCodecContext avctx,
void arg 
)
static

Definition at line 2373 of file h264_slice.c.

Referenced by ff_h264_execute_decode_slices().

int ff_h264_execute_decode_slices ( H264Context h,
unsigned  context_count 
)

Call decode_slice() for each context.

Parameters
hh264 master context
context_countnumber of contexts to execute

Definition at line 2588 of file h264_slice.c.

Referenced by decode_nal_units().

Variable Documentation

const uint8_t field_scan[16+1]
static
Initial value:
= {
0 + 0 * 4, 0 + 1 * 4, 1 + 0 * 4, 0 + 2 * 4,
0 + 3 * 4, 1 + 1 * 4, 1 + 2 * 4, 1 + 3 * 4,
2 + 0 * 4, 2 + 1 * 4, 2 + 2 * 4, 2 + 3 * 4,
3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4, 3 + 3 * 4,
}

Definition at line 50 of file h264_slice.c.

Referenced by init_scan_tables().

const uint8_t field_scan8x8[64+1]
static
Initial value:
= {
0 + 0 * 8, 0 + 1 * 8, 0 + 2 * 8, 1 + 0 * 8,
1 + 1 * 8, 0 + 3 * 8, 0 + 4 * 8, 1 + 2 * 8,
2 + 0 * 8, 1 + 3 * 8, 0 + 5 * 8, 0 + 6 * 8,
0 + 7 * 8, 1 + 4 * 8, 2 + 1 * 8, 3 + 0 * 8,
2 + 2 * 8, 1 + 5 * 8, 1 + 6 * 8, 1 + 7 * 8,
2 + 3 * 8, 3 + 1 * 8, 4 + 0 * 8, 3 + 2 * 8,
2 + 4 * 8, 2 + 5 * 8, 2 + 6 * 8, 2 + 7 * 8,
3 + 3 * 8, 4 + 1 * 8, 5 + 0 * 8, 4 + 2 * 8,
3 + 4 * 8, 3 + 5 * 8, 3 + 6 * 8, 3 + 7 * 8,
4 + 3 * 8, 5 + 1 * 8, 6 + 0 * 8, 5 + 2 * 8,
4 + 4 * 8, 4 + 5 * 8, 4 + 6 * 8, 4 + 7 * 8,
5 + 3 * 8, 6 + 1 * 8, 6 + 2 * 8, 5 + 4 * 8,
5 + 5 * 8, 5 + 6 * 8, 5 + 7 * 8, 6 + 3 * 8,
7 + 0 * 8, 7 + 1 * 8, 6 + 4 * 8, 6 + 5 * 8,
6 + 6 * 8, 6 + 7 * 8, 7 + 2 * 8, 7 + 3 * 8,
7 + 4 * 8, 7 + 5 * 8, 7 + 6 * 8, 7 + 7 * 8,
}

Definition at line 57 of file h264_slice.c.

Referenced by init_scan_tables().

const uint8_t field_scan8x8_cavlc[64+1]
static
Initial value:
= {
0 + 0 * 8, 1 + 1 * 8, 2 + 0 * 8, 0 + 7 * 8,
2 + 2 * 8, 2 + 3 * 8, 2 + 4 * 8, 3 + 3 * 8,
3 + 4 * 8, 4 + 3 * 8, 4 + 4 * 8, 5 + 3 * 8,
5 + 5 * 8, 7 + 0 * 8, 6 + 6 * 8, 7 + 4 * 8,
0 + 1 * 8, 0 + 3 * 8, 1 + 3 * 8, 1 + 4 * 8,
1 + 5 * 8, 3 + 1 * 8, 2 + 5 * 8, 4 + 1 * 8,
3 + 5 * 8, 5 + 1 * 8, 4 + 5 * 8, 6 + 1 * 8,
5 + 6 * 8, 7 + 1 * 8, 6 + 7 * 8, 7 + 5 * 8,
0 + 2 * 8, 0 + 4 * 8, 0 + 5 * 8, 2 + 1 * 8,
1 + 6 * 8, 4 + 0 * 8, 2 + 6 * 8, 5 + 0 * 8,
3 + 6 * 8, 6 + 0 * 8, 4 + 6 * 8, 6 + 2 * 8,
5 + 7 * 8, 6 + 4 * 8, 7 + 2 * 8, 7 + 6 * 8,
1 + 0 * 8, 1 + 2 * 8, 0 + 6 * 8, 3 + 0 * 8,
1 + 7 * 8, 3 + 2 * 8, 2 + 7 * 8, 4 + 2 * 8,
3 + 7 * 8, 5 + 2 * 8, 4 + 7 * 8, 5 + 4 * 8,
6 + 3 * 8, 6 + 5 * 8, 7 + 3 * 8, 7 + 7 * 8,
}

Definition at line 76 of file h264_slice.c.

Referenced by init_scan_tables().

const uint8_t zigzag_scan8x8_cavlc[64+1]
static
Initial value:
= {
0 + 0 * 8, 1 + 1 * 8, 1 + 2 * 8, 2 + 2 * 8,
4 + 1 * 8, 0 + 5 * 8, 3 + 3 * 8, 7 + 0 * 8,
3 + 4 * 8, 1 + 7 * 8, 5 + 3 * 8, 6 + 3 * 8,
2 + 7 * 8, 6 + 4 * 8, 5 + 6 * 8, 7 + 5 * 8,
1 + 0 * 8, 2 + 0 * 8, 0 + 3 * 8, 3 + 1 * 8,
3 + 2 * 8, 0 + 6 * 8, 4 + 2 * 8, 6 + 1 * 8,
2 + 5 * 8, 2 + 6 * 8, 6 + 2 * 8, 5 + 4 * 8,
3 + 7 * 8, 7 + 3 * 8, 4 + 7 * 8, 7 + 6 * 8,
0 + 1 * 8, 3 + 0 * 8, 0 + 4 * 8, 4 + 0 * 8,
2 + 3 * 8, 1 + 5 * 8, 5 + 1 * 8, 5 + 2 * 8,
1 + 6 * 8, 3 + 5 * 8, 7 + 1 * 8, 4 + 5 * 8,
4 + 6 * 8, 7 + 4 * 8, 5 + 7 * 8, 6 + 7 * 8,
0 + 2 * 8, 2 + 1 * 8, 1 + 3 * 8, 5 + 0 * 8,
1 + 4 * 8, 2 + 4 * 8, 6 + 0 * 8, 4 + 3 * 8,
0 + 7 * 8, 4 + 4 * 8, 7 + 2 * 8, 3 + 6 * 8,
5 + 5 * 8, 6 + 5 * 8, 6 + 6 * 8, 7 + 7 * 8,
}

Definition at line 96 of file h264_slice.c.

Referenced by init_scan_tables().