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

MPEG-1/2 decoder. More...

#include "internal.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
#include "libavutil/avassert.h"
#include "libavutil/timecode.h"
#include "mpeg12.h"
#include "mpeg12data.h"
#include "mpeg12decdata.h"
#include "bytestream.h"
#include "vdpau_internal.h"
#include "xvmc_internal.h"
#include "thread.h"

Go to the source code of this file.

Macros

#define UNCHECKED_BITSTREAM_READER   1
 
#define MV_VLC_BITS   9
 
#define MBINCR_VLC_BITS   9
 
#define MB_PAT_VLC_BITS   9
 
#define MB_PTYPE_VLC_BITS   6
 
#define MB_BTYPE_VLC_BITS   6
 
#define INIT_2D_VLC_RL(rl, static_size)
 
#define MT_FIELD   1
 
#define MT_FRAME   2
 
#define MT_16X8   2
 
#define MT_DMV   3
 
#define DECODE_SLICE_ERROR   -1
 
#define DECODE_SLICE_OK   0
 

Functions

static int mpeg_decode_motion (MpegEncContext *s, int fcode, int pred)
 
static int mpeg1_decode_block_intra (MpegEncContext *s, DCTELEM *block, int n)
 
int ff_mpeg1_decode_block_intra (MpegEncContext *s, DCTELEM *block, int n)
 
static int mpeg1_decode_block_inter (MpegEncContext *s, DCTELEM *block, int n)
 
static int mpeg1_fast_decode_block_inter (MpegEncContext *s, DCTELEM *block, int n)
 Note: this function can read out of range and crash for corrupt streams.
 
static int mpeg2_decode_block_non_intra (MpegEncContext *s, DCTELEM *block, int n)
 
static int mpeg2_fast_decode_block_non_intra (MpegEncContext *s, DCTELEM *block, int n)
 Note: this function can read out of range and crash for corrupt streams.
 
static int mpeg2_decode_block_intra (MpegEncContext *s, DCTELEM *block, int n)
 
static int mpeg2_fast_decode_block_intra (MpegEncContext *s, DCTELEM *block, int n)
 Note: this function can read out of range and crash for corrupt streams.
 
static void init_2d_vlc_rl (RLTable *rl)
 
void ff_mpeg12_common_init (MpegEncContext *s)
 
void ff_mpeg1_clean_buffers (MpegEncContext *s)
 
av_cold void ff_mpeg12_init_vlcs (void)
 
static int get_dmv (MpegEncContext *s)
 
static int get_qscale (MpegEncContext *s)
 
static void exchange_uv (MpegEncContext *s)
 
static int mpeg_decode_mb (MpegEncContext *s, DCTELEM block[12][64])
 
static av_cold int mpeg_decode_init (AVCodecContext *avctx)
 
static int mpeg_decode_update_thread_context (AVCodecContext *avctx, const AVCodecContext *avctx_from)
 
static void quant_matrix_rebuild (uint16_t *matrix, const uint8_t *old_perm, const uint8_t *new_perm)
 
static int uses_vdpau (AVCodecContext *avctx)
 
static enum AVPixelFormat mpeg_get_pixelformat (AVCodecContext *avctx)
 
static int mpeg_decode_postinit (AVCodecContext *avctx)
 
