[libav-devel] [PATCH 01/11] cbs: Always check for bitstream end before reading

2017-09-09 Thread Mark Thompson
---
 libavcodec/cbs.c   |   6 +++
 libavcodec/cbs_h2645.c | 118 -
 libavcodec/cbs_mpeg2.c |   5 ++-
 3 files changed, 67 insertions(+), 62 deletions(-)

diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
index 10943164d..744091493 100644
--- a/libavcodec/cbs.c
+++ b/libavcodec/cbs.c
@@ -313,6 +313,12 @@ int ff_cbs_read_unsigned(CodedBitstreamContext *ctx, 
BitstreamContext *bc,
 
 av_assert0(width <= 32);
 
+if (bitstream_bits_left(bc) < width) {
+av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid value at "
+   "%s: bitstream ended.\n", name);
+return AVERROR_INVALIDDATA;
+}
+
 if (ctx->trace_enable)
 position = bitstream_tell(bc);
 
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index 4d8ba99b3..c8a13f167 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -36,40 +36,39 @@ static int cbs_read_ue_golomb(CodedBitstreamContext *ctx, 
BitstreamContext *bc,
   uint32_t range_min, uint32_t range_max)
 {
 uint32_t value;
-int position;
+int position, i, j;
+unsigned int k;
+char bits[65];
 
-if (ctx->trace_enable) {
-char bits[65];
-unsigned int k;
-int i, j;
+position = bitstream_tell(bc);
 
-position = bitstream_tell(bc);
-
-for (i = 0; i < 32; i++) {
-k = bitstream_read_bit(bc);
-bits[i] = k ? '1' : '0';
-if (k)
-break;
-}
-if (i >= 32) {
-av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb "
-   "code found while reading %s: "
-   "more than 31 zeroes.\n", name);
+for (i = 0; i < 32; i++) {
+if (bitstream_bits_left(bc) < i + 1) {
+av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at "
+   "%s: bitstream ended.\n", name);
 return AVERROR_INVALIDDATA;
 }
-value = 1;
-for (j = 0; j < i; j++) {
-k = bitstream_read_bit(bc);
-bits[i + j + 1] = k ? '1' : '0';
-value = value << 1 | k;
-}
-bits[i + j + 1] = 0;
---value;
+k = bitstream_read_bit(bc);
+bits[i] = k ? '1' : '0';
+if (k)
+break;
+}
+if (i >= 32) {
+av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid ue-golomb code at "
+   "%s: more than 31 zeroes.\n", name);
+return AVERROR_INVALIDDATA;
+}
+value = 1;
+for (j = 0; j < i; j++) {
+k = bitstream_read_bit(bc);
+bits[i + j + 1] = k ? '1' : '0';
+value = value << 1 | k;
+}
+bits[i + j + 1] = 0;
+--value;
 
+if (ctx->trace_enable)
 ff_cbs_trace_syntax_element(ctx, position, name, bits, value);
-} else {
-value = get_ue_golomb_long(bc);
-}
 
 if (value < range_min || value > range_max) {
 av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
@@ -87,44 +86,43 @@ static int cbs_read_se_golomb(CodedBitstreamContext *ctx, 
BitstreamContext *bc,
   int32_t range_min, int32_t range_max)
 {
 int32_t value;
-int position;
+int position, i, j;
+unsigned int k;
+uint32_t v;
+char bits[65];
 
-if (ctx->trace_enable) {
-char bits[65];
-uint32_t v;
-unsigned int k;
-int i, j;
-
-position = bitstream_tell(bc);
+position = bitstream_tell(bc);
 
-for (i = 0; i < 32; i++) {
-k = bitstream_read_bit(bc);
-bits[i] = k ? '1' : '0';
-if (k)
-break;
-}
-if (i >= 32) {
-av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb "
-   "code found while reading %s: "
-   "more than 31 zeroes.\n", name);
+for (i = 0; i < 32; i++) {
+if (bitstream_bits_left(bc) < i + 1) {
+av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at "
+   "%s: bitstream ended.\n", name);
 return AVERROR_INVALIDDATA;
 }
-v = 1;
-for (j = 0; j < i; j++) {
-k = bitstream_read_bit(bc);
-bits[i + j + 1] = k ? '1' : '0';
-v = v << 1 | k;
-}
-bits[i + j + 1] = 0;
-if (v & 1)
-value = -(int32_t)(v / 2);
-else
-value = v / 2;
+k = bitstream_read_bit(bc);
+bits[i] = k ? '1' : '0';
+if (k)
+break;
+}
+if (i >= 32) {
+av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid se-golomb code at "
+   "%s: more than 31 zeroes.\n", name);
+return AVERROR_INVALIDDATA;
+}
+v = 1;
+for (j = 0; j < i; j++) {
+k = bitstream_read_bit(bc);
+bits[i + j + 1] = k ? '1' : '0';
+v = v << 1 | k;
+}
+bits[i + j + 1] = 0;
+if (v & 1)
+value = -(int32_t)(v / 2);
+else
+ 

[libav-devel] [PATCH 05/11] vaapi_h264: Fix CPB/DPB delays

2017-09-09 Thread Mark Thompson
This should be ticks, not time_scale steps - it was wrong for all
framerates not a multiple of 1/2.
---
Apparently I only encode things with framerate a multiple of 1/2.  The
CBS writer catches this immediately for NTSC video - the values are out
of range when multiplied by 1001.


 libavcodec/vaapi_encode_h264.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 271644ebb..1288249be 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -612,10 +612,8 @@ static int 
vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
 if (opt->sei & SEI_TIMING) {
 memset(>pic_timing, 0, sizeof(priv->pic_timing));
 
-priv->pic_timing.cpb_removal_delay =
-2 * sps->vui.num_units_in_tick * priv->cpb_delay;
-priv->pic_timing.dpb_output_delay =
-2 * sps->vui.num_units_in_tick * priv->dpb_delay;
+priv->pic_timing.cpb_removal_delay = 2 * priv->cpb_delay;
+priv->pic_timing.dpb_output_delay  = 2 * priv->dpb_delay;
 
 priv->sei_needed = 1;
 }
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 06/11] cbs_h265: Fix reading of unknown parameter set extension data

