FFmpeg
mpeg_er.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "error_resilience.h"
20 #include "mpegvideo.h"
21 #include "mpeg_er.h"
22 
23 static void set_erpic(ERPicture *dst, Picture *src)
24 {
25  int i;
26 
27  memset(dst, 0, sizeof(*dst));
28  if (!src) {
29  dst->f = NULL;
30  dst->tf = NULL;
31  return;
32  }
33 
34  dst->f = src->f;
35  dst->tf = &src->tf;
36 
37  for (i = 0; i < 2; i++) {
38  dst->motion_val[i] = src->motion_val[i];
39  dst->ref_index[i] = src->ref_index[i];
40  }
41 
42  dst->mb_type = src->mb_type;
43  dst->field_picture = src->field_picture;
44 }
45 
47 {
48  ERContext *er = &s->er;
49 
53 
54  er->pp_time = s->pp_time;
55  er->pb_time = s->pb_time;
58 
60 }
61 
62 static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
63  int (*mv)[2][4][2], int mb_x, int mb_y,
64  int mb_intra, int mb_skipped)
65 {
66  MpegEncContext *s = opaque;
67 
68  s->mv_dir = mv_dir;
69  s->mv_type = mv_type;
70  s->mb_intra = mb_intra;
71  s->mb_skipped = mb_skipped;
72  s->mb_x = mb_x;
73  s->mb_y = mb_y;
74  s->mcsel = 0;
75  memcpy(s->mv, mv, sizeof(*mv));
76 
79 
80  s->bdsp.clear_blocks(s->block[0]);
81  if (!s->chroma_y_shift)
82  s->bdsp.clear_blocks(s->block[6]);
83 
84  s->dest[0] = s->current_picture.f->data[0] +
85  s->mb_y * 16 * s->linesize +
86  s->mb_x * 16;
87  s->dest[1] = s->current_picture.f->data[1] +
88  s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize +
89  s->mb_x * (16 >> s->chroma_x_shift);
90  s->dest[2] = s->current_picture.f->data[2] +
91  s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize +
92  s->mb_x * (16 >> s->chroma_x_shift);
93 
94  if (ref)
96  "Interlaced error concealment is not fully implemented\n");
98 }
99 
101 {
102  ERContext *er = &s->er;
103  int mb_array_size = s->mb_height * s->mb_stride;
104  int i;
105 
106  er->avctx = s->avctx;
107 
108  er->mb_index2xy = s->mb_index2xy;
109  er->mb_num = s->mb_num;
110  er->mb_width = s->mb_width;
111  er->mb_height = s->mb_height;
112  er->mb_stride = s->mb_stride;
113  er->b8_stride = s->b8_stride;
114 
115  er->er_temp_buffer = av_malloc(s->mb_height * s->mb_stride * (4*sizeof(int) + 1));
116  er->error_status_table = av_mallocz(mb_array_size);
117  if (!er->er_temp_buffer || !er->error_status_table)
118  goto fail;
119 
120  er->mbskip_table = s->mbskip_table;
121  er->mbintra_table = s->mbintra_table;
122 
123  for (i = 0; i < FF_ARRAY_ELEMS(s->dc_val); i++)
124  er->dc_val[i] = s->dc_val[i];
125 
127  er->opaque = s;
128 
129  return 0;
130 fail:
131  av_freep(&er->er_temp_buffer);
133  return AVERROR(ENOMEM);
134 }
#define NULL
Definition: coverity.c:32
void ff_init_block_index(MpegEncContext *s)
Definition: mpegvideo.c:2274
int8_t * ref_index[2]
Definition: mpegpicture.h:62
int field_picture
whether or not the picture was encoded in separate fields
Definition: mpegpicture.h:79
uint32_t * mb_type
ERPicture last_pic
mpegvideo header.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
int mb_num
number of MBs of a picture
Definition: mpegvideo.h:133
#define src
Definition: vp8dsp.c:254
int chroma_x_shift
Definition: mpegvideo.h:486
uint16_t pp_time
static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, int(*mv)[2][4][2], int mb_x, int mb_y, int mb_intra, int mb_skipped)
Definition: mpeg_er.c:62
ptrdiff_t b8_stride
#define av_malloc(s)
Picture current_picture
copy of the current picture structure.
Definition: mpegvideo.h:180
ERPicture cur_pic
uint16_t pp_time
time distance between the last 2 p,s,i frames
Definition: mpegvideo.h:392
int mb_height
number of MBs horizontally & vertically
Definition: mpegvideo.h:129
#define av_log(a,...)
static void ff_update_block_index(MpegEncContext *s)
Definition: mpegvideo.h:737
ThreadFrame tf
Definition: mpegpicture.h:47
int16_t * dc_val[3]
used for MPEG-4 DC prediction, all 3 arrays must be continuous
Definition: mpegvideo.h:187
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
int mb_skipped
MUST BE SET only during DECODING.
Definition: mpegvideo.h:195
int chroma_y_shift
Definition: mpegvideo.h:487
int partitioned_frame
is current frame partitioned
Definition: mpegvideo.h:405
void(* clear_blocks)(int16_t *blocks)
Definition: blockdsp.h:37
ERContext er
Definition: mpegvideo.h:566
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
ThreadFrame * tf
int quarter_sample
1->qpel, 0->half pel ME/MC
Definition: mpegvideo.h:401
static void set_erpic(ERPicture *dst, Picture *src)
Definition: mpeg_er.c:23
#define fail()
Definition: checkasm.h:122
uint8_t * mbintra_table
int * mb_index2xy
uint8_t * error_status_table
int ff_mpeg_er_init(MpegEncContext *s)
Definition: mpeg_er.c:100
uint8_t * er_temp_buffer
uint8_t * mbskip_table
used to avoid copy if macroblock skipped (for black regions for example) and used for B-frame encodin...
Definition: mpegvideo.h:196
int16_t(*[2] motion_val)[2]
Definition: mpegpicture.h:53
Picture * current_picture_ptr
pointer to the current picture
Definition: mpegvideo.h:184
void ff_mpeg_er_frame_start(MpegEncContext *s)
Definition: mpeg_er.c:46
Picture.
Definition: mpegpicture.h:45
uint16_t pb_time
#define s(width, name)
Definition: cbs_vp9.c:257
uint8_t * mbintra_table
used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding
Definition: mpegvideo.h:198
#define FF_ARRAY_ELEMS(a)
int * mb_index2xy
mb_index -> mb_x + mb_y*mb_stride
Definition: mpegvideo.h:297
static const int8_t mv[256][2]
Definition: 4xm.c:77
ptrdiff_t linesize
line size, in bytes, may be different from width
Definition: mpegvideo.h:134
BlockDSPContext bdsp
Definition: mpegvideo.h:226
ERPicture next_pic
struct AVFrame * f
Definition: mpegpicture.h:46
ptrdiff_t uvlinesize
line size, for chroma in bytes, may be different from width
Definition: mpegvideo.h:135
AVCodecContext * avctx
int8_t * ref_index[2]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:309
int mv[2][4][2]
motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend...
Definition: mpegvideo.h:276
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
Definition: mpegvideo.h:131
MpegEncContext.
Definition: mpegvideo.h:81
Picture * next_picture_ptr
pointer to the next picture (for bidir pred)
Definition: mpegvideo.h:183
struct AVCodecContext * avctx
Definition: mpegvideo.h:98
int partitioned_frame
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
Definition: mpegvideo.h:130
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
uint8_t * dest[3]
Definition: mpegvideo.h:295
int16_t * dc_val[3]
Picture * last_picture_ptr
pointer to the previous picture.
Definition: mpegvideo.h:182
AVFrame * f
int16_t(*[2] motion_val)[2]
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
Definition: mpegvideo.c:2255
int16_t(* block)[64]
points to one of the following blocks
Definition: mpegvideo.h:508
void ff_er_frame_start(ERContext *s)
uint32_t * mb_type
types and macros are defined in mpegutils.h
Definition: mpegpicture.h:56
#define av_freep(p)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
ptrdiff_t mb_stride
uint8_t * mbskip_table
void(* decode_mb)(void *opaque, int ref, int mv_dir, int mv_type, int(*mv)[2][4][2], int mb_x, int mb_y, int mb_intra, int mb_skipped)
uint16_t pb_time
time distance between the last b and p,s,i frame
Definition: mpegvideo.h:393