static int mpeg1_decode_picture (AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 
static void mpeg_decode_sequence_extension (Mpeg1Context *s1)
 
static void mpeg_decode_sequence_display_extension (Mpeg1Context *s1)
 
static void mpeg_decode_picture_display_extension (Mpeg1Context *s1)
 
static int load_matrix (MpegEncContext *s, uint16_t matrix0[64], uint16_t matrix1[64], int intra)
 
static void mpeg_decode_quant_matrix_extension (MpegEncContext *s)
 
static void mpeg_decode_picture_coding_extension (Mpeg1Context *s1)
 
static int mpeg_field_start (MpegEncContext *s, const uint8_t *buf, int buf_size)
 
static int mpeg_decode_slice (MpegEncContext *s, int mb_y, const uint8_t **buf, int buf_size)
 Decode a slice.
 
static int slice_decode_thread (AVCodecContext *c, void *arg)
 
static int slice_end (AVCodecContext *avctx, AVFrame *pict)
 Handle slice ends.
 
static int mpeg1_decode_sequence (AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 
static int vcr2_init_sequence (AVCodecContext *avctx)
 
static void mpeg_decode_user_data (AVCodecContext *avctx, const uint8_t *p, int buf_size)
 
static void mpeg_decode_gop (AVCodecContext *avctx, const uint8_t *buf, int buf_size)
 
int ff_mpeg1_find_frame_end (ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s)
 Find the end of the current frame in the bitstream.
 
static int decode_chunks (AVCodecContext *avctx, AVFrame *picture, int *got_output, const uint8_t *buf, int buf_size)
 
static int mpeg_decode_frame (AVCodecContext *avctx, void *data, int *got_output, AVPacket *avpkt)
 
static void flush (AVCodecContext *avctx)
 
static int mpeg_decode_end (AVCodecContext *avctx)
 

Variables

static VLC mv_vlc
 
uint8_t ff_mpeg12_static_rl_table_store [2][2][2 *MAX_RUN+MAX_LEVEL+3]
 
VLC ff_dc_lum_vlc
 
VLC ff_dc_chroma_vlc
 
static VLC mbincr_vlc
 
static VLC mb_ptype_vlc
 
static VLC mb_btype_vlc
 
static VLC mb_pat_vlc
 
static enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420 []
 
static enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420 []
 
static const AVProfile mpeg2_video_profiles []
 
AVCodec ff_mpeg1video_decoder
 
AVCodec ff_mpeg2video_decoder
 
AVCodec ff_mpegvideo_decoder
 

Detailed Description

MPEG-1/2 decoder.

Definition in file mpeg12.c.

Macro Definition Documentation

#define UNCHECKED_BITSTREAM_READER   1

Definition at line 28 of file mpeg12.c.

#define MV_VLC_BITS   9

Definition at line 47 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and mpeg_decode_motion().

#define MBINCR_VLC_BITS   9

Definition at line 48 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and mpeg_decode_slice().

#define MB_PAT_VLC_BITS   9

Definition at line 49 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and mpeg_decode_mb().

#define MB_PTYPE_VLC_BITS   6

Definition at line 50 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and mpeg_decode_mb().

#define MB_BTYPE_VLC_BITS   6

Definition at line 51 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and mpeg_decode_mb().

#define INIT_2D_VLC_RL (   rl,
  static_size 
)
Value:
{\
static RL_VLC_ELEM rl_vlc_table[static_size];\
INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
&rl.table_vlc[0][1], 4, 2,\
&rl.table_vlc[0][0], 4, 2, static_size);\
\
rl.rl_vlc[0] = rl_vlc_table;\
init_2d_vlc_rl(&rl);\
}

Definition at line 611 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs().

#define MT_FIELD   1

Definition at line 748 of file mpeg12.c.

Referenced by mpeg_decode_mb().

#define MT_FRAME   2

Definition at line 749 of file mpeg12.c.

Referenced by mpeg_decode_mb().

#define MT_16X8   2

Definition at line 750 of file mpeg12.c.

#define MT_DMV   3

Definition at line 751 of file mpeg12.c.

Referenced by mpeg_decode_mb().

#define DECODE_SLICE_ERROR   -1

Definition at line 1667 of file mpeg12.c.

Referenced by mpeg_decode_slice().

#define DECODE_SLICE_OK   0

Definition at line 1668 of file mpeg12.c.

Referenced by mpeg_decode_slice().

Function Documentation

static int mpeg_decode_motion ( MpegEncContext s,
int  fcode,
int  pred 
)
static

Definition at line 56 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg1_decode_block_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Definition at line 84 of file mpeg12.c.

Referenced by ff_mpeg1_decode_block_intra(), and mpeg_decode_mb().

int ff_mpeg1_decode_block_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)

Definition at line 155 of file mpeg12.c.

Referenced by tqi_decode_mb().

static int mpeg1_decode_block_inter ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Definition at line 160 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg1_fast_decode_block_inter ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Note: this function can read out of range and crash for corrupt streams.

Changing this would eat up any speed benefits it has. Do not use "fast" flag if you need the code to be robust.

Definition at line 240 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg2_decode_block_non_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Definition at line 312 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg2_fast_decode_block_non_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Note: this function can read out of range and crash for corrupt streams.

Changing this would eat up any speed benefits it has. Do not use "fast" flag if you need the code to be robust.

Definition at line 396 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg2_decode_block_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Definition at line 458 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int mpeg2_fast_decode_block_intra ( MpegEncContext s,
DCTELEM block,
int  n 
)
inlinestatic

Note: this function can read out of range and crash for corrupt streams.

Changing this would eat up any speed benefits it has. Do not use "fast" flag if you need the code to be robust.

