FFmpeg  4.4.4
h264_redundant_pps_bsf.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 <string.h>
20 
21 #include "libavutil/common.h"
22 #include "libavutil/mem.h"
23 
24 #include "bsf.h"
25 #include "bsf_internal.h"
26 #include "cbs.h"
27 #include "cbs_bsf.h"
28 #include "cbs_h264.h"
29 #include "h264.h"
30 
31 
32 typedef struct H264RedundantPPSContext {
34 
39 
40 
42  CodedBitstreamUnit *unit)
43 {
44  H264RawPPS *pps;
45  int err;
46 
47  // The changes we are about to perform affect the parsing process,
48  // so we must make sure that the PPS is writable, otherwise the
49  // parsing of future slices will be incorrect and even raise errors.
50  err = ff_cbs_make_unit_writable(ctx->common.input, unit);
51  if (err < 0)
52  return err;
53  pps = unit->content;
54 
55  // Record the current value of pic_init_qp in order to fix up
56  // following slices, then overwrite with the global value.
57  ctx->current_pic_init_qp = pps->pic_init_qp_minus26 + 26;
58  pps->pic_init_qp_minus26 = ctx->global_pic_init_qp - 26;
59 
60  // Some PPSs have this set, so it must be set in all of them.
61  // (Slices which do not use such a PPS on input will still have
62  // *_weight_l*flag as zero and therefore write equivalently.)
63  pps->weighted_pred_flag = 1;
64 
65  return 0;
66 }
67 
69  H264RawSliceHeader *slice)
70 {
71  int qp;
72 
73  qp = ctx->current_pic_init_qp + slice->slice_qp_delta;
74  slice->slice_qp_delta = qp - ctx->global_pic_init_qp;
75 
76  return 0;
77 }
78 
80  AVPacket *pkt,
82 {
84  int au_has_sps;
85  int err, i;
86 
87  au_has_sps = 0;
88  for (i = 0; i < au->nb_units; i++) {
89  CodedBitstreamUnit *nal = &au->units[i];
90 
91  if (nal->type == H264_NAL_SPS)
92  au_has_sps = 1;
93  if (nal->type == H264_NAL_PPS) {
95  if (err < 0)
96  return err;
97  if (!au_has_sps) {
98  av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS "
99  "at %"PRId64".\n", pkt->pts);
100  ff_cbs_delete_unit(au, i);
101  i--;
102  continue;
103  }
104  }
105  if (nal->type == H264_NAL_SLICE ||
106  nal->type == H264_NAL_IDR_SLICE) {
107  H264RawSlice *slice = nal->content;
109  }
110  }
111 
112  return 0;
113 }
114 
116 {
118  ctx->current_pic_init_qp = ctx->extradata_pic_init_qp;
119 }
120 
123  .fragment_name = "access unit",
124  .unit_name = "NAL unit",
125  .update_fragment = &h264_redundant_pps_update_fragment,
126 };
127 
129 {
131 
132  ctx->global_pic_init_qp = 26;
133 
135 }
136 
137 static const enum AVCodecID h264_redundant_pps_codec_ids[] = {
139 };
140 
142  .name = "h264_redundant_pps",
143  .priv_data_size = sizeof(H264RedundantPPSContext),
146  .close = &ff_cbs_bsf_generic_close,
149 };
static enum AVCodecID codec_ids[]
static void flush(AVCodecContext *avctx)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
void ff_cbs_delete_unit(CodedBitstreamFragment *frag, int position)
Delete a unit from a fragment and free all memory it uses.
Definition: cbs.c:812
int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, CodedBitstreamUnit *unit)
Make the content of a unit writable so that internal fields can be modified.
Definition: cbs.c:1011
int ff_cbs_bsf_generic_filter(AVBSFContext *bsf, AVPacket *pkt)
Filter operation for CBS BSF.
Definition: cbs_bsf.c:63
int ff_cbs_bsf_generic_init(AVBSFContext *bsf, const CBSBSFType *type)
Initialise generic CBS BSF setup.
Definition: cbs_bsf.c:112
void ff_cbs_bsf_generic_close(AVBSFContext *bsf)
Close a generic CBS BSF instance.
Definition: cbs_bsf.c:152
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
static av_always_inline void filter(int16_t *output, ptrdiff_t out_stride, const int16_t *low, ptrdiff_t low_stride, const int16_t *high, ptrdiff_t high_stride, int len, int clip)
Definition: cfhddsp.c:27
common internal and external API header
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:46
@ AV_CODEC_ID_H264
Definition: codec_id.h:76
@ AV_CODEC_ID_NONE
Definition: codec_id.h:47
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:210
H.264 common definitions.
@ H264_NAL_PPS
Definition: h264.h:42
@ H264_NAL_SPS
Definition: h264.h:41
@ H264_NAL_SLICE
Definition: h264.h:35
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
static int h264_redundant_pps_fixup_slice(H264RedundantPPSContext *ctx, H264RawSliceHeader *slice)
const AVBitStreamFilter ff_h264_redundant_pps_bsf
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 void h264_redundant_pps_flush(AVBSFContext *bsf)
static enum AVCodecID h264_redundant_pps_codec_ids[]
int i
Definition: input.c:407
Memory handling functions.
The bitstream filter state.
Definition: bsf.h:49
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:70
const char * name
Definition: bsf.h:99
This structure stores compressed data.
Definition: packet.h:346
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:362
enum AVCodecID codec_id
Definition: cbs_bsf.h:26
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:118
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:164
int nb_units
Number of units in this fragment.
Definition: cbs.h:149
Coded bitstream unit structure.
Definition: cbs.h:66
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:103
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:70
int8_t slice_qp_delta
Definition: cbs_h264.h:355
H264RawSliceHeader header
Definition: cbs_h264.h:368
#define av_log(a,...)
AVPacket * pkt
Definition: movenc.c:59
AVFormatContext * ctx
Definition: movenc.c:48