FFmpeg
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 
AVVideoEncParams::qp
int32_t qp
Base quantisation parameter for the frame.
Definition: video_enc_params.h:103
qp_table.h
AVERROR
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
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:738
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
internal.h
b
#define b
Definition: input.c:41
table
static const uint16_t table[]
Definition: prosumer.c:206
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AV_VIDEO_ENC_PARAMS_MPEG2
@ AV_VIDEO_ENC_PARAMS_MPEG2
Definition: video_enc_params.h:65
AVVideoEncParams
Video encoding parameters for a given frame.
Definition: video_enc_params.h:73
FF_QSCALE_TYPE_MPEG2
#define FF_QSCALE_TYPE_MPEG2
Definition: internal.h:103
AVVideoEncParams::type
enum AVVideoEncParamsType type
Type of the parameters (the codec they are used with).
Definition: video_enc_params.h:95
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
AVFrameSideData::data
uint8_t * data
Definition: frame.h:222
AVVideoEncParams::nb_blocks
unsigned int nb_blocks
Number of blocks in the array.
Definition: video_enc_params.h:81
frame.h
AVVideoBlockParams
Data structure for storing block-level encoding information.
Definition: video_enc_params.h:120
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
AV_FRAME_DATA_VIDEO_ENC_PARAMS
@ AV_FRAME_DATA_VIDEO_ENC_PARAMS
Encoding parameters for a video frame, as described by AVVideoEncParams.
Definition: frame.h:186
mem.h
ff_qp_table_extract
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
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:220
av_video_enc_params_block
static av_always_inline AVVideoBlockParams * av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx)
Definition: video_enc_params.h:143
video_enc_params.h