Definition at line 541 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static void init_2d_vlc_rl ( RLTable rl)
static

Definition at line 622 of file mpeg12.c.

void ff_mpeg12_common_init ( MpegEncContext s)

Definition at line 655 of file mpeg12.c.

Referenced by ff_mpeg1_encode_init(), and mpeg_decode_init().

void ff_mpeg1_clean_buffers ( MpegEncContext s)

Definition at line 663 of file mpeg12.c.

Referenced by encode_thread(), and mpeg_decode_slice().

av_cold void ff_mpeg12_init_vlcs ( void  )

Definition at line 683 of file mpeg12.c.

Referenced by decode_init(), mpeg_decode_init(), and tqi_decode_init().

static int get_dmv ( MpegEncContext s)
inlinestatic

Definition at line 720 of file mpeg12.c.

Referenced by mpeg_decode_mb().

static int get_qscale ( MpegEncContext s)
inlinestatic

Definition at line 728 of file mpeg12.c.

Referenced by mpeg_decode_mb(), and mpeg_decode_slice().

static void exchange_uv ( MpegEncContext s)
static

Definition at line 738 of file mpeg12.c.

Referenced by mpeg_decode_mb(), and vcr2_init_sequence().

static int mpeg_decode_mb ( MpegEncContext s,
DCTELEM  block[12][64] 
)
static

Definition at line 753 of file mpeg12.c.

Referenced by mpeg_decode_slice().

static av_cold int mpeg_decode_init ( AVCodecContext avctx)
static

Definition at line 1133 of file mpeg12.c.

static int mpeg_decode_update_thread_context ( AVCodecContext avctx,
const AVCodecContext avctx_from 
)
static

Definition at line 1164 of file mpeg12.c.

static void quant_matrix_rebuild ( uint16_t *  matrix,
const uint8_t old_perm,
const uint8_t new_perm 
)
static

Definition at line 1185 of file mpeg12.c.

static int uses_vdpau ( AVCodecContext avctx)
inlinestatic

Definition at line 1228 of file mpeg12.c.

Referenced by decode_chunks().

static enum AVPixelFormat mpeg_get_pixelformat ( AVCodecContext avctx)
static

Definition at line 1232 of file mpeg12.c.

Referenced by vcr2_init_sequence().

static int mpeg_decode_postinit ( AVCodecContext avctx)
static

Definition at line 1257 of file mpeg12.c.

Referenced by decode_chunks().

