FFmpeg  4.4
qp_table.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 modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (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
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #include <stdint.h>
20 
21 // for FF_QSCALE_TYPE_*
22 #include "libavcodec/internal.h"
23 
24 #include "libavutil/frame.h"
25 #include "libavutil/mem.h"
27 
28 #include "qp_table.h"
29 
30 int ff_qp_table_extract(AVFrame *frame, int8_t **table, int *table_w, int *table_h,
31  int *qscale_type)
32 {
33  AVFrameSideData *sd;
34  AVVideoEncParams *par;
35  unsigned int mb_h = (frame->height + 15) / 16;
36  unsigned int mb_w = (frame->width + 15) / 16;
37  unsigned int nb_mb = mb_h * mb_w;
38  unsigned int block_idx;
39 
40  *table = NULL;
41 
43  if (!sd)
44  return 0;
45  par = (AVVideoEncParams*)sd->data;
47  (par->nb_blocks != 0 && par->nb_blocks != nb_mb))
48  return AVERROR(ENOSYS);
49 
50  *table = av_malloc(nb_mb);
51  if (!*table)
52  return AVERROR(ENOMEM);
53  if (table_w)
54  *table_w = mb_w;
55  if (table_h)
56  *table_h = mb_h;
57  if (qscale_type)
58  *qscale_type = FF_QSCALE_TYPE_MPEG2;
59 
60  if (par->nb_blocks == 0) {
61  memset(*table, par->qp, nb_mb);
62  return 0;
63  }
64 
65  for (block_idx = 0; block_idx < nb_mb; block_idx++) {
67  (*table)[block_idx] = par->qp + b->delta_qp;
68  }
69 
70  return 0;
71 }
72 
#define NULL
Definition: coverity.c:32
static AVFrame * frame
reference-counted frame API
#define AVERROR(e)
Definition: error.h:43
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:738
@ AV_FRAME_DATA_VIDEO_ENC_PARAMS
Encoding parameters for a video frame, as described by AVVideoEncParams.
Definition: frame.h:186
common internal api header.
#define FF_QSCALE_TYPE_MPEG2
Definition: internal.h:98
Memory handling functions.
static const uint16_t table[]
Definition: prosumer.c:206
int ff_qp_table_extract(AVFrame *frame, int8_t **table, int *table_w, int *table_h, int *qscale_type)
Extract a libpostproc-compatible QP table - an 8-bit QP value per 16x16 macroblock,...
Definition: qp_table.c:30
Structure to hold side data for an AVFrame.
Definition: frame.h:220
uint8_t * data
Definition: frame.h:222
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
int width
Definition: frame.h:376
int height
Definition: frame.h:376
Data structure for storing block-level encoding information.
Video encoding parameters for a given frame.
enum AVVideoEncParamsType type
Type of the parameters (the codec they are used with).
unsigned int nb_blocks
Number of blocks in the array.
int32_t qp
Base quantisation parameter for the frame.
#define av_malloc(s)
const char * b
Definition: vf_curves.c:118
if(ret< 0)
Definition: vf_mcdeint.c:282
static av_always_inline AVVideoBlockParams * av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx)
@ AV_VIDEO_ENC_PARAMS_MPEG2