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 
#define NULL
Definition: coverity.c:32
This structure describes decoded (raw) audio or video data.
Definition: frame.h:314
static av_always_inline AVVideoBlockParams * av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx)
int32_t qp
Base quantisation parameter for the frame.
Memory handling functions.
int32_t delta_qp
Difference between this block&#39;s final quantization parameter and the corresponding per-frame value...
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:738
#define av_malloc(s)
Data structure for storing block-level encoding information.
Structure to hold side data for an AVFrame.
Definition: frame.h:220
static const uint16_t table[]
Definition: prosumer.c:206
int width
Definition: frame.h:372
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, stored in raster order - from AVVideoEncParams side data.
Definition: qp_table.c:30
enum AVVideoEncParamsType type
Type of the parameters (the codec they are used with).
reference-counted frame API
#define b
Definition: input.c:41
Video encoding parameters for a given 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
if(ret)
uint8_t * data
Definition: frame.h:222
unsigned int nb_blocks
Number of blocks in the array.
#define FF_QSCALE_TYPE_MPEG2
Definition: internal.h:93
common internal api header.
Encoding parameters for a video frame, as described by AVVideoEncParams.
Definition: frame.h:186
int height
Definition: frame.h:372
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