static int mpeg1_decode_picture ( AVCodecContext avctx,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 1373 of file mpeg12.c.

Referenced by decode_chunks().

static void mpeg_decode_sequence_extension ( Mpeg1Context s1)
static

Definition at line 1418 of file mpeg12.c.

Referenced by decode_chunks().

static void mpeg_decode_sequence_display_extension ( Mpeg1Context s1)
static

Definition at line 1454 of file mpeg12.c.

Referenced by decode_chunks().

static void mpeg_decode_picture_display_extension ( Mpeg1Context s1)
static

Definition at line 1478 of file mpeg12.c.

Referenced by decode_chunks().

static int load_matrix ( MpegEncContext s,
uint16_t  matrix0[64],
uint16_t  matrix1[64],
int  intra 
)
static

Definition at line 1511 of file mpeg12.c.

Referenced by mpeg1_decode_sequence(), and mpeg_decode_quant_matrix_extension().

static void mpeg_decode_quant_matrix_extension ( MpegEncContext s)
static

Definition at line 1533 of file mpeg12.c.

Referenced by decode_chunks().

static void mpeg_decode_picture_coding_extension ( Mpeg1Context s1)
static

Definition at line 1543 of file mpeg12.c.

Referenced by decode_chunks().

static int mpeg_field_start ( MpegEncContext s,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 1602 of file mpeg12.c.

Referenced by decode_chunks().

static int mpeg_decode_slice ( MpegEncContext s,
int  mb_y,
const uint8_t **  buf,
int  buf_size 
)
static

Decode a slice.

MpegEncContext.mb_y must be set to the MB row from the startcode.

Returns
DECODE_SLICE_ERROR if the slice is damaged, DECODE_SLICE_OK if this slice is OK

Definition at line 1676 of file mpeg12.c.

Referenced by decode_chunks(), and slice_decode_thread().

static int slice_decode_thread ( AVCodecContext c,
void arg 
)
static

Definition at line 1899 of file mpeg12.c.

Referenced by decode_chunks().

static int slice_end ( AVCodecContext avctx,
AVFrame pict 
)
static

Handle slice ends.

Returns
1 if it seems to be the last slice

Definition at line 1946 of file mpeg12.c.

Referenced by decode_chunks(), and decode_frame().

static int mpeg1_decode_sequence ( AVCodecContext avctx,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 1992 of file mpeg12.c.

Referenced by decode_chunks().

static int vcr2_init_sequence ( AVCodecContext avctx)
static

Definition at line 2069 of file mpeg12.c.

Referenced by mpeg_decode_frame().

static void mpeg_decode_user_data ( AVCodecContext avctx,
const uint8_t p,
int  buf_size 
)
static

Definition at line 2127 of file mpeg12.c.

Referenced by decode_chunks().

static void mpeg_decode_gop ( AVCodecContext avctx,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 2163 of file mpeg12.c.

Referenced by decode_chunks().

int ff_mpeg1_find_frame_end ( ParseContext pc,
const uint8_t buf,
int  buf_size,
AVCodecParserContext s 
)

Find the end of the current frame in the bitstream.

Returns
the position of the first byte of the next frame, or -1

Definition at line 2193 of file mpeg12.c.

Referenced by mpeg_decode_frame(), and mpegvideo_parse().

static int decode_chunks ( AVCodecContext avctx,
AVFrame picture,
int *  got_output,
const uint8_t buf,
int  buf_size 
)
static

Definition at line 2253 of file mpeg12.c.

Referenced by mpeg_decode_frame().

static int mpeg_decode_frame ( AVCodecContext avctx,
void data,
int *  got_output,
AVPacket avpkt 
)
static

Definition at line 2529 of file mpeg12.c.

static void flush ( AVCodecContext avctx)
static

Definition at line 2588 of file mpeg12.c.

static int mpeg_decode_end ( AVCodecContext avctx)
static

Definition at line 2597 of file mpeg12.c.

Variable Documentation

VLC mv_vlc
static

Definition at line 53 of file mpeg12.c.

uint8_t ff_mpeg12_static_rl_table_store[2][2][2 *MAX_RUN+MAX_LEVEL+3]

Definition at line 609 of file mpeg12.c.

Referenced by ff_mpeg12_init_vlcs(), and ff_mpeg1_encode_init().

VLC ff_dc_lum_vlc

Definition at line 675 of file mpeg12.c.

VLC ff_dc_chroma_vlc

Definition at line 676 of file mpeg12.c.

VLC mbincr_vlc
static

Definition at line 678 of file mpeg12.c.

VLC mb_ptype_vlc
static

Definition at line 679 of file mpeg12.c.

VLC mb_btype_vlc
static

Definition at line 680 of file mpeg12.c.

VLC mb_pat_vlc
static

Definition at line 681 of file mpeg12.c.

enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[]
static
Initial value:

Definition at line 1198 of file mpeg12.c.

Referenced by mpeg_get_pixelformat().

enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[]
static
Initial value:

Definition at line 1210 of file mpeg12.c.

Referenced by mpeg_get_pixelformat().

const AVProfile mpeg2_video_profiles[]
static
Initial value:
= {
{ FF_PROFILE_MPEG2_422, "4:2:2" },
{ FF_PROFILE_MPEG2_HIGH, "High" },
{ FF_PROFILE_MPEG2_SS, "Spatially Scalable" },
{ FF_PROFILE_MPEG2_SNR_SCALABLE, "SNR Scalable" },
{ FF_PROFILE_MPEG2_MAIN, "Main" },
{ FF_PROFILE_MPEG2_SIMPLE, "Simple" },
{ FF_PROFILE_RESERVED, "Reserved" },
{ FF_PROFILE_RESERVED, "Reserved" },
}

Definition at line 2606 of file mpeg12.c.

AVCodec ff_mpeg1video_decoder
Initial value:
= {
.name = "mpeg1video",
.priv_data_size = sizeof(Mpeg1Context),
.max_lowres = 3,
.long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
}

Definition at line 2619 of file mpeg12.c.

AVCodec ff_mpeg2video_decoder
Initial value:
= {
.name = "mpeg2video",
.priv_data_size = sizeof(Mpeg1Context),
.max_lowres = 3,
.long_name = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
}

Definition at line 2636 of file mpeg12.c.

AVCodec ff_mpegvideo_decoder
Initial value:
= {
.name = "mpegvideo",
.priv_data_size = sizeof(Mpeg1Context),
.max_lowres = 3,
.long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
}

Definition at line 2654 of file mpeg12.c.