[vlc-devel] [PATCH 1/2] Add a trivial hevc packetizer
Rafaël Carré
funman at videolan.org
Tue Feb 11 08:17:47 CET 2014
Hello,
.git/rebase-apply/patch:278: new blank line at EOF.
+
warning: 1 line adds whitespace errors.
On 02/11/14 01:00, Denis Charmet wrote:
> +/****************************************************************************
> + * Local prototypes
> + ****************************************************************************/
This is not a prototype
> +struct decoder_sys_t
> +{
> + /* */
> + packetizer_t packetizer;
> +
> + bool b_vcl;
> + block_t *p_frame;
> +
> +};
> +
> +/* NAL types from https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.265-201304-I!!PDF-E&type=items */
> +enum nal_unit_type_e
> +{
> + TRAIL_N = 0,
> + TRAIL_R = 1,
> + TSA_N = 2,
> + TSA_R = 3,
> + STSA_N = 4,
> + STSA_R = 5,
> + RADL_N = 6,
> + RADL_R = 7,
> + RASL_N = 8,
> + RASL_R = 9,
> + /* 10 to 15 reserved */
> + /* Key frames */
> + BLA_W_LP = 16,
> + BLA_W_RADL = 17,
> + BLA_N_LP = 18,
> + IDR_W_RADL = 19,
> + IDR_N_LP = 20,
> + CRA = 21,
> + /* 22 to 31 reserved */
> + /* Non VCL NAL*/
> + VPS = 32,
> + SPS = 33,
> + PPS = 34,
> + AUD = 35, /* Access unit delimiter */
> + EOS = 36, /* End of sequence */
> + EOB = 37, /* End of bitstream */
> + FD = 38, /* Filler data*/
> + PREF_SEI = 39, /* Prefix SEI */
> + SUFF_SEI = 40, /* Suffix SEI */
> + UNKNOWN_NAL
> +};
Do we need this enum?
Only VPS is ever used for < comparison.
> +static block_t *Packetize(decoder_t *, block_t **);
> +
> +static void PacketizeReset(void *p_private, bool b_broken);
> +static block_t *PacketizeParse(void *p_private, bool *pb_ts_used, block_t *);
> +static int PacketizeValidate(void *p_private, block_t *);
> +
> +static const uint8_t p_hevc_startcode[3] = {0x00, 0x00, 0x01};
> +
> +/*****************************************************************************
> + * Open
> + *****************************************************************************/
> +static int Open(vlc_object_t *p_this)
> +{
> + decoder_t *p_dec = (decoder_t*)p_this;
> + decoder_sys_t *p_sys;
> +
> + if (p_dec->fmt_in.i_codec != VLC_CODEC_HEVC)
> + return VLC_EGENERIC;
> +
> + if ((p_dec->p_sys = p_sys = calloc(1, sizeof(decoder_sys_t))) == NULL)
> + return VLC_ENOMEM;
Personally I don't like assignement in comparison, especially if the
p_sys variable is
only used once (you could use p_dec->p_sys directly).
> + packetizer_Init(&p_sys->packetizer,
> + p_hevc_startcode, sizeof(p_hevc_startcode),
> + NULL, 0, 0,
> + PacketizeReset, PacketizeParse, PacketizeValidate, p_dec);
> +
> + /* Copy properties */
> + es_format_Copy(&p_dec->fmt_out, &p_dec->fmt_in);
> + p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
es_format_Copy already does this.
> + /* Set callback */
> + p_dec->pf_packetize = Packetize;
> +
> + return VLC_SUCCESS;
> +
> +}
> +static block_t *PacketizeParse(void *p_private, bool *pb_ts_used, block_t *p_block)
> +{
> + decoder_t *p_dec = p_private;
> + decoder_sys_t *p_sys = p_dec->p_sys;
> +
> + block_t * p_nal = NULL;
> +
> + while (p_block->i_buffer > 5 && p_block->p_buffer[p_block->i_buffer-1] == 0x00 )
> + p_block->i_buffer--;
> +
> + bs_t bs;
> + bs_init(&bs, p_block->p_buffer+3, p_block->i_buffer-3);
> +
> + /* Get NALU type */
> + uint32_t forbidden_zero_bit = bs_read1(&bs);
> +
> + if (forbidden_zero_bit)
> + {
> + msg_Err(p_dec,"Forbidden zero bit not null, corrupted NAL");
> + p_sys->p_frame = NULL;
> + p_sys->b_vcl = false;
> + return NULL;
> + }
> + uint32_t nalu_type = bs_read(&bs,6);
> + bs_skip(&bs, 9);
> +
> + if (nalu_type < VPS)
> + {
> + /* NAL is a VCL NAL */
> + p_sys->b_vcl = true;
> +
> + uint32_t first_slice_in_pic = bs_read1(&bs);
> +
> + if (first_slice_in_pic && p_sys->p_frame)
> + {
> + p_nal = block_ChainGather(p_sys->p_frame);
> + p_sys->p_frame = NULL;
> + }
> +
> + block_ChainAppend(&p_sys->p_frame, p_block);
> + }
> + else
> + {
> + if (p_sys->b_vcl)
> + {
> + p_nal = block_ChainGather(p_sys->p_frame);
> + p_nal->p_next = p_block;
> + p_sys->p_frame = NULL;
> + }
> + else
> + p_nal = p_block;
> +
> + p_sys->b_vcl =false;
Move inside if (p_sys->b_vcl)
> +
> + }
> +
> + *pb_ts_used = 0;
Please use false instead of 0
> + return p_nal;
> +}
More information about the vlc-devel
mailing list