FFmpeg
Loading...
Searching...
No Matches
h264_redundant_pps.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 <inttypes.h>
20
21#include "libavutil/log.h"
22
23#include "libavcodec/bsf.h"
25#include "libavcodec/cbs.h"
26#include "libavcodec/cbs_bsf.h"
27#include "libavcodec/cbs_h264.h"
28#include "libavcodec/codec_id.h"
29#include "libavcodec/h264.h"
30#include "libavcodec/packet.h"
31
32#define NEW_GLOBAL_PIC_INIT_QP 26
33
37
38
41{
43 int err;
44
45 // The changes we are about to perform affect the parsing process,
46 // so we must make sure that the PPS is writable, otherwise the
47 // parsing of future slices will be incorrect and even raise errors.
48 err = ff_cbs_make_unit_writable(ctx->common.input, unit);
49 if (err < 0)
50 return err;
51 pps = unit->content;
52
53 // Overwrite pic_init_qp with the global value.
54 pps->pic_init_qp_minus26 = NEW_GLOBAL_PIC_INIT_QP - 26;
55
56 // Some PPSs have this set, so it must be set in all of them.
57 // (Slices which do not use such a PPS on input will still have
58 // *_weight_l*flag as zero and therefore write equivalently.)
59 pps->weighted_pred_flag = 1;
60
61 return 0;
62}
63
65 H264RawSliceHeader *slice)
66{
67 const CodedBitstreamH264Context *const in = ctx->common.input->priv_data;
68 const H264RawPPS *const pps = in->pps[slice->pic_parameter_set_id];
69
70 // We modified the PPS's qp value, now offset this by applying
71 // the negative offset to the slices.
72 slice->slice_qp_delta += pps->pic_init_qp_minus26
74
75 return 0;
76}
77
81{
83 int err, i;
84
85 for (i = 0; i < au->nb_units; i++) {
87
88 if (nal->type == H264_NAL_PPS) {
90 if (err < 0)
91 return err;
92 }
93 if (nal->type == H264_NAL_SLICE ||
94 nal->type == H264_NAL_IDR_SLICE) {
95 H264RawSlice *slice = nal->content;
97 }
98 }
99
100 return 0;
101}
102
104 .codec_id = AV_CODEC_ID_H264,
105 .fragment_name = "access unit",
106 .unit_name = "NAL unit",
107 .update_fragment = &h264_redundant_pps_update_fragment,
108};
109
114
118
120 .p.name = "h264_redundant_pps",
121 .p.codec_ids = h264_redundant_pps_codec_ids,
122 .priv_data_size = sizeof(H264RedundantPPSContext),
126};
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
const FFBitStreamFilter ff_h264_redundant_pps_bsf
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition cbs_bsf.c:97
av_cold void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition cbs_bsf.c:191
av_cold int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition cbs_bsf.c:146
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
static AVPacket * pkt
uint64_t pps
Definition dovi_rpuenc.c:36
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
@ AV_CODEC_ID_H264
Definition codec_id.h:77
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
H.264 common definitions.
@ H264_NAL_PPS
Definition h264.h:42
@ H264_NAL_SLICE
Definition h264.h:35
@ H264_NAL_IDR_SLICE
Definition h264.h:39
#define NEW_GLOBAL_PIC_INIT_QP
static int h264_redundant_pps_fixup_slice(H264RedundantPPSContext *ctx, H264RawSliceHeader *slice)
static int h264_redundant_pps_fixup_pps(H264RedundantPPSContext *ctx, CodedBitstreamUnit *unit)
static int h264_redundant_pps_init(AVBSFContext *bsf)
static const CBSBSFType h264_redundant_pps_type
static int h264_redundant_pps_update_fragment(AVBSFContext *bsf, AVPacket *pkt, CodedBitstreamFragment *au)
static enum AVCodecID h264_redundant_pps_codec_ids[]
The bitstream filter state.
Definition bsf.h:68
void * priv_data
Opaque filter-specific private data.
Definition bsf.h:83
This structure stores compressed data.
Definition packet.h:580
Coded bitstream fragment structure, combining one or more units.
Definition cbs.h:129
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition cbs.h:175
int nb_units
Number of units in this fragment.
Definition cbs.h:160
H264RawPPS * pps[H264_MAX_PPS_COUNT]
RefStruct references.
Definition cbs_h264.h:431
Coded bitstream unit structure.
Definition cbs.h:77
void * content
Pointer to the decomposed form of this unit.
Definition cbs.h:114
uint8_t pic_parameter_set_id
Definition cbs_h264.h:336
int8_t slice_qp_delta
Definition cbs_h264.h:396
H264RawSliceHeader header
Definition cbs_h264.h:409
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
Definition h263dsp.c:29
static AVFormatContext * ctx
Definition movenc.c:49