2017-09-09 Thread Mark Thompson
---
 libavcodec/cbs_h265_syntax_template.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libavcodec/cbs_h265_syntax_template.c 
b/libavcodec/cbs_h265_syntax_template.c
index 40fdaf8a9..8564220d5 100644
--- a/libavcodec/cbs_h265_syntax_template.c
+++ b/libavcodec/cbs_h265_syntax_template.c
@@ -67,7 +67,8 @@ static int FUNC(extension_data)(CodedBitstreamContext *ctx, 
RWContext *rw,
 BitstreamContext start;
 uint8_t bit;
 start = *rw;
-for (k = 0; cbs_h2645_read_more_rbsp_data(rw); k++);
+for (k = 0; cbs_h2645_read_more_rbsp_data(rw); k++)
+bitstream_skip(rw, 1);
 current->bit_length = k;
 if (k > 0) {
 *rw = start;
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 11/11] vaapi_mpeg2: Convert to use coded bitstream infrastructure

2017-09-09 Thread Mark Thompson
---
 configure   |   2 +-
 libavcodec/vaapi_encode_mpeg2.c | 638 ++--
 2 files changed, 424 insertions(+), 216 deletions(-)

diff --git a/configure b/configure
index c24cdd4f7..7728cd6de 100755
--- a/configure
+++ b/configure
@@ -2301,7 +2301,7 @@ mpeg2_mmal_decoder_deps="mmal"
 mpeg2_qsv_decoder_select="qsvdec mpeg2_qsv_hwaccel mpegvideo_parser"
 mpeg2_qsv_encoder_select="qsvenc"
 mpeg2_vaapi_encoder_deps="VAEncPictureParameterBufferMPEG2"
-mpeg2_vaapi_encoder_select="vaapi_encode"
+mpeg2_vaapi_encoder_select="cbs_mpeg2 vaapi_encode"
 mpeg4_omx_encoder_deps="omx"
 vc1_mmal_decoder_deps="mmal"
 vc1_qsv_decoder_select="qsvdec vc1_qsv_hwaccel vc1_parser"
diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c
index 634178521..8b956eb3e 100644
--- a/libavcodec/vaapi_encode_mpeg2.c
+++ b/libavcodec/vaapi_encode_mpeg2.c
@@ -20,15 +20,11 @@
 #include 
 
 #include "libavutil/avassert.h"
-#include "libavutil/common.h"
-#include "libavutil/internal.h"
-#include "libavutil/opt.h"
-#include "libavutil/pixfmt.h"
 
 #include "avcodec.h"
-#include "internal.h"
-#include "mpegvideo.h"
-#include "put_bits.h"
+#include "cbs.h"
+#include "cbs_mpeg2.h"
+#include "mpeg12.h"
 #include "vaapi_encode.h"
 
 typedef struct VAAPIEncodeMPEG2Context {
@@ -39,79 +35,104 @@ typedef struct VAAPIEncodeMPEG2Context {
 int quant_p;
 int quant_b;
 
+MPEG2RawSequenceHeader sequence_header;
+MPEG2RawExtensionData  sequence_extension;
+MPEG2RawExtensionData  sequence_display_extension;
+MPEG2RawGroupOfPicturesHeader gop_header;
+MPEG2RawPictureHeader  picture_header;
+MPEG2RawExtensionData  picture_coding_extension;
+
 int64_t last_i_frame;
 
 unsigned int bit_rate;
 unsigned int vbv_buffer_size;
+
+AVRational frame_rate;
+
+unsigned int f_code_horizontal;
+unsigned int f_code_vertical;
+
+CodedBitstreamContext cbc;
+CodedBitstreamFragment current_fragment;
 } VAAPIEncodeMPEG2Context;
 
 
-#define vseq_var(name)  vseq->name, name
-#define vseqext_field(name) vseq->sequence_extension.bits.name, name
-#define vgop_field(name)vseq->gop_header.bits.name, name
-#define vpic_var(name)  vpic->name, name
-#define vpcext_field(name)  vpic->picture_coding_extension.bits.name, name
-#define vcomp_field(name)   vpic->composite_display.bits.name, name
+static int vaapi_encode_mpeg2_write_fragment(AVCodecContext *avctx,
+ char *data, size_t *data_len,
+ CodedBitstreamFragment *frag)
+{
+VAAPIEncodeContext   *ctx = avctx->priv_data;
+VAAPIEncodeMPEG2Context *priv = ctx->priv_data;
+int err;
+
+err = ff_cbs_write_fragment_data(>cbc, frag);
+if (err < 0) {
+av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
+return err;
+}
+
+if (*data_len < 8 * frag->data_size - frag->data_bit_padding) {
+av_log(avctx, AV_LOG_ERROR, "Access unit too large: "
+   "%zu < %zu.\n", *data_len,
+   8 * frag->data_size - frag->data_bit_padding);
+return AVERROR(ENOSPC);
+}
+
+memcpy(data, frag->data, frag->data_size);
+*data_len = 8 * frag->data_size - frag->data_bit_padding;
+
+return 0;
+}
+
+static int vaapi_encode_mpeg2_add_header(AVCodecContext *avctx,
+ CodedBitstreamFragment *frag,
+ int type, void *header)
+{
+VAAPIEncodeContext   *ctx = avctx->priv_data;
+VAAPIEncodeMPEG2Context *priv = ctx->priv_data;
+int err;
+
+err = ff_cbs_insert_unit_content(>cbc, frag, -1, type, header);
+if (err < 0) {
+av_log(avctx, AV_LOG_ERROR, "Failed to add header: "
+   "type = %d.\n", type);
+return err;
+}
 
-#define u2(width, value, name) put_bits(, width, value)
-#define u(width, ...) u2(width, __VA_ARGS__)
+return 0;
+}
 
 static int vaapi_encode_mpeg2_write_sequence_header(AVCodecContext *avctx,
 char *data, size_t 
*data_len)
 {
-VAAPIEncodeContext *ctx = avctx->priv_data;
-VAEncSequenceParameterBufferMPEG2 *vseq = ctx->codec_sequence_params;
-VAAPIEncodeMPEG2Context   *priv = ctx->priv_data;
-PutBitContext pbc;
-
-init_put_bits(, data, 8 * *data_len);
-
-u(32, SEQ_START_CODE, sequence_header_code);
-
-u(12, vseq->picture_width,  horizontal_size_value);
-u(12, vseq->picture_height, vertical_size_value);
-u(4, vseq_var(aspect_ratio_information));
-u(4, 8, frame_rate_code);
-u(18, priv->bit_rate & 0x3fff, bit_rate_value);
-u(1, 1, marker_bit);
-u(10, priv->vbv_buffer_size & 0x3ff, vbv_buffer_size_value);
-u(1, 0, constrained_parameters_flag);
-u(1, 0, load_intra_quantiser_matrix);
-// intra_quantiser_matrix[64]
-u(1, 0, load_non_intra_quantiser_matrix);
- 

[libav-devel] [PATCH 08/11] cbs_mpeg2: Add support for picture display extension

2017-09-09 Thread Mark Thompson
---
Many of the conformance test files have it.


 libavcodec/cbs_mpeg2.h |  8 +++
 libavcodec/cbs_mpeg2_syntax_template.c | 44 ++
 2 files changed, 52 insertions(+)

diff --git a/libavcodec/cbs_mpeg2.h b/libavcodec/cbs_mpeg2.h
index 32c4d4e2b..0b6cb998d 100644
--- a/libavcodec/cbs_mpeg2.h
+++ b/libavcodec/cbs_mpeg2.h
@@ -160,6 +160,11 @@ typedef struct MPEG2RawQuantMatrixExtension {
 uint8_t chroma_non_intra_quantiser_matrix[64];
 } MPEG2RawQuantMatrixExtension;
 
+typedef struct MPEG2RawPictureDisplayExtension {
+uint16_t frame_centre_horizontal_offset[3];
+uint16_t frame_centre_vertical_offset[3];
+} MPEG2RawPictureDisplayExtension;
+
 typedef struct MPEG2RawExtensionData {
 uint8_t extension_start_code;
 uint8_t extension_start_code_identifier;
@@ -169,6 +174,7 @@ typedef struct MPEG2RawExtensionData {
 MPEG2RawSequenceDisplayExtension sequence_display;
 MPEG2RawQuantMatrixExtension quant_matrix;
 MPEG2RawPictureCodingExtension picture_coding;
+MPEG2RawPictureDisplayExtension picture_display;
 } data;
 } MPEG2RawExtensionData;
 
@@ -206,6 +212,8 @@ typedef struct CodedBitstreamMPEG2Context {
 uint16_t vertical_size;
 uint8_t scalable;
 uint8_t scalable_mode;
+uint8_t progressive_sequence;
+uint8_t number_of_frame_centre_offsets;
 
 // Write buffer.
 uint8_t *write_buffer;
diff --git a/libavcodec/cbs_mpeg2_syntax_template.c 
b/libavcodec/cbs_mpeg2_syntax_template.c
index b6dd42d2e..4aa1eb3c0 100644
--- a/libavcodec/cbs_mpeg2_syntax_template.c
+++ b/libavcodec/cbs_mpeg2_syntax_template.c
@@ -101,6 +101,7 @@ static int FUNC(sequence_extension)(CodedBitstreamContext 
*ctx, RWContext *rw,
 current->horizontal_size_extension << 12;
 mpeg2->vertical_size = (mpeg2->vertical_size & 0xfff) |
 current->vertical_size_extension << 12;
+mpeg2->progressive_sequence = current->progressive_sequence;
 
 ui(12, bit_rate_extension);
 marker_bit();
@@ -183,6 +184,7 @@ static int FUNC(picture_header)(CodedBitstreamContext *ctx, 
RWContext *rw,
 static int FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, 
RWContext *rw,
   MPEG2RawPictureCodingExtension 
*current)
 {
+CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
 int err;
 
 HEADER("Picture Coding Extension");
@@ -204,6 +206,27 @@ static int 
FUNC(picture_coding_extension)(CodedBitstreamContext *ctx, RWContext
 ui(1, chroma_420_type);
 ui(1, progressive_frame);
 
+if (mpeg2->progressive_sequence) {
+if (current->repeat_first_field) {
+if (current->top_field_first)
+mpeg2->number_of_frame_centre_offsets = 3;
+else
+mpeg2->number_of_frame_centre_offsets = 2;
+} else {
+mpeg2->number_of_frame_centre_offsets = 1;
+}
+} else {
+if (current->picture_structure == 1 || // Top field.
+current->picture_structure == 2) { // Bottom field.
+mpeg2->number_of_frame_centre_offsets = 1;
+} else {
+if (current->repeat_first_field)
+mpeg2->number_of_frame_centre_offsets = 3;
+else
+mpeg2->number_of_frame_centre_offsets = 2;
+}
+}
+
 ui(1, composite_display_flag);
 if (current->composite_display_flag) {
 ui(1, v_axis);
@@ -250,6 +273,24 @@ static int 
FUNC(quant_matrix_extension)(CodedBitstreamContext *ctx, RWContext *r
 return 0;
 }
 
+static int FUNC(picture_display_extension)(CodedBitstreamContext *ctx, 
RWContext *rw,
+   MPEG2RawPictureDisplayExtension 
*current)
+{
+CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data;
+int err, i;
+
+HEADER("Picture Display Extension");
+
+for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
+ui(16, frame_centre_horizontal_offset[i]);
+marker_bit();
+ui(16, frame_centre_vertical_offset[i]);
+marker_bit();
+}
+
+return 0;
+}
+
 static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw,
 MPEG2RawExtensionData *current)
 {
@@ -270,6 +311,9 @@ static int FUNC(extension_data)(CodedBitstreamContext *ctx, 
RWContext *rw,
 case 3:
 return FUNC(quant_matrix_extension)
 (ctx, rw, >data.quant_matrix);
+case 7:
+return FUNC(picture_display_extension)
+(ctx, rw, >data.picture_display);
 case 8:
 return FUNC(picture_coding_extension)
 (ctx, rw, >data.picture_coding);
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 03/11] h264_metadata: Fix double-free

2017-09-09 Thread Mark Thompson
Whether the udu string should be freed depends on whether the SEI it
gets added to was created internally by cbs or externally by the bsf.
The current code frees it twice in the former case.
---
 libavcodec/h264_metadata_bsf.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c
index 9bf96b397..1afa5014b 100644
--- a/libavcodec/h264_metadata_bsf.c
+++ b/libavcodec/h264_metadata_bsf.c
@@ -293,7 +293,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket 
*out)
 H264RawSEI *sei;
 H264RawSEIPayload *payload;
 H264RawSEIUserDataUnregistered *udu;
-int sei_pos;
+int sei_pos, sei_new;
 
 for (i = 0; i < au->nb_units; i++) {
 if (au->units[i].type == H264_NAL_SEI ||
@@ -305,8 +305,10 @@ static int h264_metadata_filter(AVBSFContext *bsf, 
AVPacket *out)
 
 if (sei_pos < au->nb_units &&
 au->units[sei_pos].type == H264_NAL_SEI) {
+sei_new = 0;
 sei = au->units[sei_pos].content;
 } else {
+sei_new = 1;
 sei = >sei_nal;
 memset(sei, 0, sizeof(*sei));
 
@@ -354,6 +356,12 @@ static int h264_metadata_filter(AVBSFContext *bsf, 
AVPacket *out)
 
 payload->payload_size = 16 + udu->data_length;
 
+if (!sei_new) {
+// This will be freed by the existing internal
+// reference in fragment_uninit().
+sei_udu_string = NULL;
+}
+
 } else {
 invalid_user_data:
 av_log(bsf, AV_LOG_ERROR, "Invalid user data: "
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 04/11] Revert "vaapi_h265: Reduce the amount of padding in the stream"

2017-09-09 Thread Mark Thompson
This reverts commit a14a12ca137bf1526452b97bedfc9f7b301d4e04.

The CTU size is always 32x32; the surface size is what actually sets
the desired property, and it is already correct.
---
 libavcodec/vaapi_encode_h265.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index 165b6ffde..477065e2c 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -815,11 +815,8 @@ static av_cold int 
vaapi_encode_h265_configure(AVCodecContext *avctx)
 if (err < 0)
 return err;
 
-// This is an Intel driver constraint.  Despite MinCbSizeY being 8,
-// we are still required to encode at 16-pixel alignment and then
-// crop back (so 1080 lines is still encoded as 1088 + cropping).
-priv->ctu_width = FFALIGN(ctx->surface_width,  16) / 16;
-priv->ctu_height= FFALIGN(ctx->surface_height, 16) / 16;
+priv->ctu_width = FFALIGN(ctx->surface_width,  32) / 32;
+priv->ctu_height= FFALIGN(ctx->surface_height, 32) / 32;
 
 av_log(avctx, AV_LOG_VERBOSE, "Input %ux%u -> Surface %ux%u -> CTU 
%ux%u.\n",
avctx->width, avctx->height, ctx->surface_width,
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 09/11] cbs: Add some read/write tests

2017-09-09 Thread Mark Thompson
Use the appropriate metadata filter for each codec - in the absence of any
options to modify the stream, the output bitstream should be identical to
the input (though the output file may differ in padding).

All tests use conformance bitstreams, the MPEG-2 streams are newly added
from the conformance test streams

---
Exact files to add to the samples are at 
, or can be found at the 
link above.

They probably want to separately have an MPEG-2 decode test as well.


 tests/Makefile|  1 +
 tests/fate/cbs.mak| 74 +++
 tests/ref/fate/cbs-h264-AUD_MW_E  |  1 +
 tests/ref/fate/cbs-h264-BASQP1_Sony_C |  1 +
 tests/ref/fate/cbs-h264-CABACI3_Sony_B|  1 +
 tests/ref/fate/cbs-h264-CVBS3_Sony_C  |  1 +
 tests/ref/fate/cbs-h264-CVFC1_Sony_C  |  1 +
 tests/ref/fate/cbs-h264-CVMANL1_TOSHIBA_B |  1 +
 tests/ref/fate/cbs-h264-CVNLFI1_Sony_C|  1 +
 tests/ref/fate/cbs-h264-CVSE2_Sony_B  |  1 +
 tests/ref/fate/cbs-h264-CVWP1_TOSHIBA_E   |  1 +
 tests/ref/fate/cbs-h264-FM1_BT_B  |  1 +
 tests/ref/fate/cbs-h264-MR1_BT_A  |  1 +
 tests/ref/fate/cbs-h264-SVA_Base_B|  1 +
 tests/ref/fate/cbs-h264-Sharp_MP_PAFF_1r2 |  1 +
 tests/ref/fate/cbs-h264-sp1_bt_a  |  1 +
 tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3  |  1 +
 tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3  |  1 +
 tests/ref/fate/cbs-hevc-CONFWIN_A_Sony_1  |  1 +
 tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2   |  1 +
 tests/ref/fate/cbs-hevc-LTRPSPS_A_Qualcomm_1  |  1 +
 tests/ref/fate/cbs-hevc-NUT_A_ericsson_5  |  1 +
 tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1|  1 +
 tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1|  1 +
 tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4 |  1 +
 tests/ref/fate/cbs-hevc-RPS_A_docomo_4|  1 +
 tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5  |  1 +
 tests/ref/fate/cbs-hevc-SLIST_A_Sony_4|  1 +
 tests/ref/fate/cbs-hevc-SLIST_D_Sony_9|  1 +
 tests/ref/fate/cbs-hevc-STRUCT_A_Samsung_5|  1 +
 tests/ref/fate/cbs-hevc-TILES_B_Cisco_1   |  1 +
 tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2 |  1 +
 tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2 |  1 +
 tests/ref/fate/cbs-hevc-WP_A_Toshiba_3|  1 +
 tests/ref/fate/cbs-hevc-ipcm_E_NEC_2  |  1 +
 tests/ref/fate/cbs-mpeg2-hhi_burst_422_short  |  1 +
 tests/ref/fate/cbs-mpeg2-sony-ct3 |  1 +
 tests/ref/fate/cbs-mpeg2-tcela-6  |  1 +
 38 files changed, 111 insertions(+)
 create mode 100644 tests/fate/cbs.mak
 create mode 100644 tests/ref/fate/cbs-h264-AUD_MW_E
 create mode 100644 tests/ref/fate/cbs-h264-BASQP1_Sony_C
 create mode 100644 tests/ref/fate/cbs-h264-CABACI3_Sony_B
 create mode 100644 tests/ref/fate/cbs-h264-CVBS3_Sony_C
 create mode 100644 tests/ref/fate/cbs-h264-CVFC1_Sony_C
 create mode 100644 tests/ref/fate/cbs-h264-CVMANL1_TOSHIBA_B
 create mode 100644 tests/ref/fate/cbs-h264-CVNLFI1_Sony_C
 create mode 100644 tests/ref/fate/cbs-h264-CVSE2_Sony_B
 create mode 100644 tests/ref/fate/cbs-h264-CVWP1_TOSHIBA_E
 create mode 100644 tests/ref/fate/cbs-h264-FM1_BT_B
 create mode 100644 tests/ref/fate/cbs-h264-MR1_BT_A
 create mode 100644 tests/ref/fate/cbs-h264-SVA_Base_B
 create mode 100644 tests/ref/fate/cbs-h264-Sharp_MP_PAFF_1r2
 create mode 100644 tests/ref/fate/cbs-h264-sp1_bt_a
 create mode 100644 tests/ref/fate/cbs-hevc-CAINIT_E_SHARP_3
 create mode 100644 tests/ref/fate/cbs-hevc-CAINIT_H_SHARP_3
 create mode 100644 tests/ref/fate/cbs-hevc-CONFWIN_A_Sony_1
 create mode 100644 tests/ref/fate/cbs-hevc-HRD_A_Fujitsu_2
 create mode 100644 tests/ref/fate/cbs-hevc-LTRPSPS_A_Qualcomm_1
 create mode 100644 tests/ref/fate/cbs-hevc-NUT_A_ericsson_5
 create mode 100644 tests/ref/fate/cbs-hevc-PICSIZE_A_Bossen_1
 create mode 100644 tests/ref/fate/cbs-hevc-PICSIZE_B_Bossen_1
 create mode 100644 tests/ref/fate/cbs-hevc-RPLM_A_qualcomm_4
 create mode 100644 tests/ref/fate/cbs-hevc-RPS_A_docomo_4
 create mode 100644 tests/ref/fate/cbs-hevc-RPS_E_qualcomm_5
 create mode 100644 tests/ref/fate/cbs-hevc-SLIST_A_Sony_4
 create mode 100644 tests/ref/fate/cbs-hevc-SLIST_D_Sony_9
 create mode 100644 tests/ref/fate/cbs-hevc-STRUCT_A_Samsung_5
 create mode 100644 tests/ref/fate/cbs-hevc-TILES_B_Cisco_1
 create mode 100644 tests/ref/fate/cbs-hevc-WPP_A_ericsson_MAIN_2
 create mode 100644 tests/ref/fate/cbs-hevc-WPP_F_ericsson_MAIN_2
 create mode 100644 tests/ref/fate/cbs-hevc-WP_A_Toshiba_3
 create mode 100644 tests/ref/fate/cbs-hevc-ipcm_E_NEC_2
 create mode 100644 tests/ref/fate/cbs-mpeg2-hhi_burst_422_short
 create mode 100644 tests/ref/fate/cbs-mpeg2-sony-ct3
 create mode 100644 tests/ref/fate/cbs-mpeg2-tcela-6

diff --git a/tests/Makefile b/tests/Makefile
index d3f11efaa..9fec13211 

[libav-devel] [PATCH 10/11] mpeg12: Move finding the best frame rate to common code

2017-09-09 Thread Mark Thompson
Previously in the mpeg2_metadata filter.  Also adds a test.
---
 libavcodec/Makefile|  1 +
 libavcodec/mpeg12.h|  4 ++
 libavcodec/mpeg12framerate.c   | 64 
 libavcodec/mpeg2_metadata_bsf.c| 58 +++--
 libavcodec/tests/mpeg12framerate.c | 87 ++
 tests/fate/libavcodec.mak  |  5 +++
 6 files changed, 166 insertions(+), 53 deletions(-)
 create mode 100644 libavcodec/tests/mpeg12framerate.c

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 9c485b222..c750abd2d 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -824,6 +824,7 @@ TESTPROGS-$(CONFIG_FFT)   += fft fft-fixed
 TESTPROGS-$(CONFIG_GOLOMB)+= golomb
 TESTPROGS-$(CONFIG_IDCTDSP)   += dct
 TESTPROGS-$(CONFIG_IIRFILTER) += iirfilter
+TESTPROGS-$(CONFIG_MPEGVIDEO) += mpeg12framerate
 TESTPROGS-$(CONFIG_RANGECODER)+= rangecoder
 
 TESTOBJS = dctref.o
diff --git a/libavcodec/mpeg12.h b/libavcodec/mpeg12.h
index 17f0b781e..26de7a48a 100644
--- a/libavcodec/mpeg12.h
+++ b/libavcodec/mpeg12.h
@@ -64,4 +64,8 @@ void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t 
block[8][64],
 void ff_mpeg1_encode_init(MpegEncContext *s);
 void ff_mpeg1_encode_slice_header(MpegEncContext *s);
 
+void ff_mpeg12_find_best_frame_rate(AVRational frame_rate,
+int *code, int *ext_n, int *ext_d,
+int nonstandard);
+
 #endif /* AVCODEC_MPEG12_H */
diff --git a/libavcodec/mpeg12framerate.c b/libavcodec/mpeg12framerate.c
index b11dd5e01..acfef0974 100644
--- a/libavcodec/mpeg12framerate.c
+++ b/libavcodec/mpeg12framerate.c
@@ -18,6 +18,9 @@
 
 #include "libavutil/rational.h"
 
+#include "mpeg12.h"
+#include "mpeg12data.h"
+
 const AVRational ff_mpeg12_frame_rate_tab[16] = {
 {0,0},
 {24000, 1001},
@@ -37,3 +40,64 @@ const AVRational ff_mpeg12_frame_rate_tab[16] = {
 {   15,1},
 {0,0},
 };
+
+void ff_mpeg12_find_best_frame_rate(AVRational frame_rate,
+int *code, int *ext_n, int *ext_d,
+int nonstandard)
+{
+int mpeg2 = ext_n && ext_d;
+int max_code = nonstandard ? 12 : 8;
+int c, n, d, best_c, best_n, best_d;
+AVRational best_error = { INT_MAX, 1 };
+
+// Default to NTSC if the inputs make no sense.
+best_c = 4;
+best_n = best_d = 1;
+
+for (c = 1; c <= max_code; c++) {
+if (av_cmp_q(frame_rate, ff_mpeg12_frame_rate_tab[c]) == 0) {
+best_c = c;
+goto found;
+}
+}
+
+for (c = 1; c <= max_code; c++) {
+for (n = 1; n <= (mpeg2 ? 4 : 1); n++) {
+for (d = 1; d <= (mpeg2 ? 32 : 1); d++) {
+AVRational test, error;
+int cmp;
+
+test = av_mul_q(ff_mpeg12_frame_rate_tab[c],
+(AVRational) { n, d });
+
+cmp = av_cmp_q(test, frame_rate);
+if (cmp == 0) {
+best_c = c;
+best_n = n;
+best_d = d;
+goto found;
+}
+
+if (cmp < 0)
+error = av_div_q(frame_rate, test);
+else
+error = av_div_q(test, frame_rate);
+
+cmp = av_cmp_q(error, best_error);
+if (cmp < 0 || (cmp == 0 && n == 1 && d == 1)) {
+best_c = c;
+best_n = n;
+best_d = d;
+best_error = error;
+}
+}
+}
+}
+
+found:
+*code = best_c;
+if (mpeg2) {
+*ext_n = best_n - 1;
+*ext_d = best_d - 1;
+}
+}
diff --git a/libavcodec/mpeg2_metadata_bsf.c b/libavcodec/mpeg2_metadata_bsf.c
index 80e946f58..5dae481d3 100644
--- a/libavcodec/mpeg2_metadata_bsf.c
+++ b/libavcodec/mpeg2_metadata_bsf.c
@@ -23,6 +23,7 @@
 #include "bsf.h"
 #include "cbs.h"
 #include "cbs_mpeg2.h"
+#include "mpeg12.h"
 
 typedef struct MPEG2MetadataContext {
 const AVClass *class;
@@ -99,63 +100,14 @@ static int mpeg2_metadata_update_fragment(AVBSFContext 
*bsf,
 }
 
 if (ctx->frame_rate.num && ctx->frame_rate.den) {
-// Table 6-4.
-static AVRational frame_rate_table[] = {
-{ 0, 0 },
-{ 24000, 1001 },
-{ 24,1},
-{ 25,1},
-{ 3, 1001 },
-{ 30,1},
-{ 50,1},
-{ 6, 1001 },
-{ 60,1},
-};
 int code, ext_n, ext_d;
-AVRational best_error = { INT_MAX, 1 };
-
-for (i = 1; i < FF_ARRAY_ELEMS(frame_rate_table); i++) {
-if (av_cmp_q(ctx->frame_rate, frame_rate_table[i]) == 0) {
-code  = i;
-

[libav-devel] [PATCH 07/11] cbs_h265: Fix ranges of prediction weight offsets

2017-09-09 Thread Mark Thompson
The bracketing was wrong - '-' binds before '<<'.  This would
previously incorrectly reject the streams in the WP_A and WP_B
conformance tests.
---
 libavcodec/cbs_h265_syntax_template.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libavcodec/cbs_h265_syntax_template.c 
b/libavcodec/cbs_h265_syntax_template.c
index 8564220d5..a194887d7 100644
--- a/libavcodec/cbs_h265_syntax_template.c
+++ b/libavcodec/cbs_h265_syntax_template.c
@@ -1133,7 +1133,7 @@ static int FUNC(pred_weight_table)(CodedBitstreamContext 
*ctx, RWContext *rw,
 se(delta_luma_weight_l0[i], -128, +127);
 se(luma_offset_l0[i],
-(1 << (sps->bit_depth_luma_minus8 + 8 - 1)),
-   +(1 << (sps->bit_depth_luma_minus8 + 8 - 1) - 1));
+   ((1 << (sps->bit_depth_luma_minus8 + 8 - 1)) - 1));
 } else {
 infer(delta_luma_weight_l0[i], 0);
 infer(luma_offset_l0[i],   0);
@@ -1143,7 +1143,7 @@ static int FUNC(pred_weight_table)(CodedBitstreamContext 
*ctx, RWContext *rw,
 se(delta_chroma_weight_l0[i][j], -128, +127);
 se(chroma_offset_l0[i][j],
-(4 << (sps->bit_depth_chroma_minus8 + 8 - 1)),
-   +(4 << (sps->bit_depth_chroma_minus8 + 8 - 1) - 1));
+   ((4 << (sps->bit_depth_chroma_minus8 + 8 - 1)) - 1));
 }
 } else {
 for (j = 0; j < 2; j++) {
@@ -1173,8 +1173,8 @@ static int FUNC(pred_weight_table)(CodedBitstreamContext 
*ctx, RWContext *rw,
 if (current->luma_weight_l1_flag[i]) {
 se(delta_luma_weight_l1[i], -128, +127);
 se(luma_offset_l1[i],
-   - 1 << (sps->bit_depth_luma_minus8 + 8 - 1),
-   + 1 << (sps->bit_depth_luma_minus8 + 8 - 1) - 1);
+   -(1 << (sps->bit_depth_luma_minus8 + 8 - 1)),
+   ((1 << (sps->bit_depth_luma_minus8 + 8 - 1)) - 1));
 } else {
 infer(delta_luma_weight_l1[i], 0);
 infer(luma_offset_l1[i],   0);
@@ -1183,8 +1183,8 @@ static int FUNC(pred_weight_table)(CodedBitstreamContext 
*ctx, RWContext *rw,
 for (j = 0; j < 2; j++) {
 se(delta_chroma_weight_l1[i][j], -128, +127);
 se(chroma_offset_l1[i][j],
-   - 4 << (sps->bit_depth_chroma_minus8 + 8 - 1),
-   + 4 << (sps->bit_depth_chroma_minus8 + 8 - 1) - 1);
+   -(4 << (sps->bit_depth_chroma_minus8 + 8 - 1)),
+   ((4 << (sps->bit_depth_chroma_minus8 + 8 - 1)) - 1));
 }
 } else {
 for (j = 0; j < 2; j++) {
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH 02/11] cbs: Add buffer padding when splitting fragments

2017-09-09 Thread Mark Thompson
Remove any trailing zeroes from H.26[45] NAL units at the same time.
---
 libavcodec/cbs_h2645.c | 11 +--
 libavcodec/cbs_mpeg2.c |  3 ++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index c8a13f167..50a227da7 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -479,12 +479,19 @@ static int 
cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx,
 
 for (i = 0; i < packet->nb_nals; i++) {
 const H2645NAL *nal = >nals[i];
+size_t size = nal->size;
 uint8_t *data;
 
-data = av_malloc(nal->size);
+// Remove trailing zeroes.
+while (size > 0 && nal->data[size - 1] == 0)
+--size;
+av_assert0(size > 0);
+
+data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
 if (!data)
 return AVERROR(ENOMEM);
-memcpy(data, nal->data, nal->size);
+memcpy(data, nal->data, size);
+memset(data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
 err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
   data, nal->size);
diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
index cbee42e90..3c09377df 100644
--- a/libavcodec/cbs_mpeg2.c
+++ b/libavcodec/cbs_mpeg2.c
@@ -131,10 +131,11 @@ static int cbs_mpeg2_split_fragment(CodedBitstreamContext 
*ctx,
 unit_size = (end - 4) - (start - 1);
 }
 
-unit_data = av_malloc(unit_size);
+unit_data = av_malloc(unit_size + AV_INPUT_BUFFER_PADDING_SIZE);
 if (!unit_data)
 return AVERROR(ENOMEM);
 memcpy(unit_data, start - 1, unit_size);
+memset(unit_data + unit_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
 err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
   unit_data, unit_size);
-- 
2.11.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel