Re: [FFmpeg-devel] [PATCH 00/21] New Version

2019-04-06 Thread Steve Lhomme

Hi,

On 3/27/2019 12:18 PM, Andreas Rheinhardt wrote:

This also changed the handling of unknown-sized elements: They are now
ended whenever an element not known to be allowed in them is
encountered. If we are already on level 1 and encounter an element not
known to be allowed in an unknown-sized segment, this is treated as an
indication that an error might have occured. I hope this is fine.


I haven't looked at the code yet, but an unknown element doesn't mean 
it's an upper level element. I think it should be either skipped or 
considered as bad data. If it's a known element but complitely misplaced 
it should not be going upper in the hierarchy. Only when a valid upper 
element it should go up in the hierarchy.




Dale's sample "bear-320x240-live.webm" btw has cues at the end that use
unknown-sized elements (wastefully coded on eight bytes) for CuePoints and
CueTrackPositions which is spec-incompliant. They are not referenced by
a SeekHead and so can't be used for seeking, but if they were, neither
current FFmpeg nor FFmpeg with my patches applied would be able to use
them. Are such files common (this is the first such file I ever saw)?
If so, I could probably make it work.


If CuePoints are not referenced by the SeekHead at the front of the file 
(or the indirect SeekHead) they are useless anyway.




I have cced Steve for this (I didn't the first time, because I
thought that he (as a maintainer) would also be a subscriber to this
list).


I am subscribed but not the maintainer. In fact I know little about this 
code.



Oh, and I did not check with Valgrind that the new lacing code doesn't
read uninitialized data. I don't even know how to use Valgrind. I just
read the code. If someone more knowledgeable than I could please test
it...


You might also use LLVM with ASAN (address sanitizer) it's helpfull for 
this (or so I have been told).

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 05/21] avformat/matroskadec: Set offset of first cluster

2019-04-06 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

By default, the data_offset member of the AVFormatInternal of the
AVFormatContext associated with the MatroskaDemuxContext has not been
initialized explicitly by any Matroska-specific function, so that it was
initialized by default to the offset at the end of matroska_read_header,
i.e. usually to the offset of the length field of the first encountered
cluster. This meant that in case that the Matroska-specific seek-code
fails because there are no index entries for the target track a seek to
data_offset would be performed and ordinary parsing would start from
there which is nonsense: The length field would be treated as EBML ID and
(if the length field is not longer than four bytes (EBML numbers that
long are rejected as invalid EBML IDs)) and whatever comes next would be
treated as its EBML size although it simply isn't.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 3 +++
  1 file changed, 3 insertions(+)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 49f8ff4082..f9811b54a1 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2651,6 +2651,9 @@ static int matroska_read_header(AVFormatContext *s)
  pos = avio_tell(matroska->ctx->pb);
  res = ebml_parse(matroska, matroska_segment, matroska);
  }
+/* Set data_offset as it might be needed later by seek_frame_generic. */
+if (matroska->current_id)


I'm surprised this doesn't error out if a (level 1) ID is not found here.


+s->internal->data_offset = avio_tell(matroska->ctx->pb) - 4;


The "- 4" is OK as long as level 1 elements are always 4 bytes (which is 
the case). But if matroska_resync() ever exits if it finds an EBML Void 
or CRC-32 then this will break.


The code is safe for now but may not be future proof.


  matroska_execute_seekhead(matroska);
  
  if (!matroska->time_scale)

--
2.19.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 08/21] avformat/matroskadec: Improve error messages

2019-04-06 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

ebml_read_num had a number of flaws:

1. The check for read errors/EOF was totally wrong. E.g. an EBML number
beginning with the invalid 0x00 would be considered a read error,
although it is just invalid data.
2. The check for read errors/EOF was done just once, after reading the
first byte of the EBML number. But errors/EOF can happen inbetween, of
course, and this wasn't checked.
3. There was no way to distinguish when EOF should be an error (because
the data has to be there) for which an error message should be emitted
and when it is not necessarily an error (namely during parsing of EBML
IDs). Such a possibility has been added and used.


Maybe the title of the patch should rather mention that it's fixing the 
EOF handling when reading EBML ID/Length. The changed error messages is 
a less important consequence.





Some useless initializations were also fixed.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 61 ++-
  1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index a6617a607b..aa2266384a 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -820,29 +820,19 @@ static int ebml_level_end(MatroskaDemuxContext *matroska)
   * Returns: number of bytes read, < 0 on error
   */
  static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
- int max_size, uint64_t *number)
+ int max_size, uint64_t *number, int eof_forbidden)
  {
-int read = 1, n = 1;
-uint64_t total = 0;
+int read, n = 1;
+uint64_t total;
+int64_t pos;
  
-/* The first byte tells us the length in bytes - avio_r8() can normally

- * return 0, but since that's not a valid first ebmlID byte, we can
- * use it safely here to catch EOS. */
-if (!(total = avio_r8(pb))) {
-/* we might encounter EOS here */
-if (!avio_feof(pb)) {
-int64_t pos = avio_tell(pb);
-av_log(matroska->ctx, AV_LOG_ERROR,
-   "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
-   pos, pos);
-return pb->error ? pb->error : AVERROR(EIO);
-}
-return AVERROR_EOF;
-}
+/* The first byte tells us the length in bytes - except when it is zero. */
+total = avio_r8(pb);
+if (avio_feof(pb))
+goto err;
  
  /* get the length of the EBML number */

-read = 8 - ff_log2_tab[total];
-if (read > max_size) {
+if (!total || (read = 8 - ff_log2_tab[total]) > max_size) {
  int64_t pos = avio_tell(pb) - 1;
  av_log(matroska->ctx, AV_LOG_ERROR,
 "Invalid EBML number size tag 0x%02x at pos %"PRIu64" 
(0x%"PRIx64")\n",
@@ -855,9 +845,27 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, 
AVIOContext *pb,
  while (n++ < read)
  total = (total << 8) | avio_r8(pb);
  
+if (avio_feof(pb)) {

+eof_forbidden = 1;
+goto err;
+}


You're forcing an error if the data ends after reading a number ? Ending 
a Matroska file with a number should be fine. It could also be an 
element with a size of 0. It doesn't contain any data but it's still 
valid (depending on the semantic of the element).


So this forced error seem wrong. Let the next read catch the EOF if it 
finds one.



+
  *number = total;
  
  return read;

+
+err:
+pos = avio_tell(pb);
+if (pb->error) {
+av_log(matroska->ctx, AV_LOG_ERROR,
+   "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
+   pos, pos);
+return pb->error;
+}
+if (eof_forbidden)
+av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
+   "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);


If eof_forbidden is false (EOF allowed) you return an EOF error anyway ?


+return AVERROR_EOF;
  }
  
  /**

@@ -868,7 +876,7 @@ static int ebml_read_num(MatroskaDemuxContext *matroska, 
AVIOContext *pb,
  static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
  uint64_t *number)
  {
-int res = ebml_read_num(matroska, pb, 8, number);
+int res = ebml_read_num(matroska, pb, 8, number, 1);
  if (res > 0 && *number + 1 == 1ULL << (7 * res))
  *number = EBML_UNKNOWN_LENGTH;
  return res;
@@ -1010,7 +1018,7 @@ static int matroska_ebmlnum_uint(MatroskaDemuxContext 
*matroska,
  {
  AVIOContext pb;
  ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
-return ebml_read_num(matroska, &pb, FFMIN(size, 8), num);
+return ebml_read_num(matroska, &pb, FFMIN(size, 8), num, 1);
  }
  
  /*

@@ -1057,7 +1065,7 @@ static int ebml_parse(MatroskaDemuxContext *matroska, 
EbmlSyntax *syntax,
  {
  if (!matroska->current_id) {
  uint64_t id;
-int res = ebml_read_num(matroska, matroska->ctx->pb

Re: [FFmpeg-devel] [PATCH 10/21] avformat/matroskadec: Don't keep old blocks

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

Before this commit, the Matroska muxer would read a block when required
to do so, parse the block, create and return the necessary AVPackets and
yet keep the blocks (in a dynamically allocated list), although they
aren't used at all any more. This has been changed. There is no list any
more and the block is immediately discarded after parsing.


My understanding of the code is that the blocks are put in a queue, 
that's whatwebm_clusters_start_with_keyframe() uses to check that the 
first frame is a keyframe (it doesn't check the type of the frame 
though...). But since there's only one read 
inmatroska_parse_cluster_incremental()there's only one kept in memory.


So LGTM.



Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 87 +--
  1 file changed, 38 insertions(+), 49 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 9198fa1bea..997c96d78f 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -304,9 +304,20 @@ typedef struct MatroskaLevel {
  uint64_t length;
  } MatroskaLevel;
  
+typedef struct MatroskaBlock {

+uint64_t duration;
+int64_t  reference;
+uint64_t non_simple;
+EbmlBin  bin;
+uint64_t additional_id;
+EbmlBin  additional;
+int64_t discard_padding;
+} MatroskaBlock;
+
  typedef struct MatroskaCluster {
+MatroskaBlock block;
  uint64_t timecode;
-EbmlList blocks;
+int64_t pos;
  } MatroskaCluster;
  
  typedef struct MatroskaLevel1Element {

@@ -356,8 +367,6 @@ typedef struct MatroskaDemuxContext {
  MatroskaLevel1Element level1_elems[64];
  int num_level1_elems;
  
-int current_cluster_num_blocks;

-int64_t current_cluster_pos;
  MatroskaCluster current_cluster;
  
  /* WebM DASH Manifest live flag */

@@ -367,16 +376,6 @@ typedef struct MatroskaDemuxContext {
  int bandwidth;
  } MatroskaDemuxContext;
  
-typedef struct MatroskaBlock {

-uint64_t duration;
-int64_t  reference;
-uint64_t non_simple;
-EbmlBin  bin;
-uint64_t additional_id;
-EbmlBin  additional;
-int64_t discard_padding;
-} MatroskaBlock;
-
  static const EbmlSyntax ebml_header[] = {
  { EBML_ID_EBMLREADVERSION,EBML_UINT, 0, offsetof(Ebml, version),  
   { .u = EBML_VERSION } },
  { EBML_ID_EBMLMAXSIZELENGTH,  EBML_UINT, 0, offsetof(Ebml, max_size), 
   { .u = 8 } },
@@ -705,9 +704,9 @@ static const EbmlSyntax matroska_blockgroup[] = {
  };
  
  static const EbmlSyntax matroska_cluster_parsing[] = {

-{ MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, 
offsetof(MatroskaCluster, timecode) },
-{ MATROSKA_ID_BLOCKGROUP,  EBML_NEST, sizeof(MatroskaBlock), 
offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
-{ MATROSKA_ID_SIMPLEBLOCK, EBML_PASS, sizeof(MatroskaBlock), 
offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
+{ MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, offsetof(MatroskaCluster, 
timecode) },
+{ MATROSKA_ID_BLOCKGROUP,  EBML_NEST, 0, 0, { .n = matroska_blockgroup 
} },
+{ MATROSKA_ID_SIMPLEBLOCK, EBML_PASS, 0, 0, { .n = matroska_blockgroup 
} },
  { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
  { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
  { MATROSKA_ID_INFO,EBML_NONE },
@@ -3443,57 +3442,48 @@ end:
  
  static int matroska_parse_cluster(MatroskaDemuxContext *matroska)

  {
-EbmlList *blocks_list;
-MatroskaBlock *blocks;
-int i, res;
+MatroskaCluster *cluster = &matroska->current_cluster;
+MatroskaBlock *block = &cluster->block;
+int res;
  res = ebml_parse(matroska,
   matroska_cluster_parsing,
- &matroska->current_cluster);
+ cluster);
  if (res == 1) {
  /* New Cluster */
-if (matroska->current_cluster_pos)
+if (cluster->pos)
  ebml_level_end(matroska);
-ebml_free(matroska_cluster_parsing, &matroska->current_cluster);
-memset(&matroska->current_cluster, 0, sizeof(MatroskaCluster));
-matroska->current_cluster_num_blocks = 0;
-matroska->current_cluster_pos= avio_tell(matroska->ctx->pb);
+cluster->pos = avio_tell(matroska->ctx->pb);
  /* sizeof the ID which was already read */
  if (matroska->current_id)
-matroska->current_cluster_pos -= 4;
+cluster->pos -= 4;
  res = ebml_parse(matroska,
   matroska_clusters,
- &matroska->current_cluster);
+ cluster);
  /* Try parsing the block again. */
  if (res == 1)
  res = ebml_parse(matroska,
   matroska_cluster_parsing,
- &matroska->current_cluster);
+ cluster);
  }
 

Re: [FFmpeg-devel] [PATCH 13/21] avformat/matroskadec: Improve length check

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

The earlier code had three flaws:

1. The case of an unknown-sized element inside a finite-sized element
(which is against the specifications) was not caught.

2. The error message wasn't helpful: It compared the length of the child
with the offset of the end of the parent and claimed that the first
exceeds the latter, although that is not necessarily true.

3. Unknown-sized elements that are not parsed can't be skipped. Given
that according to the Matroska specifications only the segment and the
clusters can be of unknown-size, this is handled by not allowing any


This restriction is rather new. There might be old files that use 
infinite sizes in other places.



other units to have infinite size whereas the earlier code would seek
back by 1 byte upon encountering an infinite-size element that ought
to be skipped.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 26 ++
  1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 6fa324c0cc..0179e5426e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1180,11 +1180,29 @@ static int ebml_parse_elem(MatroskaDemuxContext 
*matroska,
  if (matroska->num_levels > 0) {
  MatroskaLevel *level = &matroska->levels[matroska->num_levels - 
1];
  int64_t pos = avio_tell(pb);
-if (level->length != EBML_UNKNOWN_LENGTH &&
-(pos + length) > (level->start + level->length)) {
+
+if (length != EBML_UNKNOWN_LENGTH &&
+level->length != EBML_UNKNOWN_LENGTH) {
+uint64_t elem_end = pos + length,
+level_end = level->start + level->length;
+
+if (level_end < elem_end) {
+av_log(matroska->ctx, AV_LOG_ERROR,
+   "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds 
"
+   "containing master element ending at 0x%"PRIx64"\n",
+   pos, elem_end, level_end);
+return AVERROR_INVALIDDATA;
+}
+} else if (level->length != EBML_UNKNOWN_LENGTH) {
+av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
+   "at 0x%"PRIx64" inside parent with finite size\n", pos);
+return AVERROR_INVALIDDATA;


IMO there's no reason to return an error here. You can log the error and 
still parse the data, it should end up fine (if the code is done as such 
that you can never read past your parents boundaries). At least libebml 
can deal with that.



+} else if (length == EBML_UNKNOWN_LENGTH && id != 
MATROSKA_ID_CLUSTER) {
+// According to the specifications only clusters and segments
+// are allowed to be unknown-sized.
  av_log(matroska->ctx, AV_LOG_ERROR,
-   "Invalid length 0x%"PRIx64" > 0x%"PRIx64" in parent\n",
-   length, level->start + level->length);
+   "Found unknown-sized element other than a cluster at "
+   "0x%"PRIx64". Dropping the invalid element.\n", pos);
  return AVERROR_INVALIDDATA;
  }
  }
--
2.19.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 14/21] avformat/matroskadec: Use proper levels after discontínuity

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

The earlier code set the level to zero upon seeking and after a
discontinuity although in both cases parsing (re)starts at a level 1
element.

Also set the segment's length to unkown if an error occured in order not
to drop any valid data that happens to be beyond the designated end of
the segment.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 59 +++
  1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 0179e5426e..42f1c21042 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -737,13 +737,24 @@ static const char *const matroska_doctypes[] = { "matroska", 
"webm" };
  
  static int matroska_read_close(AVFormatContext *s);
  
+static int matroska_reset_status(MatroskaDemuxContext *matroska,

+ uint32_t id, int64_t position)
+{
+matroska->current_id = id;
+matroska->num_levels = 1;
+matroska->current_cluster.pos = 0;
+
+if (position >= 0)
+return avio_seek(matroska->ctx->pb, position, SEEK_SET);
+
+return 0;
+}
+


I think you should have done this commit in 2 parts.
- adding matroska_reset_status() and do exactly what was done before
- add changes related to the level and unknown length/discontinuity.


  static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
  {
  AVIOContext *pb = matroska->ctx->pb;
  int64_t ret;
  uint32_t id;
-matroska->current_id = 0;
-matroska->num_levels = 0;
  
  /* seek to next position to resync from */

  if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) {
@@ -759,7 +770,14 @@ static int matroska_resync(MatroskaDemuxContext *matroska, 
int64_t last_pos)
  id == MATROSKA_ID_CUES || id == MATROSKA_ID_TAGS||
  id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS ||
  id == MATROSKA_ID_CLUSTER  || id == MATROSKA_ID_CHAPTERS) {
-matroska->current_id = id;
+/* Prepare the context for further parsing of a level 1 element. */
+matroska_reset_status(matroska, id, -1);


You set num_levels to 1 now, leaving this function used to have 
num_levels set to 0. I'm not sure it's correct or not.



+
+/* Given that we are here means that an error has occured,


I thought this function was meant to find a level1 ID after getting into 
a Segment. This does not seem like an error at all.



+ * so treat the segment as unknown length in order not to
+ * discard valid data that happens to be beyond the designated
+ * end of the segment. */
+matroska->levels[0].length = EBML_UNKNOWN_LENGTH;
  return 0;
  }
  id = (id << 8) | avio_r8(pb);
@@ -1610,18 +1628,12 @@ static int 
matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
  matroska->current_id   = 0;
  
  ret = ebml_parse(matroska, matroska_segment, matroska);

-
-/* remove dummy level */
-while (matroska->num_levels) {
-uint64_t length = 
matroska->levels[--matroska->num_levels].length;
-if (length == EBML_UNKNOWN_LENGTH)
-break;
-}


I think this code indicates unknown length was handled in a seekhead 
entry, probably because such files exist. Making the assumption in 13/21 
about unknown length only on Segment+Cluster incorrect.



  }
  }
-/* seek back */
-avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
-matroska->current_id = saved_id;
+
+/* Seek back - notice that in all instances where this is used it is safe
+ * to set the level to 1 and unset the position of the current cluster. */
+matroska_reset_status(matroska, saved_id, before_pos);
  
  return ret;

  }
@@ -3535,9 +3547,7 @@ static int matroska_read_seek(AVFormatContext *s, int 
stream_index,
  timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);
  
  if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) {

-avio_seek(s->pb, st->index_entries[st->nb_index_entries - 1].pos,
-  SEEK_SET);
-matroska->current_id = 0;
+matroska_reset_status(matroska, 0, 
st->index_entries[st->nb_index_entries - 1].pos);
  while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || 
index == st->nb_index_entries - 1) {
  matroska_clear_queue(matroska);
  if (matroska_parse_cluster(matroska) < 0)
@@ -3557,8 +3567,8 @@ static int matroska_read_seek(AVFormatContext *s, int 
stream_index,
  tracks[i].end_timecode = 0;
  }
  
-avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET);

-matroska->current_id   = 0;
+/* We seek to a level 1 elemen

Re: [FFmpeg-devel] [PATCH 15/21] avformat/matroskadec: Redo level handling

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

This commit changes how levels are handled: If the level used for
ebml_parse ends directly after an element that has been consumed, then
ebml_parse ends the level itself (and any finite-sized levels that end
there as well) and informs the caller via the return value; if the
current level is unknown-sized, then the level is ended as soon as
an element that is not valid on the current level is encountered.

This is designed for situations where one wants to parse master elements
incrementally, i.e. not in one go via ebml_parse_nest.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 104 +++---
  1 file changed, 85 insertions(+), 19 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 42f1c21042..32cf57685f 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -69,6 +69,8 @@
  #include "qtpalette.h"
  
  #define EBML_UNKNOWN_LENGTH  UINT64_MAX /* EBML unknown length, in uint64_t */

+#define LEVEL_ENDED   2 /* return value of ebml_parse when the
+ * syntax level used for parsing 
ended. */
  
  typedef enum {

  EBML_NONE,
@@ -1041,16 +1043,32 @@ static int ebml_parse_id(MatroskaDemuxContext 
*matroska, EbmlSyntax *syntax,
   uint32_t id, void *data)
  {
  int i;
+
  for (i = 0; syntax[i].id; i++)
  if (id == syntax[i].id)
  break;
-if (!syntax[i].id && id == MATROSKA_ID_CLUSTER &&
-matroska->num_levels > 0   &&
-matroska->levels[matroska->num_levels - 1].length == 
EBML_UNKNOWN_LENGTH)
-return 0;  // we reached the end of an unknown size cluster
+
  if (!syntax[i].id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
-av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32"\n", id);
+if (!matroska->num_levels || matroska->levels[matroska->num_levels - 
1].length
+!= 
EBML_UNKNOWN_LENGTH) {
+av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32"\n", 
id);


Would this mean a Segment with unknown length would produce this log ? 
Or Segments are not part of the levels at all ? If so, same question 
with level 1 elements which have an unknown length.



+} else if (matroska->num_levels > 1) {
+// Unknown-sized master elements (except root elements) end
+// when an id not known to be allowed in them is encountered.
+matroska->num_levels--;
+return LEVEL_ENDED;
+} else if (matroska->num_levels == 1) {
+AVIOContext *pb = matroska->ctx->pb;
+int64_t pos = avio_tell(pb);
+// An unkown level 1 element inside an unknown-sized segment
+// is considered an error.
+av_log(matroska->ctx, AV_LOG_ERROR, "Found unknown element id 
0x%"PRIX32
+   " at pos. %"PRIu64" (0x%"PRIx64") in an unknown-sized segment. 
"
+   "Will be treated as error.\n", id, pos, pos);
+return AVERROR_INVALIDDATA;
+}
  }
+
  return ebml_parse_elem(matroska, &syntax[i], data);
  }
  
@@ -1061,9 +1079,24 @@ static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,

  uint64_t id;
  int res = ebml_read_num(matroska, matroska->ctx->pb, 4, &id, 0);
  if (res < 0) {
-// in live mode, finish parsing if EOF is reached.
-return (matroska->is_live && matroska->ctx->pb->eof_reached &&
-res == AVERROR_EOF) ? 1 : res;
+if (matroska->ctx->pb->eof_reached && res == AVERROR_EOF) {
+if (matroska->is_live)
+// in live mode, finish parsing if EOF is reached.
+return 1;
+if (matroska->num_levels) {
+MatroskaLevel *level = 
&matroska->levels[matroska->num_levels - 1];
+
+if (level->length == EBML_UNKNOWN_LENGTH) {
+// Unknown-sized elements automatically end at EOF.
+matroska->num_levels = 0;
+return LEVEL_ENDED;
+} else if (avio_tell(matroska->ctx->pb) < level->start + 
level->length) {
+av_log(matroska->ctx, AV_LOG_ERROR, "File ended before 
"
+   "its declared end\n");
+}
+}
+}
+return res;
  }
  matroska->current_id = id | 1 << 7 * res;
  }
@@ -1098,10 +1131,15 @@ static int ebml_parse_nest(MatroskaDemuxContext 
*matroska, EbmlSyntax *syntax,
  break;
  }
  
-while (!res && !ebml_level_end(matroska))

+if (!matroska->levels[matroska->num_levels - 1].length) {
+matroska->num_levels--;
+retur

Re: [FFmpeg-devel] [PATCH 18/21] avformat/matroskadec: Combine two arrays

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

By including SimpleBlocks and Blocksgroups twice in the same EbmlSyntax
array (with different semantics), one can reduce the duplication of the
other values.

Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroskadec.c | 13 +++--
  1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 3adcb3e86d..60f58cefa9 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -704,25 +704,18 @@ static const EbmlSyntax matroska_blockgroup[] = {
  };
  
  static const EbmlSyntax matroska_cluster_parsing[] = {

-{ MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, offsetof(MatroskaCluster, 
timecode) },
-{ MATROSKA_ID_BLOCKGROUP,  EBML_NEST, 0, 0, { .n = matroska_blockgroup 
} },
  { MATROSKA_ID_SIMPLEBLOCK, EBML_BIN,  0, offsetof(MatroskaBlock, bin) 
},
-{ MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
-{ MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
-{ 0 }
-};
-
-static const EbmlSyntax matroska_cluster_initial[] = {
+{ MATROSKA_ID_BLOCKGROUP,  EBML_NEST, 0, 0, { .n = matroska_blockgroup 
} },
  { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, offsetof(MatroskaCluster, 
timecode) },
-{ MATROSKA_ID_BLOCKGROUP,  EBML_STOP },
  { MATROSKA_ID_SIMPLEBLOCK, EBML_STOP },
+{ MATROSKA_ID_BLOCKGROUP,  EBML_STOP },
  { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
  { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
  { 0 }
  };
  
  static const EbmlSyntax matroska_cluster_enter[] = {

-{ MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, { .n = 
matroska_cluster_initial } },
+{ MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, { .n = 
&matroska_cluster_parsing[2] } },


To avoid breaking this optimisation when the code is changed you might 
use some static_assert to make sure that matroska_cluster_parsing[2].id 
is MATROSKA_ID_CLUSTERTIMECODE

  { 0 }
  };
  
--

2.19.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 19/21] avformat/matroskadec: Add SilentTracks to cluster syntax

2019-04-07 Thread Steve Lhomme

On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:

This is important as unknown-sized elements end upon encountering an
unknown EBML ID.


That's the problem with this approach. Noone is allowed to use their own 
custom tags (RAWCooked for example) and the unknown length feature. You 
have to know every element in the world for this not to break.




Signed-off-by: Andreas Rheinhardt 
---
  libavformat/matroska.h| 1 +
  libavformat/matroskadec.c | 1 +
  2 files changed, 2 insertions(+)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 86968a8de1..43fea595b6 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -224,6 +224,7 @@
  #define MATROSKA_ID_CLUSTERTIMECODE 0xE7
  #define MATROSKA_ID_CLUSTERPOSITION 0xA7
  #define MATROSKA_ID_CLUSTERPREVSIZE 0xAB
+#define MATROSKA_ID_SILENTTRACKS 0x5854
  #define MATROSKA_ID_BLOCKGROUP 0xA0
  #define MATROSKA_ID_BLOCKADDITIONS 0x75A1
  #define MATROSKA_ID_BLOCKMORE 0xA6
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 60f58cefa9..c1feb3f0a1 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -711,6 +711,7 @@ static const EbmlSyntax matroska_cluster_parsing[] = {
  { MATROSKA_ID_BLOCKGROUP,  EBML_STOP },
  { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
  { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
+{ MATROSKA_ID_SILENTTRACKS,EBML_NONE },
  { 0 }
  };
  
--

2.19.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 08/21] avformat/matroskadec: Improve error messages

2019-04-07 Thread Steve Lhomme
> On April 7, 2019 at 11:24 AM Andreas Rheinhardt via ffmpeg-devel 
>  wrote:
> 
> 
> Steve Lhomme:
> > On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:
> >> ebml_read_num had a number of flaws:
> >>
> >> 1. The check for read errors/EOF was totally wrong. E.g. an EBML number
> >> beginning with the invalid 0x00 would be considered a read error,
> >> although it is just invalid data.
> >> 2. The check for read errors/EOF was done just once, after reading the
> >> first byte of the EBML number. But errors/EOF can happen inbetween, of
> >> course, and this wasn't checked.
> >> 3. There was no way to distinguish when EOF should be an error (because
> >> the data has to be there) for which an error message should be emitted
> >> and when it is not necessarily an error (namely during parsing of EBML
> >> IDs). Such a possibility has been added and used.
> > 
> > Maybe the title of the patch should rather mention that it's fixing
> > the EOF handling when reading EBML ID/Length. The changed error
> > messages is a less important consequence.
> > 
> How about "avformat/matroskadec: Improve (in particular) EOF checks"?
> > 
> >>
> >> Some useless initializations were also fixed.
> >>
> >> Signed-off-by: Andreas Rheinhardt 
> >> ---
> >>   libavformat/matroskadec.c | 61
> >> ++-
> >>   1 file changed, 34 insertions(+), 27 deletions(-)
> >>
> >> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> >> index a6617a607b..aa2266384a 100644
> >> --- a/libavformat/matroskadec.c
> >> +++ b/libavformat/matroskadec.c
> >> @@ -820,29 +820,19 @@ static int ebml_level_end(MatroskaDemuxContext
> >> *matroska)
> >>    * Returns: number of bytes read, < 0 on error
> >>    */
> >>   static int ebml_read_num(MatroskaDemuxContext *matroska,
> >> AVIOContext *pb,
> >> - int max_size, uint64_t *number)
> >> + int max_size, uint64_t *number, int
> >> eof_forbidden)
> >>   {
> >> -    int read = 1, n = 1;
> >> -    uint64_t total = 0;
> >> +    int read, n = 1;
> >> +    uint64_t total;
> >> +    int64_t pos;
> >>   -    /* The first byte tells us the length in bytes - avio_r8()
> >> can normally
> >> - * return 0, but since that's not a valid first ebmlID byte, we
> >> can
> >> - * use it safely here to catch EOS. */
> >> -    if (!(total = avio_r8(pb))) {
> >> -    /* we might encounter EOS here */
> >> -    if (!avio_feof(pb)) {
> >> -    int64_t pos = avio_tell(pb);
> >> -    av_log(matroska->ctx, AV_LOG_ERROR,
> >> -   "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
> >> -   pos, pos);
> >> -    return pb->error ? pb->error : AVERROR(EIO);
> >> -    }
> >> -    return AVERROR_EOF;
> >> -    }
> >> +    /* The first byte tells us the length in bytes - except when it
> >> is zero. */
> >> +    total = avio_r8(pb);
> >> +    if (avio_feof(pb))
> >> +    goto err;
> >>     /* get the length of the EBML number */
> >> -    read = 8 - ff_log2_tab[total];
> >> -    if (read > max_size) {
> >> +    if (!total || (read = 8 - ff_log2_tab[total]) > max_size) {
> >>   int64_t pos = avio_tell(pb) - 1;
> >>   av_log(matroska->ctx, AV_LOG_ERROR,
> >>  "Invalid EBML number size tag 0x%02x at pos
> >> %"PRIu64" (0x%"PRIx64")\n",
> >> @@ -855,9 +845,27 @@ static int ebml_read_num(MatroskaDemuxContext
> >> *matroska, AVIOContext *pb,
> >>   while (n++ < read)
> >>   total = (total << 8) | avio_r8(pb);
> >>   +    if (avio_feof(pb)) {
> >> +    eof_forbidden = 1;
> >> +    goto err;
> >> +    }
> > 
> > You're forcing an error if the data ends after reading a number ?
> > Ending a Matroska file with a number should be fine. It could also be
> > an element with a size of 0. It doesn't contain any data but it's
> > still valid (depending on the semantic of the element).
> > 
> > So this forced error seem wrong. Let the next read catch the EOF if it
> > finds one.
> > 
> av

Re: [FFmpeg-devel] [PATCH 10/21] avformat/matroskadec: Don't keep old blocks

2019-04-07 Thread Steve Lhomme
> On April 7, 2019 at 11:38 AM Andreas Rheinhardt via ffmpeg-devel 
>  wrote:
> 
> 
> Steve Lhomme:
> > On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:
> >> Before this commit, the Matroska muxer would read a block when required
> >> to do so, parse the block, create and return the necessary AVPackets
> >> and
> >> yet keep the blocks (in a dynamically allocated list), although they
> >> aren't used at all any more. This has been changed. There is no list
> >> any
> >> more and the block is immediately discarded after parsing.
> > 
> > My understanding of the code is that the blocks are put in a queue,
> 
> Yes, the parsed blocks are put in a queue of their own; so we don't
> need to keep all the raw data of all the already parsed blocks of the
> current cluster around. (Refcounting means that some of this data
> might be keep a little longer though, but even in this case this patch
> eliminates e.g. the constant reallocation of the list of blocks.)
> 
> > that's whatwebm_clusters_start_with_keyframe() uses to check that the
> > first frame is a keyframe
> 
> Yes.
> 
> > (it doesn't check the type of the frame though...).
> 
> I see a "if (!(pkt->flags & AV_PKT_FLAG_KEY))" in there.

By type I meant audio/video/subtitle. Although in WebM originally the audio was 
supposed to be put before the corresponding audio. So this code checks if the 
first audio packet is a keyframe. I don't think that's the intention of this 
code. But that's not related to your patch.

> > But since there's only one read
> > inmatroska_parse_cluster_incremental()there's only one kept in memory.
> > 
> > So LGTM.
> > 
> >>
> >> Signed-off-by: Andreas Rheinhardt 
> >> ---
> >>   libavformat/matroskadec.c | 87
> >> +--
> >>   1 file changed, 38 insertions(+), 49 deletions(-)
> >>
> >> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> >> index 9198fa1bea..997c96d78f 100644
> >> --- a/libavformat/matroskadec.c
> >> +++ b/libavformat/matroskadec.c
> >> @@ -304,9 +304,20 @@ typedef struct MatroskaLevel {
> >>   uint64_t length;
> >>   } MatroskaLevel;
> >>   +typedef struct MatroskaBlock {
> >> +    uint64_t duration;
> >> +    int64_t  reference;
> >> +    uint64_t non_simple;
> >> +    EbmlBin  bin;
> >> +    uint64_t additional_id;
> >> +    EbmlBin  additional;
> >> +    int64_t discard_padding;
> >> +} MatroskaBlock;
> >> +
> >>   typedef struct MatroskaCluster {
> >> +    MatroskaBlock block;
> >>   uint64_t timecode;
> >> -    EbmlList blocks;
> >> +    int64_t pos;
> >>   } MatroskaCluster;
> >>     typedef struct MatroskaLevel1Element {
> >> @@ -356,8 +367,6 @@ typedef struct MatroskaDemuxContext {
> >>   MatroskaLevel1Element level1_elems[64];
> >>   int num_level1_elems;
> >>   -    int current_cluster_num_blocks;
> >> -    int64_t current_cluster_pos;
> >>   MatroskaCluster current_cluster;
> >>     /* WebM DASH Manifest live flag */
> >> @@ -367,16 +376,6 @@ typedef struct MatroskaDemuxContext {
> >>   int bandwidth;
> >>   } MatroskaDemuxContext;
> >>   -typedef struct MatroskaBlock {
> >> -    uint64_t duration;
> >> -    int64_t  reference;
> >> -    uint64_t non_simple;
> >> -    EbmlBin  bin;
> >> -    uint64_t additional_id;
> >> -    EbmlBin  additional;
> >> -    int64_t discard_padding;
> >> -} MatroskaBlock;
> >> -
> >>   static const EbmlSyntax ebml_header[] = {
> >>   { EBML_ID_EBMLREADVERSION,    EBML_UINT, 0, offsetof(Ebml,
> >> version), { .u = EBML_VERSION } },
> >>   { EBML_ID_EBMLMAXSIZELENGTH,  EBML_UINT, 0, offsetof(Ebml,
> >> max_size),    { .u = 8 } },
> >> @@ -705,9 +704,9 @@ static const EbmlSyntax matroska_blockgroup[] = {
> >>   };
> >>     static const EbmlSyntax matroska_cluster_parsing[] = {
> >> -    { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT,
> >> 0, offsetof(MatroskaCluster, timecode) },
> >> -    { MATROSKA_ID_BLOCKGROUP,  EBML_NEST,
> >> sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n =
> >> matroska_blockgroup } },
> >> -    { MATROSKA_ID_SIMPLEBLOCK, EBML_PASS,
> >> sizeof(MatroskaBlock), offsetof(Matr

Re: [FFmpeg-devel] [PATCH 13/21] avformat/matroskadec: Improve length check

2019-04-07 Thread Steve Lhomme

> On April 7, 2019 at 12:54 PM Andreas Rheinhardt via ffmpeg-devel 
>  wrote:
> 
> 
> Steve Lhomme:
> > On 3/27/2019 12:18 PM, Andreas Rheinhardt via ffmpeg-devel wrote:
> >> The earlier code had three flaws:
> >>
> >> 1. The case of an unknown-sized element inside a finite-sized element
> >> (which is against the specifications) was not caught.
> >>
> >> 2. The error message wasn't helpful: It compared the length of the
> >> child
> >> with the offset of the end of the parent and claimed that the first
> >> exceeds the latter, although that is not necessarily true.
> >>
> >> 3. Unknown-sized elements that are not parsed can't be skipped. Given
> >> that according to the Matroska specifications only the segment and the
> >> clusters can be of unknown-size, this is handled by not allowing any
> > 
> > This restriction is rather new. There might be old files that use
> > infinite sizes in other places.
> > 
> Indeed there are. The file mentioned by Dale
> (https://ffmpeg.org/pipermail/ffmpeg-devel/2019-February/240376.html;
> https://cs.chromium.org/chromium/src/media/test/data/bear-320x240-live.webm)
> has cues where every master element (even CueTrackPositions) are
> written as unknown-sized element (with length fields coded on eight
> bytes). The Cues aren't referenced in a Seekhead at the beginning
> though, so that FFmpeg doesn't try to read them. If they were
> referenced, neither current nor patched FFmpeg would be able to
> properly parse them and patched FFmpeg would furthermore give an error
> message.
> 
> When exactly has this restriction been enacted?

That would be 35e0909ef4fc34ca7cb15adba5e7c7ebf5daeacb in the Matroska 
specifications (2016/10/31). Before that any master element was allowed to use 
the unknown length feature. Now only Segment and Cluster are. Given WebM is 
based on the Matroska specifications on matroska.org I would assume they don't 
have this restriction yet.

> I'll see if I find a way to support such elements (although I am not
> sure whether it is worthwhile).
> 
> >> other units to have infinite size whereas the earlier code would seek
> >> back by 1 byte upon encountering an infinite-size element that ought
> >> to be skipped.
> >>
> >> Signed-off-by: Andreas Rheinhardt 
> >> ---
> >>   libavformat/matroskadec.c | 26 ++
> >>   1 file changed, 22 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> >> index 6fa324c0cc..0179e5426e 100644
> >> --- a/libavformat/matroskadec.c
> >> +++ b/libavformat/matroskadec.c
> >> @@ -1180,11 +1180,29 @@ static int
> >> ebml_parse_elem(MatroskaDemuxContext *matroska,
> >>   if (matroska->num_levels > 0) {
> >>   MatroskaLevel *level =
> >> &matroska->levels[matroska->num_levels - 1];
> >>   int64_t pos = avio_tell(pb);
> >> -    if (level->length != EBML_UNKNOWN_LENGTH &&
> >> -    (pos + length) > (level->start + level->length)) {
> >> +
> >> +    if (length != EBML_UNKNOWN_LENGTH &&
> >> +    level->length != EBML_UNKNOWN_LENGTH) {
> >> +    uint64_t elem_end = pos + length,
> >> +    level_end = level->start + level->length;
> >> +
> >> +    if (level_end < elem_end) {
> >> +    av_log(matroska->ctx, AV_LOG_ERROR,
> >> +   "Element at 0x%"PRIx64" ending at
> >> 0x%"PRIx64" exceeds "
> >> +   "containing master element ending at
> >> 0x%"PRIx64"\n",
> >> +   pos, elem_end, level_end);
> >> +    return AVERROR_INVALIDDATA;
> >> +    }
> >> +    } else if (level->length != EBML_UNKNOWN_LENGTH) {
> >> +    av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized
> >> element "
> >> +   "at 0x%"PRIx64" inside parent with finite
> >> size\n", pos);
> >> +    return AVERROR_INVALIDDATA;
> > 
> > IMO there's no reason to return an error here. You can log the error
> > and still parse the data, it should end up fine (if the code is done
> > as such that you can never read past your parents boundaries)

Re: [FFmpeg-devel] [PATCH 00/21] New Version

2019-04-08 Thread Steve Lhomme
> On April 7, 2019 at 8:56 PM Andreas Rheinhardt via ffmpeg-devel 
>  wrote:
> 
> 
> Hello,
> 
> thanks for taking the time to review this. Much appreciated.
> 
> Steve Lhomme:
> > Hi,
> > 
> > On 3/27/2019 12:18 PM, Andreas Rheinhardt wrote:
> >> This also changed the handling of unknown-sized elements: They are now
> >> ended whenever an element not known to be allowed in them is
> >> encountered. If we are already on level 1 and encounter an element not
> >> known to be allowed in an unknown-sized segment, this is treated as an
> >> indication that an error might have occured. I hope this is fine.
> > 
> > I haven't looked at the code yet, but an unknown element doesn't mean
> > it's an upper level element. I think it should be either skipped or
> > considered as bad data. If it's a known element but complitely
> > misplaced it should not be going upper in the hierarchy. Only when a
> > valid upper element it should go up in the hierarchy.
> > 
> 1. Actually the current approach is equivalent to considering unknown
> elements in an unknown-sized element as bad data: If a new ID isn't in
> the current syntax list, then we treat this as an indication that the
> current level ended and test with the next higher level and so on
> until we arrive at level 1. If it then isn't a valid level 1 element,
> then it is being treated as an error.
> 
> 2. But as you have said (in your last mail), this approach won't work
> with extensions like RAWCooked. So a check for whether an element is
> from a higher level needs to be implemented and unknown elements with
> finite size should be skipped.
> 
> 3. But there are practical complications:
> a) If an error occurred, then it is possible that we encounter garbage
> that looks like a very big unknown element. I'd image that trying to
> skip it might very well lead to problems, in particular in case of
> livestreaming. So there should be a sanity check for this, i.e. very
> big unknown elements should be considered as errors.

In libebml when we read an element we read the ID and length at once and verify 
that the length is valid for that ID (based on its type) and its parent 
(doesn't go over the boundary if there is one). If an element is unknown (known 
at a different level is considered unknown) with a valid size then we either 
keep it as such or consider it's an error (that's a flag when reading telling 
which behavior we want). That's basically like choosing between a strict 
respect of the specs or allow extensions/customization. By default the more 
relaxed approach should be used in a reader, so keeping the elements as unknown.

If the direct parent (Cluster) doesn't have a known size and you encounter some 
unknown IDs, you have no way to know if the data are correct or not. Given 
unknown length/live streaming already imposes restrictions on what elements are 
allowed, it would be OK to assume that anything outside of known elements is an 
error. But considering it's bad data and wait for known data would work as 
well. In any case you're not going to make use of the data (unlike libebml 
which may be used to track/report such cases) it doesn't really matter which 
way you decide to use.

> b) And it is also possible that we encounter quite a few possibly
> legal unknown elements (that are skipped) in a row. I think it's
> reasonable to view this as an indication that an error occurred, too.
> How long should these chains of unknown elements be for it to trigger
> this error? Three? Four? Five?
> c) In both cases, resyncing should begin at the last known good
> position, not at the current position.

You can't resync during live streaming which is what the unknown length feature 
is for. But then I don't know if the current demuxer code is ready for that. In 
VLC I had to use a stream filter disabling seeking to make sure we never try to 
seek during live streaming.

> Do you agree with me regarding 2. and 3.?

Yes, with my additional remarks.

> 4. Would it actually be legal for an extension like RAWCooked to
> implement new potentially unknown-sized elements? I haven't found
> anything on this topic that says it is illegal, so I presume it is
> legal. But it shouldn't be IMO if it wants to be an extension that can
> be played by normal players (that don't know these extra elements), as
> unknown-sized elements simply can't be skipped. I wouldn't know how to
> handle them other than resyncing to the next known level 1 element, so
> it would be nice not to have to worry about unknown master elements
> with unknown size.

That's probably something to discuss on the CELLAR mailing list. I don&#

[FFmpeg-devel] [PATCH] avcodec/hevcdec: set the SEI parameters early on the AVCodecContext

2019-05-24 Thread Steve Lhomme
It's better to do it before the buffers are actually created. At least in VLC
we currently don't support changing some parameters dynamically easily so we
don't use the information if it comes after the buffer are created.

Co-authored-by: James Almer 
---
The same problem may exist with H264 alternative_transfer but I don't have a
sample to test with and the code seems a bit different.
---
 libavcodec/hevcdec.c | 18 +++---
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 515b346535..f54f46aa5d 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -313,6 +313,7 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, 
GetBitContext *gb)
 static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets 
*ps,
  const HEVCSPS *sps)
 {
+const HEVCContext *s = avctx->priv_data;
 const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
 const HEVCWindow *ow = &sps->output_window;
 unsigned int num = 0, den = 0;
@@ -355,6 +356,16 @@ static void export_stream_params(AVCodecContext *avctx, 
const HEVCParamSets *ps,
 if (num != 0 && den != 0)
 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
   num, den, 1 << 30);
+
+if (s->sei.a53_caption.a53_caption) {
+avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
+}
+
+if (s->sei.alternative_transfer.present &&
+
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
+s->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
+avctx->color_trc = 
s->sei.alternative_transfer.preferred_transfer_characteristics;
+}
 }
 
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
@@ -2775,13 +2786,6 @@ static int set_side_data(HEVCContext *s)
 memcpy(sd->data, s->sei.a53_caption.a53_caption, 
s->sei.a53_caption.a53_caption_size);
 av_freep(&s->sei.a53_caption.a53_caption);
 s->sei.a53_caption.a53_caption_size = 0;
-s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
-}
-
-if (s->sei.alternative_transfer.present &&
-
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
-s->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
-s->avctx->color_trc = out->color_trc = 
s->sei.alternative_transfer.preferred_transfer_characteristics;
 }
 
 return 0;
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH v2] avcodec/hevcdec: set the SEI parameters early on the AVCodecContext

2019-05-27 Thread Steve Lhomme
It's better to do it before the buffers are actually created. At least in VLC
we currently don't support changing some parameters dynamically easily so we
don't use the information if it comes after the buffer are created.

Co-authored-by: James Almer 
---
The same problem may exist with H264 alternative_transfer but I don't have a
sample to test with and the code seems a bit different.

Compared to previous version:
- no handling of the cpation flag
- pass the HEVCContext to export_stream_params()
---
 libavcodec/hevcdec.c | 21 +++--
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 515b346535..f1934975d5 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -310,9 +310,10 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, 
GetBitContext *gb)
 return 0;
 }
 
-static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets 
*ps,
- const HEVCSPS *sps)
+static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
 {
+AVCodecContext *avctx = s->avctx;
+const HEVCParamSets *ps = &s->ps;
 const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
 const HEVCWindow *ow = &sps->output_window;
 unsigned int num = 0, den = 0;
@@ -355,6 +356,12 @@ static void export_stream_params(AVCodecContext *avctx, 
const HEVCParamSets *ps,
 if (num != 0 && den != 0)
 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
   num, den, 1 << 30);
+
+if (s->sei.alternative_transfer.present &&
+
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
+s->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
+avctx->color_trc = 
s->sei.alternative_transfer.preferred_transfer_characteristics;
+}
 }
 
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
@@ -447,7 +454,7 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps,
 if (ret < 0)
 goto fail;
 
-export_stream_params(s->avctx, &s->ps, sps);
+export_stream_params(s, sps);
 
 s->avctx->pix_fmt = pix_fmt;
 
@@ -2778,12 +2785,6 @@ static int set_side_data(HEVCContext *s)
 s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
 }
 
-if (s->sei.alternative_transfer.present &&
-
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
-s->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
-s->avctx->color_trc = out->color_trc = 
s->sei.alternative_transfer.preferred_transfer_characteristics;
-}
-
 return 0;
 }
 
@@ -3179,7 +3180,7 @@ static int hevc_decode_extradata(HEVCContext *s, uint8_t 
*buf, int length, int f
 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
 if (first && s->ps.sps_list[i]) {
 const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
-export_stream_params(s->avctx, &s->ps, sps);
+export_stream_params(s, sps);
 break;
 }
 }
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] avcodec/h264_slice: set the SEI parameters early on the AVCodecContext

2019-05-29 Thread Steve Lhomme
It's better to do it before the buffers are actually created. At least in VLC
we currently don't support changing some parameters dynamically easily so we
don't use the information if it comes after the buffer are created.

Co-authored-by: James Almer 
---
 libavcodec/h264_slice.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 1c9a270fb6..5ceee107a0 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1092,6 +1092,12 @@ static int h264_init_ps(H264Context *h, const 
H264SliceContext *sl, int first_sl
 h->avctx->colorspace  = sps->colorspace;
 }
 }
+
+if (h->sei.alternative_transfer.present &&
+
av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
+h->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
+h->avctx->color_trc = 
h->sei.alternative_transfer.preferred_transfer_characteristics;
+}
 }
 
 if (!h->context_initialized || must_reinit || needs_reinit) {
@@ -1332,12 +1338,6 @@ static int h264_export_frame_props(H264Context *h)
 h->sei.picture_timing.timecode_cnt = 0;
 }
 
-if (h->sei.alternative_transfer.present &&
-
av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics)
 &&
-h->sei.alternative_transfer.preferred_transfer_characteristics != 
AVCOL_TRC_UNSPECIFIED) {
-h->avctx->color_trc = cur->f->color_trc = 
h->sei.alternative_transfer.preferred_transfer_characteristics;
-}
-
 return 0;
 }
 
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] ffmpeg: release the last_frame before the decoders are closed

2018-10-16 Thread Steve Lhomme
If the decoder provides its own buffers it might not be able to release its
buffers once it has been closed. (this is the case with dav1d).
---
 fftools/ffmpeg.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index da4259a9a8..faf62475a2 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -4738,6 +4738,7 @@ static int transcode(void)
 if (ost->encoding_needed) {
 av_freep(&ost->enc_ctx->stats_in);
 }
+av_frame_unref(ost->last_frame);
 total_packets_written += ost->packets_written;
 }
 
-- 
2.17.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] ffmpeg: release the last_frame before the decoders are closed

2018-10-16 Thread Steve Lhomme

On 16/10/2018 16:59, Hendrik Leppkes wrote:

On Tue, Oct 16, 2018 at 4:02 PM James Almer  wrote:

On 10/16/2018 9:16 AM, Steve Lhomme wrote:

If the decoder provides its own buffers it might not be able to release its
buffers once it has been closed. (this is the case with dav1d).
---
  fftools/ffmpeg.c | 1 +
  1 file changed, 1 insertion(+)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index da4259a9a8..faf62475a2 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -4738,6 +4738,7 @@ static int transcode(void)
  if (ost->encoding_needed) {
  av_freep(&ost->enc_ctx->stats_in);
  }
+av_frame_unref(ost->last_frame);
  total_packets_written += ost->packets_written;
  }

I'm not against this change, but this issue should be solved within
dav1d as well. Either the caller fully owns the picture returned by
dav1d, or it doesn't. "Partially owns it while some other context is
still valid" is not really acceptable.


You can't ask any library to own content even after you have closed it 
(and potentially unloaded the DLL).



I agree. AVFrames guarantee to remain valid independently of which
component they ever came out of. So if dav1d cannot provide that,
either we need to solve that in the dav1d wrapper (ie. by keeping  an
instance to the dav1d context tied to the frame like we do for some
hardware frames), or dav1d fixes that.


If we provide a picture allocator to dav1d that wraps AVFrame we 
allocate it should not be an issue. We would own them no matter what.

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] ffmpeg: release the last_frame before the decoders are closed

2018-10-17 Thread Steve Lhomme

On 16/10/2018 18:04, James Almer wrote:

On 10/16/2018 12:34 PM, Steve Lhomme wrote:

On 16/10/2018 16:59, Hendrik Leppkes wrote:

On Tue, Oct 16, 2018 at 4:02 PM James Almer  wrote:

On 10/16/2018 9:16 AM, Steve Lhomme wrote:

If the decoder provides its own buffers it might not be able to
release its
buffers once it has been closed. (this is the case with dav1d).
---
   fftools/ffmpeg.c | 1 +
   1 file changed, 1 insertion(+)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index da4259a9a8..faf62475a2 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -4738,6 +4738,7 @@ static int transcode(void)
   if (ost->encoding_needed) {
   av_freep(&ost->enc_ctx->stats_in);
   }
+    av_frame_unref(ost->last_frame);
   total_packets_written += ost->packets_written;
   }

I'm not against this change, but this issue should be solved within
dav1d as well. Either the caller fully owns the picture returned by
dav1d, or it doesn't. "Partially owns it while some other context is
still valid" is not really acceptable.

You can't ask any library to own content even after you have closed it
(and potentially unloaded the DLL).

As i said in dav1d's merge request, with libavcodec i can open an
encoder, generate an AVPacket, close the encoder, open a bitstream
filter, filter the packet i got from the encoder, close the bitstream
filter, and still fully own the packet without having in it any dangling
pointer to some callback stored in a long dead context. Same thing with
AVFrames.


It generally works because it's usually used statically and with no 
external decoder, loaded dynamically.



This patch prevents ffmpeg.c closing the decoder (and thus the
Dav1dContext) before a reference to one AVFrame, owned by ffmpeg.c and
supposedly standalone, was freed. That's ok, but ffmpeg.c is just one
libavcodec user, and we have no control whatsoever of what other
libavcodec users will do with a returned AVFrame from
avcodec_receive_frame().
And as Hendrik said, they are guaranteed to remain valid regardless of
the component they came out of, so this is not acceptable.


I'd be curious to see how it works with DXVA2/D3D11VA where a DLL needs 
to be loaded and the buffers come for that DLL. If last_frame holds a 
DXVA2/D3D11 texture and tries to free it after the DLL has been unloaded 
it shouldn't work well.

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] ffmpeg: release the last_frame before the decoders are closed

2018-10-17 Thread Steve Lhomme

On 17/10/2018 09:43, Steve Lhomme wrote:

On 16/10/2018 18:04, James Almer wrote:

On 10/16/2018 12:34 PM, Steve Lhomme wrote:

On 16/10/2018 16:59, Hendrik Leppkes wrote:

On Tue, Oct 16, 2018 at 4:02 PM James Almer  wrote:

On 10/16/2018 9:16 AM, Steve Lhomme wrote:

If the decoder provides its own buffers it might not be able to
release its
buffers once it has been closed. (this is the case with dav1d).
---
   fftools/ffmpeg.c | 1 +
   1 file changed, 1 insertion(+)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index da4259a9a8..faf62475a2 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -4738,6 +4738,7 @@ static int transcode(void)
   if (ost->encoding_needed) {
av_freep(&ost->enc_ctx->stats_in);
   }
+    av_frame_unref(ost->last_frame);
   total_packets_written += ost->packets_written;
   }

I'm not against this change, but this issue should be solved within
dav1d as well. Either the caller fully owns the picture returned by
dav1d, or it doesn't. "Partially owns it while some other context is
still valid" is not really acceptable.

You can't ask any library to own content even after you have closed it
(and potentially unloaded the DLL).

As i said in dav1d's merge request, with libavcodec i can open an
encoder, generate an AVPacket, close the encoder, open a bitstream
filter, filter the packet i got from the encoder, close the bitstream
filter, and still fully own the packet without having in it any dangling
pointer to some callback stored in a long dead context. Same thing with
AVFrames.


It generally works because it's usually used statically and with no 
external decoder, loaded dynamically.



This patch prevents ffmpeg.c closing the decoder (and thus the
Dav1dContext) before a reference to one AVFrame, owned by ffmpeg.c and
supposedly standalone, was freed. That's ok, but ffmpeg.c is just one
libavcodec user, and we have no control whatsoever of what other
libavcodec users will do with a returned AVFrame from
avcodec_receive_frame().
And as Hendrik said, they are guaranteed to remain valid regardless of
the component they came out of, so this is not acceptable.


I'd be curious to see how it works with DXVA2/D3D11VA where a DLL 
needs to be loaded and the buffers come for that DLL. If last_frame 
holds a DXVA2/D3D11 texture and tries to free it after the DLL has 
been unloaded it shouldn't work well.


I had a quick look. It turns out that the DLLs are loaded but never 
unloaded. So of course it will never execute code in unloaded DLLs.


___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] dxva2: debug the mismatching buffer sizes

2020-03-13 Thread Steve Lhomme
---
 libavcodec/dxva2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 32416112bf..6add893f3e 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -840,7 +840,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
 
 result = 0;
 } else {
-av_log(avctx, AV_LOG_ERROR, "Buffer for type %u was too small\n", 
type);
+av_log(avctx, AV_LOG_ERROR, "Buffer for type %u was too small (got %u, 
need %u)\n", type, dxva_size, size);
 result = -1;
 }
 
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 2/3] avcodec/hevcdec: allow HEVC 444 8/10/12 bits decoding with DXVA2/D3D11VA

2020-03-13 Thread Steve Lhomme
And 4:2:0 12 bits as well.
---
 libavcodec/hevcdec.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 8f1c162ace..04496a002b 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -420,6 +420,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 #endif
 break;
 case AV_PIX_FMT_YUV444P:
+#if CONFIG_HEVC_DXVA2_HWACCEL
+*fmt++ = AV_PIX_FMT_DXVA2_VLD;
+#endif
+#if CONFIG_HEVC_D3D11VA_HWACCEL
+*fmt++ = AV_PIX_FMT_D3D11VA_VLD;
+*fmt++ = AV_PIX_FMT_D3D11;
+#endif
 #if CONFIG_HEVC_VDPAU_HWACCEL
 *fmt++ = AV_PIX_FMT_VDPAU;
 #endif
@@ -430,6 +437,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 case AV_PIX_FMT_YUV420P12:
 case AV_PIX_FMT_YUV444P10:
 case AV_PIX_FMT_YUV444P12:
+#if CONFIG_HEVC_DXVA2_HWACCEL
+*fmt++ = AV_PIX_FMT_DXVA2_VLD;
+#endif
+#if CONFIG_HEVC_D3D11VA_HWACCEL
+*fmt++ = AV_PIX_FMT_D3D11VA_VLD;
+*fmt++ = AV_PIX_FMT_D3D11;
+#endif
 #if CONFIG_HEVC_NVDEC_HWACCEL
 *fmt++ = AV_PIX_FMT_CUDA;
 #endif
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 3/3] avcodec/hevcdec: allow HEVC 422 10/12 bits decoding with DXVA2/D3D11VA

2020-03-13 Thread Steve Lhomme
---
 libavcodec/hevcdec.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 04496a002b..4c1650c416 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -432,6 +432,16 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 #endif
 #if CONFIG_HEVC_NVDEC_HWACCEL
 *fmt++ = AV_PIX_FMT_CUDA;
+#endif
+break;
+case AV_PIX_FMT_YUV422P10:
+case AV_PIX_FMT_YUV422P12:
+#if CONFIG_HEVC_DXVA2_HWACCEL
+*fmt++ = AV_PIX_FMT_DXVA2_VLD;
+#endif
+#if CONFIG_HEVC_D3D11VA_HWACCEL
+*fmt++ = AV_PIX_FMT_D3D11VA_VLD;
+*fmt++ = AV_PIX_FMT_D3D11;
 #endif
 break;
 case AV_PIX_FMT_YUV420P12:
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 1/3] avcodec/dxva2_hevc: add support for parsing HEVC Range Extension data

2020-03-13 Thread Steve Lhomme
Mimick the existing structure and add the extra fields from the Range Extension
in a wrapping structure.

The FF_DXVA2_WORKAROUND_HEVC_REXT is set by the decoder user to signal the
selected decoder is expecting this extended structure rather than the default
one.
---
 libavcodec/d3d11va.h|  1 +
 libavcodec/dxva2.h  |  1 +
 libavcodec/dxva2_hevc.c | 79 ++---
 3 files changed, 76 insertions(+), 5 deletions(-)

diff --git a/libavcodec/d3d11va.h b/libavcodec/d3d11va.h
index 6816b6c1e6..68a69c372d 100644
--- a/libavcodec/d3d11va.h
+++ b/libavcodec/d3d11va.h
@@ -47,6 +47,7 @@
 
 #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for 
Direct3D11 and old UVD/UVD+ ATI video cards
 #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO2 ///< Work around for 
Direct3D11 and old Intel GPUs with ClearVideo interface
+#define FF_DXVA2_WORKAROUND_HEVC_REXT   4 ///< Signal the D3D11VA 
decoder is using the HEVC Rext picture structure
 
 /**
  * This structure is used to provides the necessary configurations and data
diff --git a/libavcodec/dxva2.h b/libavcodec/dxva2.h
index 22c93992f2..024999239d 100644
--- a/libavcodec/dxva2.h
+++ b/libavcodec/dxva2.h
@@ -47,6 +47,7 @@
 
 #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 
and old UVD/UVD+ ATI video cards
 #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO2 ///< Work around for DXVA2 
and old Intel GPUs with ClearVideo interface
+#define FF_DXVA2_WORKAROUND_HEVC_REXT   4 ///< Signal the DXVA2 
decoder is using the HEVC Rext picture structure
 
 /**
  * This structure is used to provides the necessary configurations and data
diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
index dbb701fb1c..98b3e74bd7 100644
--- a/libavcodec/dxva2_hevc.c
+++ b/libavcodec/dxva2_hevc.c
@@ -26,10 +26,47 @@
 #include "hevc_data.h"
 #include "hevcdec.h"
 
+#pragma pack(push, 1)
+typedef struct
+{
+DXVA_PicParams_HEVC main;
+
+// HEVC Range Extension
+__C89_NAMELESS union {
+__C89_NAMELESS struct {
+UINT32 transform_skip_rotation_enabled_flag : 1;
+UINT32 transform_skip_context_enabled_flag : 1;
+UINT32 implicit_rdpcm_enabled_flag : 1;
+UINT32 explicit_rdpcm_enabled_flag : 1;
+UINT32 extended_precision_processing_flag : 1;
+UINT32 intra_smoothing_disabled_flag : 1;
+UINT32 high_precision_offsets_enabled_flag : 1;
+UINT32 persistent_rice_adaptation_enabled_flag : 1;
+UINT32 cabac_bypass_alignment_enabled_flag : 1;
+UINT32 cross_component_prediction_enabled_flag : 1;
+UINT32 chroma_qp_offset_list_enabled_flag : 1;
+UINT32 BitDepthLuma16 : 1; // TODO merge in ReservedBits5 if not 
needed
+UINT32 BitDepthChroma16 : 1; // TODO merge in ReservedBits5 if not 
needed
+UINT32 ReservedBits8 : 19;
+};
+UINT32 dwRangeExtensionFlags;
+};
+
+UCHAR diff_cu_chroma_qp_offset_depth;
+UCHAR chroma_qp_offset_list_len_minus1;
+UCHAR log2_sao_offset_scale_luma;
+UCHAR log2_sao_offset_scale_chroma;
+UCHAR log2_max_transform_skip_block_size_minus2;
+CHAR cb_qp_offset_list[6];
+CHAR cr_qp_offset_list[6];
+
+} DXVA_PicParams_HEVC_Rext;
+#pragma pack(pop)
+
 #define MAX_SLICES 256
 
 struct hevc_dxva2_picture_context {
-DXVA_PicParams_HEVC   pp;
+DXVA_PicParams_HEVC_Rext pp;
 DXVA_Qmatrix_HEVC qm;
 unsigned  slice_count;
 DXVA_Slice_HEVC_Short slice_short[MAX_SLICES];
@@ -55,18 +92,48 @@ static int get_refpic_index(const DXVA_PicParams_HEVC *pp, 
int surface_index)
 }
 
 static void fill_picture_parameters(const AVCodecContext *avctx, AVDXVAContext 
*ctx, const HEVCContext *h,
-DXVA_PicParams_HEVC *pp)
+DXVA_PicParams_HEVC_Rext *ppext)
 {
 const HEVCFrame *current_picture = h->ref;
 const HEVCSPS *sps = h->ps.sps;
 const HEVCPPS *pps = h->ps.pps;
 int i, j;
+DXVA_PicParams_HEVC *pp = &ppext->main;
 
-memset(pp, 0, sizeof(*pp));
+memset(ppext, 0, sizeof(*ppext));
 
 pp->PicWidthInMinCbsY  = sps->min_cb_width;
 pp->PicHeightInMinCbsY = sps->min_cb_height;
 
+if (sps->sps_range_extension_flag) {
+ppext->dwRangeExtensionFlags |= 
(sps->transform_skip_rotation_enabled_flag <<  0) |
+
(sps->transform_skip_context_enabled_flag  <<  1) |
+(sps->implicit_rdpcm_enabled_flag  
<<  2) |
+(sps->explicit_rdpcm_enabled_flag  
<<  3) |
+
(sps->extended_precision_processing_flag   <<  4) |
+(sps->intra_smoothing_disabled_flag
<<  5) |
+
(sps->high_precision_offsets

Re: [FFmpeg-devel] [PATCH 1/3] avcodec/dxva2_hevc: add support for parsing HEVC Range Extension data

2020-03-15 Thread Steve Lhomme
> On March 13, 2020 3:46 PM Hendrik Leppkes  wrote:
> 
>  
> On Fri, Mar 13, 2020 at 11:25 AM Steve Lhomme  wrote:
> >
> > Mimick the existing structure and add the extra fields from the Range 
> > Extension
> > in a wrapping structure.
> >
> > The FF_DXVA2_WORKAROUND_HEVC_REXT is set by the decoder user to signal the
> > selected decoder is expecting this extended structure rather than the 
> > default
> > one.
> > ---
> >  libavcodec/d3d11va.h|  1 +
> >  libavcodec/dxva2.h  |  1 +
> >  libavcodec/dxva2_hevc.c | 79 ++---
> >  3 files changed, 76 insertions(+), 5 deletions(-)
> >
> > diff --git a/libavcodec/d3d11va.h b/libavcodec/d3d11va.h
> > index 6816b6c1e6..68a69c372d 100644
> > --- a/libavcodec/d3d11va.h
> > +++ b/libavcodec/d3d11va.h
> > @@ -47,6 +47,7 @@
> >
> >  #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for 
> > Direct3D11 and old UVD/UVD+ ATI video cards
> >  #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO2 ///< Work around for 
> > Direct3D11 and old Intel GPUs with ClearVideo interface
> > +#define FF_DXVA2_WORKAROUND_HEVC_REXT   4 ///< Signal the D3D11VA 
> > decoder is using the HEVC Rext picture structure
> >
> >  /**
> >   * This structure is used to provides the necessary configurations and data
> > diff --git a/libavcodec/dxva2.h b/libavcodec/dxva2.h
> > index 22c93992f2..024999239d 100644
> > --- a/libavcodec/dxva2.h
> > +++ b/libavcodec/dxva2.h
> > @@ -47,6 +47,7 @@
> >
> >  #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for 
> > DXVA2 and old UVD/UVD+ ATI video cards
> >  #define FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO2 ///< Work around for 
> > DXVA2 and old Intel GPUs with ClearVideo interface
> > +#define FF_DXVA2_WORKAROUND_HEVC_REXT   4 ///< Signal the DXVA2 
> > decoder is using the HEVC Rext picture structure
> >
> >  /**
> >   * This structure is used to provides the necessary configurations and data
> > diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
> > index dbb701fb1c..98b3e74bd7 100644
> > --- a/libavcodec/dxva2_hevc.c
> > +++ b/libavcodec/dxva2_hevc.c
> > @@ -26,10 +26,47 @@
> >  #include "hevc_data.h"
> >  #include "hevcdec.h"
> >
> > +#pragma pack(push, 1)
> > +typedef struct
> > +{
> > +DXVA_PicParams_HEVC main;
> > +
> > +// HEVC Range Extension
> > +__C89_NAMELESS union {
> > +__C89_NAMELESS struct {
> > +UINT32 transform_skip_rotation_enabled_flag : 1;
> > +UINT32 transform_skip_context_enabled_flag : 1;
> > +UINT32 implicit_rdpcm_enabled_flag : 1;
> > +UINT32 explicit_rdpcm_enabled_flag : 1;
> > +UINT32 extended_precision_processing_flag : 1;
> > +UINT32 intra_smoothing_disabled_flag : 1;
> > +UINT32 high_precision_offsets_enabled_flag : 1;
> > +UINT32 persistent_rice_adaptation_enabled_flag : 1;
> > +UINT32 cabac_bypass_alignment_enabled_flag : 1;
> > +UINT32 cross_component_prediction_enabled_flag : 1;
> > +UINT32 chroma_qp_offset_list_enabled_flag : 1;
> > +UINT32 BitDepthLuma16 : 1; // TODO merge in ReservedBits5 if 
> > not needed
> > +UINT32 BitDepthChroma16 : 1; // TODO merge in ReservedBits5 if 
> > not needed
> > +UINT32 ReservedBits8 : 19;
> > +};
> > +UINT32 dwRangeExtensionFlags;
> > +};
> > +
> > +UCHAR diff_cu_chroma_qp_offset_depth;
> > +UCHAR chroma_qp_offset_list_len_minus1;
> > +UCHAR log2_sao_offset_scale_luma;
> > +UCHAR log2_sao_offset_scale_chroma;
> > +UCHAR log2_max_transform_skip_block_size_minus2;
> > +CHAR cb_qp_offset_list[6];
> > +CHAR cr_qp_offset_list[6];
> > +
> > +} DXVA_PicParams_HEVC_Rext;
> > +#pragma pack(pop)
> > +
> 
> Where is this struct specified? I don't see it in the latest released
> Windows SDK.

It is not. It is reversed engineered from the existing structure and wild 
guessing based on the HEVC Range Extension specs. The bits/fields are in the 
same order as the specs. Then I tested some GUIDs that output non 4:2:0 pixel 
formats on an Intel GPU that is known to decoder HEVC Range Extension.

Apparently NVIDIA doesn't provide DXVA GUIDs that output non 4:2:0 pixel 
formats on GPUs that supposedly decode HEVC 444 (likley nvdec only). AMD 
doesn't have such GPUs AFAIK.

So for now it's Intel only.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 1/3] avcodec/dxva2_hevc: add support for parsing HEVC Range Extension data

2020-03-17 Thread Steve Lhomme

On 2020-03-15 13:05, Hendrik Leppkes wrote:

On Sun, Mar 15, 2020 at 8:12 AM Steve Lhomme  wrote:

Where is this struct specified? I don't see it in the latest released
Windows SDK.


It is not. It is reversed engineered from the existing structure and wild 
guessing based on the HEVC Range Extension specs. The bits/fields are in the 
same order as the specs. Then I tested some GUIDs that output non 4:2:0 pixel 
formats on an Intel GPU that is known to decoder HEVC Range Extension.

Apparently NVIDIA doesn't provide DXVA GUIDs that output non 4:2:0 pixel 
formats on GPUs that supposedly decode HEVC 444 (likley nvdec only). AMD 
doesn't have such GPUs AFAIK.

So for now it's Intel only.


That seems very hackish for something thats otherwise cleanly based on
official specifications only.  Maybe try to get them to release specs
for this instead?


From what I understand only MS publishes DXVA specs and it seems they 
have no intention on doing one for HEVC Range Extension. That may be why 
NVIDIA has not implemented it. I don't know if Intel is planning to 
release a documentation.

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 03/14] avformat/matroska: use more consistent spacing in enums

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

---
 libavformat/matroska.h | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index e177cd027f..5520e9ce8f 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -284,18 +284,18 @@ typedef enum {
 } MatroskaTrackEncodingCompAlgo;
 
 typedef enum {
-MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED = 0,
-MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED   = 1,
-MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2,
+  MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED = 0,
+  MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED   = 1,
+  MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2,
 } MatroskaVideoInterlaceFlag;
 
 typedef enum {
-MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE  = 0,
-MATROSKA_VIDEO_FIELDORDER_TT   = 1,
-MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
-MATROSKA_VIDEO_FIELDORDER_BB   = 6,
-MATROSKA_VIDEO_FIELDORDER_TB   = 9,
-MATROSKA_VIDEO_FIELDORDER_BT   = 14,
+  MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE  = 0,
+  MATROSKA_VIDEO_FIELDORDER_TT   = 1,
+  MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
+  MATROSKA_VIDEO_FIELDORDER_BB   = 6,
+  MATROSKA_VIDEO_FIELDORDER_TB   = 9,
+  MATROSKA_VIDEO_FIELDORDER_BT   = 14,
 } MatroskaVideoFieldOrder;
 
 typedef enum {
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 01/14] avformat/matroska: add missing Buttons track type

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

---
 libavformat/matroska.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 86968a8de1..9e33e51c94 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -271,6 +271,7 @@ typedef enum {
   MATROSKA_TRACK_TYPE_COMPLEX  = 0x3,
   MATROSKA_TRACK_TYPE_LOGO = 0x10,
   MATROSKA_TRACK_TYPE_SUBTITLE = 0x11,
+  MATROSKA_TRACK_TYPE_BUTTONS  = 0x12,
   MATROSKA_TRACK_TYPE_CONTROL  = 0x20,
   MATROSKA_TRACK_TYPE_METADATA = 0x21,
 } MatroskaTrackType;
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 02/14] avformat/matroska: clean the structure formatting

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

Always use a comma at the end, order elements by value.
---
 libavformat/matroska.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 9e33e51c94..e177cd027f 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -286,13 +286,13 @@ typedef enum {
 typedef enum {
 MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED = 0,
 MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED   = 1,
-MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2
+MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2,
 } MatroskaVideoInterlaceFlag;
 
 typedef enum {
 MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE  = 0,
-MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
 MATROSKA_VIDEO_FIELDORDER_TT   = 1,
+MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
 MATROSKA_VIDEO_FIELDORDER_BB   = 6,
 MATROSKA_VIDEO_FIELDORDER_TB   = 9,
 MATROSKA_VIDEO_FIELDORDER_BT   = 14,
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 06/14] avformat:matroska_ids: reorder some IDs to match the generated order

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

The XSLT scripts produces a similar file to this one, minus some spacing
differences.

No value added/removed.
---
 libavformat/matroska_ids.h | 70 +++---
 1 file changed, 35 insertions(+), 35 deletions(-)

diff --git a/libavformat/matroska_ids.h b/libavformat/matroska_ids.h
index ab77228da5..321e555bec 100644
--- a/libavformat/matroska_ids.h
+++ b/libavformat/matroska_ids.h
@@ -60,6 +60,8 @@
 #define MATROSKA_ID_TRACKOPERATION 0xE2
 #define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
 #define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
+#define MATROSKA_ID_TRACKNAME  0x536E
+#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
 #define MATROSKA_ID_CODECID0x86
 #define MATROSKA_ID_CODECPRIVATE 0x63A2
 #define MATROSKA_ID_CODECNAME  0x258688
@@ -68,8 +70,6 @@
 #define MATROSKA_ID_CODECDECODEALL 0xAA
 #define MATROSKA_ID_CODECDELAY 0x56AA
 #define MATROSKA_ID_SEEKPREROLL 0x56BB
-#define MATROSKA_ID_TRACKNAME  0x536E
-#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
 #define MATROSKA_ID_TRACKFLAGENABLED 0xB9
 #define MATROSKA_ID_TRACKFLAGDEFAULT 0x88
 #define MATROSKA_ID_TRACKFLAGFORCED 0x55AA
@@ -82,6 +82,26 @@
 /* IDs in the contentencodings master */
 #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
 
+/* IDs in the content encoding master */
+#define MATROSKA_ID_ENCODINGORDER 0x5031
+#define MATROSKA_ID_ENCODINGSCOPE 0x5032
+#define MATROSKA_ID_ENCODINGTYPE 0x5033
+#define MATROSKA_ID_ENCODINGCOMPRESSION 0x5034
+#define MATROSKA_ID_ENCODINGENCRYPTION 0x5035
+
+/* IDs in the contentcompression master */
+#define MATROSKA_ID_ENCODINGCOMPALGO 0x4254
+#define MATROSKA_ID_ENCODINGCOMPSETTINGS 0x4255
+
+/* IDs in the contentencryption master */
+#define MATROSKA_ID_ENCODINGENCAESSETTINGS 0x47E7
+#define MATROSKA_ID_ENCODINGENCALGO 0x47E1
+#define MATROSKA_ID_ENCODINGENCKEYID 0x47E2
+#define MATROSKA_ID_ENCODINGSIGALGO 0x47E5
+#define MATROSKA_ID_ENCODINGSIGHASHALGO 0x47E6
+#define MATROSKA_ID_ENCODINGSIGKEYID 0x47E4
+#define MATROSKA_ID_ENCODINGSIGNATURE 0x47E3
+
 /* IDs in the trackoperation master */
 #define MATROSKA_ID_TRACKCOMBINEPLANES 0xE3
 
@@ -153,26 +173,6 @@
 #define MATROSKA_ID_AUDIOBITDEPTH 0x6264
 #define MATROSKA_ID_AUDIOCHANNELS 0x9F
 
-/* IDs in the content encoding master */
-#define MATROSKA_ID_ENCODINGORDER 0x5031
-#define MATROSKA_ID_ENCODINGSCOPE 0x5032
-#define MATROSKA_ID_ENCODINGTYPE 0x5033
-#define MATROSKA_ID_ENCODINGCOMPRESSION 0x5034
-#define MATROSKA_ID_ENCODINGENCRYPTION 0x5035
-
-/* IDs in the contentcompression master */
-#define MATROSKA_ID_ENCODINGCOMPALGO 0x4254
-#define MATROSKA_ID_ENCODINGCOMPSETTINGS 0x4255
-
-/* IDs in the contentencryption master */
-#define MATROSKA_ID_ENCODINGENCAESSETTINGS 0x47E7
-#define MATROSKA_ID_ENCODINGENCALGO 0x47E1
-#define MATROSKA_ID_ENCODINGENCKEYID 0x47E2
-#define MATROSKA_ID_ENCODINGSIGALGO 0x47E5
-#define MATROSKA_ID_ENCODINGSIGHASHALGO 0x47E6
-#define MATROSKA_ID_ENCODINGSIGKEYID 0x47E4
-#define MATROSKA_ID_ENCODINGSIGNATURE 0x47E3
-
 /* ID in the cues master */
 #define MATROSKA_ID_POINTENTRY 0xBB
 
@@ -208,12 +208,15 @@
 #define MATROSKA_ID_TAGTARGETS_CHAPTERUID 0x63C4
 #define MATROSKA_ID_TAGTARGETS_ATTACHUID  0x63C6
 
-/* IDs in the seekhead master */
-#define MATROSKA_ID_SEEKENTRY  0x4DBB
+/* IDs in the attachments master */
+#define MATROSKA_ID_ATTACHEDFILE0x61A7
 
-/* IDs in the seekpoint master */
-#define MATROSKA_ID_SEEKID 0x53AB
-#define MATROSKA_ID_SEEKPOSITION 0x53AC
+/* IDs in the attachedfile master */
+#define MATROSKA_ID_FILEDESC0x467E
+#define MATROSKA_ID_FILENAME0x466E
+#define MATROSKA_ID_FILEMIMETYPE0x4660
+#define MATROSKA_ID_FILEDATA0x465C
+#define MATROSKA_ID_FILEUID 0x46AE
 
 /* IDs in the cluster master */
 #define MATROSKA_ID_CLUSTERTIMECODE 0xE7
@@ -237,15 +240,12 @@
 #define MATROSKA_ID_BLOCKADDID 0xEE
 #define MATROSKA_ID_BLOCKADDITIONAL 0xA5
 
-/* IDs in the attachments master */
-#define MATROSKA_ID_ATTACHEDFILE0x61A7
+/* IDs in the seekhead master */
+#define MATROSKA_ID_SEEKENTRY  0x4DBB
 
-/* IDs in the attachedfile master */
-#define MATROSKA_ID_FILEDESC0x467E
-#define MATROSKA_ID_FILENAME0x466E
-#define MATROSKA_ID_FILEMIMETYPE0x4660
-#define MATROSKA_ID_FILEDATA0x465C
-#define MATROSKA_ID_FILEUID 0x46AE
+/* IDs in the seekpoint master */
+#define MATROSKA_ID_SEEKID 0x53AB
+#define MATROSKA_ID_SEEKPOSITION 0x53AC
 
 /* IDs in the chapters master */
 #define MATROSKA_ID_EDITIONENTRY0x45B9
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 07/14] avformat/matroskadec: fix the type of the TrackLanguage

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

It's an ASCII string, not a UTF-8 string.
---
 libavformat/matroskadec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 4d7fdab99f..383869bced 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -554,7 +554,7 @@ static EbmlSyntax matroska_track[] = {
 { MATROSKA_ID_CODECID,   EBML_STR,   0, 
offsetof(MatroskaTrack, codec_id) },
 { MATROSKA_ID_CODECPRIVATE,  EBML_BIN,   0, 
offsetof(MatroskaTrack, codec_priv) },
 { MATROSKA_ID_CODECDELAY,EBML_UINT,  0, 
offsetof(MatroskaTrack, codec_delay) },
-{ MATROSKA_ID_TRACKLANGUAGE, EBML_UTF8,  0, 
offsetof(MatroskaTrack, language), { .s = "eng" } },
+{ MATROSKA_ID_TRACKLANGUAGE, EBML_STR,   0, 
offsetof(MatroskaTrack, language), { .s = "eng" } },
 { MATROSKA_ID_TRACKDEFAULTDURATION,  EBML_UINT,  0, 
offsetof(MatroskaTrack, default_duration) },
 { MATROSKA_ID_TRACKTIMECODESCALE,EBML_FLOAT, 0, 
offsetof(MatroskaTrack, time_scale),   { .f = 1.0 } },
 { MATROSKA_ID_TRACKFLAGDEFAULT,  EBML_UINT,  0, 
offsetof(MatroskaTrack, flag_default), { .u = 1 } },
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 05/14] avformat:matroska_ids: move some IDs in separate sections

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

According grouped with their parent's elements.

No value added/removed.
---
 libavformat/matroska_ids.h | 78 ++
 1 file changed, 54 insertions(+), 24 deletions(-)

diff --git a/libavformat/matroska_ids.h b/libavformat/matroska_ids.h
index 063dae5f94..ab77228da5 100644
--- a/libavformat/matroska_ids.h
+++ b/libavformat/matroska_ids.h
@@ -58,10 +58,8 @@
 #define MATROSKA_ID_TRACKVIDEO 0xE0
 #define MATROSKA_ID_TRACKAUDIO 0xE1
 #define MATROSKA_ID_TRACKOPERATION 0xE2
-#define MATROSKA_ID_TRACKCOMBINEPLANES 0xE3
-#define MATROSKA_ID_TRACKPLANE 0xE4
-#define MATROSKA_ID_TRACKPLANEUID  0xE5
-#define MATROSKA_ID_TRACKPLANETYPE 0xE6
+#define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
+#define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
 #define MATROSKA_ID_CODECID0x86
 #define MATROSKA_ID_CODECPRIVATE 0x63A2
 #define MATROSKA_ID_CODECNAME  0x258688
@@ -80,9 +78,19 @@
 #define MATROSKA_ID_TRACKMAXCACHE 0x6DF8
 #define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
 #define MATROSKA_ID_TRACKCONTENTENCODINGS 0x6D80
+
+/* IDs in the contentencodings master */
 #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
-#define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
-#define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
+
+/* IDs in the trackoperation master */
+#define MATROSKA_ID_TRACKCOMBINEPLANES 0xE3
+
+/* IDs in the trackcombineplanes master */
+#define MATROSKA_ID_TRACKPLANE 0xE4
+
+/* IDs in the trackplane master */
+#define MATROSKA_ID_TRACKPLANEUID  0xE5
+#define MATROSKA_ID_TRACKPLANETYPE 0xE6
 
 /* IDs in the trackvideo master */
 #define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
@@ -102,7 +110,9 @@
 #define MATROSKA_ID_VIDEOASPECTRATIO 0x54B3
 #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524
 #define MATROSKA_ID_VIDEOCOLOR 0x55B0
+#define MATROSKA_ID_VIDEOPROJECTION 0x7670
 
+/* IDs in the colour master */
 #define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF 0x55B1
 #define MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL 0x55B2
 #define MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ 0x55B3
@@ -113,12 +123,12 @@
 #define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT 0x55B8
 #define MATROSKA_ID_VIDEOCOLORRANGE 0x55B9
 #define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS 0x55BA
-
 #define MATROSKA_ID_VIDEOCOLORPRIMARIES 0x55BB
 #define MATROSKA_ID_VIDEOCOLORMAXCLL 0x55BC
 #define MATROSKA_ID_VIDEOCOLORMAXFALL 0x55BD
-
 #define MATROSKA_ID_VIDEOCOLORMASTERINGMETA 0x55D0
+
+/* IDs in the masteringmetadata master */
 #define MATROSKA_ID_VIDEOCOLOR_RX 0x55D1
 #define MATROSKA_ID_VIDEOCOLOR_RY 0x55D2
 #define MATROSKA_ID_VIDEOCOLOR_GX 0x55D3
@@ -130,7 +140,7 @@
 #define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX 0x55D9
 #define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN 0x55DA
 
-#define MATROSKA_ID_VIDEOPROJECTION 0x7670
+/* IDs in the projection master */
 #define MATROSKA_ID_VIDEOPROJECTIONTYPE 0x7671
 #define MATROSKA_ID_VIDEOPROJECTIONPRIVATE 0x7672
 #define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW 0x7673
@@ -140,7 +150,6 @@
 /* IDs in the trackaudio master */
 #define MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5
 #define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ 0x78B5
-
 #define MATROSKA_ID_AUDIOBITDEPTH 0x6264
 #define MATROSKA_ID_AUDIOCHANNELS 0x9F
 
@@ -149,10 +158,13 @@
 #define MATROSKA_ID_ENCODINGSCOPE 0x5032
 #define MATROSKA_ID_ENCODINGTYPE 0x5033
 #define MATROSKA_ID_ENCODINGCOMPRESSION 0x5034
+#define MATROSKA_ID_ENCODINGENCRYPTION 0x5035
+
+/* IDs in the contentcompression master */
 #define MATROSKA_ID_ENCODINGCOMPALGO 0x4254
 #define MATROSKA_ID_ENCODINGCOMPSETTINGS 0x4255
 
-#define MATROSKA_ID_ENCODINGENCRYPTION 0x5035
+/* IDs in the contentencryption master */
 #define MATROSKA_ID_ENCODINGENCAESSETTINGS 0x47E7
 #define MATROSKA_ID_ENCODINGENCALGO 0x47E1
 #define MATROSKA_ID_ENCODINGENCKEYID 0x47E2
@@ -177,13 +189,19 @@
 
 /* IDs in the tags master */
 #define MATROSKA_ID_TAG 0x7373
+
+/* IDs in the tag master */
 #define MATROSKA_ID_SIMPLETAG   0x67C8
-#define MATROSKA_ID_TAGNAME 0x45A3
-#define MATROSKA_ID_TAGSTRING   0x4487
+#define MATROSKA_ID_TAGTARGETS  0x63C0
+
+/* IDs in the simpletag master */
 #define MATROSKA_ID_TAGLANG 0x447A
 #define MATROSKA_ID_TAGDEFAULT  0x4484
+#define MATROSKA_ID_TAGSTRING   0x4487
 #define MATROSKA_ID_TAGDEFAULT_BUG  0x44B4
-#define MATROSKA_ID_TAGTARGETS  0x63C0
+#define MATROSKA_ID_TAGNAME 0x45A3
+
+/* IDs in the targets master */
 #define MATROSKA_ID_TAGTARGETS_TYPE   0x63CA
 #define MATROSKA_ID_TAGTARGETS_TYPEVALUE  0x68CA
 #define MATROSKA_ID_TAGTARGETS_TRACKUID   0x63C5
@@ -202,21 +220,27 @@
 #define MATROSKA_ID_CLUSTERPOSITION 0xA7
 #define MATROSKA_ID_CLUSTERPREVSIZE 0xAB
 #define MATROSKA_ID_BLOCKGROUP 0xA0
-#define MATROSKA_ID_BLOCKADDITIONS 0x75A1
-#define MATROSKA_ID_BLOCKMORE 0xA6
-#define MATROSKA_ID_BLOCKADDID 0xEE
-#define MATROSKA_ID_BLOCKADDITIONAL 0xA5
 #define MATROSKA_ID_SIMPLEBLOCK 0xA3
 
 /* IDs in the blockgroup master */
 #d

[FFmpeg-devel] [PATCH 08/14] avformat/matroskadec: fix the default of the TagDefault element

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

By default a tag is the default one.
---
 libavformat/matroskadec.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 383869bced..3640dd76d9 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -652,8 +652,8 @@ static EbmlSyntax matroska_simpletag[] = {
 { MATROSKA_ID_TAGNAME,EBML_UTF8, 0,   
offsetof(MatroskaTag, name) },
 { MATROSKA_ID_TAGSTRING,  EBML_UTF8, 0,   
offsetof(MatroskaTag, string) },
 { MATROSKA_ID_TAGLANG,EBML_STR,  0,   
offsetof(MatroskaTag, lang), { .s = "und" } },
-{ MATROSKA_ID_TAGDEFAULT, EBML_UINT, 0,   
offsetof(MatroskaTag, def) },
-{ MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0,   
offsetof(MatroskaTag, def) },
+{ MATROSKA_ID_TAGDEFAULT, EBML_UINT, 0,   
offsetof(MatroskaTag, def), { .u = 1 } },
+{ MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0,   
offsetof(MatroskaTag, def), { .u = 1 } },
 { MATROSKA_ID_SIMPLETAG,  EBML_NEST, sizeof(MatroskaTag), 
offsetof(MatroskaTag, sub),  { .n = matroska_simpletag } },
 CHILD_OF(matroska_tag)
 };
-- 
2.18.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 04/14] avformat/matroska: move Matroska IDs and enums in a separate header

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

So the file can be generated from the EBML Schema.

No functional change.
---
 libavformat/matroska.h | 302 +-
 libavformat/matroska_ids.h | 327 +
 2 files changed, 328 insertions(+), 301 deletions(-)
 create mode 100644 libavformat/matroska_ids.h

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 5520e9ce8f..10140dea48 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -23,6 +23,7 @@
 #define AVFORMAT_MATROSKA_H
 
 #include "libavcodec/avcodec.h"
+#include "matroska_ids.h"
 #include "metadata.h"
 #include "internal.h"
 
@@ -45,307 +46,6 @@
 #define EBML_ID_VOID   0xEC
 #define EBML_ID_CRC32  0xBF
 
-/*
- * Matroska element IDs, max. 32 bits
- */
-
-/* toplevel segment */
-#define MATROSKA_ID_SEGMENT0x18538067
-
-/* Matroska top-level master IDs */
-#define MATROSKA_ID_INFO   0x1549A966
-#define MATROSKA_ID_TRACKS 0x1654AE6B
-#define MATROSKA_ID_CUES   0x1C53BB6B
-#define MATROSKA_ID_TAGS   0x1254C367
-#define MATROSKA_ID_SEEKHEAD   0x114D9B74
-#define MATROSKA_ID_ATTACHMENTS 0x1941A469
-#define MATROSKA_ID_CLUSTER0x1F43B675
-#define MATROSKA_ID_CHAPTERS   0x1043A770
-
-/* IDs in the info master */
-#define MATROSKA_ID_TIMECODESCALE 0x2AD7B1
-#define MATROSKA_ID_DURATION   0x4489
-#define MATROSKA_ID_TITLE  0x7BA9
-#define MATROSKA_ID_WRITINGAPP 0x5741
-#define MATROSKA_ID_MUXINGAPP  0x4D80
-#define MATROSKA_ID_DATEUTC0x4461
-#define MATROSKA_ID_SEGMENTUID 0x73A4
-
-/* ID in the tracks master */
-#define MATROSKA_ID_TRACKENTRY 0xAE
-
-/* IDs in the trackentry master */
-#define MATROSKA_ID_TRACKNUMBER 0xD7
-#define MATROSKA_ID_TRACKUID   0x73C5
-#define MATROSKA_ID_TRACKTYPE  0x83
-#define MATROSKA_ID_TRACKVIDEO 0xE0
-#define MATROSKA_ID_TRACKAUDIO 0xE1
-#define MATROSKA_ID_TRACKOPERATION 0xE2
-#define MATROSKA_ID_TRACKCOMBINEPLANES 0xE3
-#define MATROSKA_ID_TRACKPLANE 0xE4
-#define MATROSKA_ID_TRACKPLANEUID  0xE5
-#define MATROSKA_ID_TRACKPLANETYPE 0xE6
-#define MATROSKA_ID_CODECID0x86
-#define MATROSKA_ID_CODECPRIVATE 0x63A2
-#define MATROSKA_ID_CODECNAME  0x258688
-#define MATROSKA_ID_CODECINFOURL 0x3B4040
-#define MATROSKA_ID_CODECDOWNLOADURL 0x26B240
-#define MATROSKA_ID_CODECDECODEALL 0xAA
-#define MATROSKA_ID_CODECDELAY 0x56AA
-#define MATROSKA_ID_SEEKPREROLL 0x56BB
-#define MATROSKA_ID_TRACKNAME  0x536E
-#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
-#define MATROSKA_ID_TRACKFLAGENABLED 0xB9
-#define MATROSKA_ID_TRACKFLAGDEFAULT 0x88
-#define MATROSKA_ID_TRACKFLAGFORCED 0x55AA
-#define MATROSKA_ID_TRACKFLAGLACING 0x9C
-#define MATROSKA_ID_TRACKMINCACHE 0x6DE7
-#define MATROSKA_ID_TRACKMAXCACHE 0x6DF8
-#define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
-#define MATROSKA_ID_TRACKCONTENTENCODINGS 0x6D80
-#define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
-#define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
-#define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
-
-/* IDs in the trackvideo master */
-#define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
-#define MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0
-#define MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA
-#define MATROSKA_ID_VIDEOPIXELWIDTH 0xB0
-#define MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA
-#define MATROSKA_ID_VIDEOPIXELCROPB 0x54AA
-#define MATROSKA_ID_VIDEOPIXELCROPT 0x54BB
-#define MATROSKA_ID_VIDEOPIXELCROPL 0x54CC
-#define MATROSKA_ID_VIDEOPIXELCROPR 0x54DD
-#define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2
-#define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A
-#define MATROSKA_ID_VIDEOFIELDORDER 0x9D
-#define MATROSKA_ID_VIDEOSTEREOMODE 0x53B8
-#define MATROSKA_ID_VIDEOALPHAMODE 0x53C0
-#define MATROSKA_ID_VIDEOASPECTRATIO 0x54B3
-#define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524
-#define MATROSKA_ID_VIDEOCOLOR 0x55B0
-
-#define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF 0x55B1
-#define MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL 0x55B2
-#define MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ 0x55B3
-#define MATROSKA_ID_VIDEOCOLORCHROMASUBVERT 0x55B4
-#define MATROSKA_ID_VIDEOCOLORCBSUBHORZ 0x55B5
-#define MATROSKA_ID_VIDEOCOLORCBSUBVERT 0x55B6
-#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ 0x55B7
-#define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT 0x55B8
-#define MATROSKA_ID_VIDEOCOLORRANGE 0x55B9
-#define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS 0x55BA
-
-#define MATROSKA_ID_VIDEOCOLORPRIMARIES 0x55BB
-#define MATROSKA_ID_VIDEOCOLORMAXCLL 0x55BC
-#define MATROSKA_ID_VIDEOCOLORMAXFALL 0x55BD
-
-#define MATROSKA_ID_VIDEOCOLORMASTERINGMETA 0x55D0
-#define MATROSKA_ID_VIDEOCOLOR_RX 0x55D1
-#define MATROSKA_ID_VIDEOCOLOR_RY 0x55D2
-#define MATROSKA_ID_VIDEOCOLOR_GX 0x55D3
-#define MATROSKA_ID_VIDEOCOLOR_GY 0x55D4
-#define MATROSKA_ID_VIDEOCOLOR_BX 0x55D5
-#define MATROSKA_ID_VIDEOCOLOR_BY 0x55D6
-#define MATROSKA_ID_VIDEOCOLOR_WHITEX 0x55D7
-#define MATROSKA_ID_VIDEOCOLOR_WHITEY 0x55D8
-#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX 0x55D9
-#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN 0x55D

[FFmpeg-devel] [PATCH 11/14] avformat/matroskasem: reorder EbmlSyntax tables

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

So they are sorted by their EBML path, in reverse order so we don't extra
declarations.

No functional changes.
---
 libavformat/matroskasem.c | 256 +++---
 1 file changed, 128 insertions(+), 128 deletions(-)

diff --git a/libavformat/matroskasem.c b/libavformat/matroskasem.c
index ce9331e044..27aa6d9c4e 100644
--- a/libavformat/matroskasem.c
+++ b/libavformat/matroskasem.c
@@ -54,15 +54,13 @@ EbmlSyntax ebml_syntax[] = {
 { 0 }
 };
 
-static EbmlSyntax matroska_info[] = {
-{ MATROSKA_ID_TIMECODESCALE, EBML_UINT,  0, offsetof(MatroskaDemuxContext, 
time_scale), { .u = 100 } },
-{ MATROSKA_ID_DURATION,  EBML_FLOAT, 0, offsetof(MatroskaDemuxContext, 
duration) },
-{ MATROSKA_ID_TITLE, EBML_UTF8,  0, offsetof(MatroskaDemuxContext, 
title) },
-{ MATROSKA_ID_WRITINGAPP,EBML_NONE },
-{ MATROSKA_ID_MUXINGAPP, EBML_UTF8, 0, offsetof(MatroskaDemuxContext, 
muxingapp) },
-{ MATROSKA_ID_DATEUTC,   EBML_BIN,  0, offsetof(MatroskaDemuxContext, 
date_utc) },
-{ MATROSKA_ID_SEGMENTUID,EBML_NONE },
-CHILD_OF(matroska_segment)
+static EbmlSyntax matroska_track_video_projection[] = {
+{ MATROSKA_ID_VIDEOPROJECTIONTYPE,EBML_UINT,  0, 
offsetof(MatroskaTrackVideoProjection, type), { .u = 
MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR } },
+{ MATROSKA_ID_VIDEOPROJECTIONPRIVATE, EBML_BIN,   0, 
offsetof(MatroskaTrackVideoProjection, private) },
+{ MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, yaw), { .f=0.0 } },
+{ MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,   EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, pitch), { .f=0.0 } },
+{ MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, roll), { .f=0.0 } },
+CHILD_OF(matroska_track_video)
 };
 
 static EbmlSyntax matroska_mastering_meta[] = {
@@ -97,15 +95,6 @@ EbmlSyntax matroska_track_video_color[] = {
 CHILD_OF(matroska_track_video)
 };
 
-static EbmlSyntax matroska_track_video_projection[] = {
-{ MATROSKA_ID_VIDEOPROJECTIONTYPE,EBML_UINT,  0, 
offsetof(MatroskaTrackVideoProjection, type), { .u = 
MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR } },
-{ MATROSKA_ID_VIDEOPROJECTIONPRIVATE, EBML_BIN,   0, 
offsetof(MatroskaTrackVideoProjection, private) },
-{ MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, yaw), { .f=0.0 } },
-{ MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,   EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, pitch), { .f=0.0 } },
-{ MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideoProjection, roll), { .f=0.0 } },
-CHILD_OF(matroska_track_video)
-};
-
 EbmlSyntax matroska_track_video[] = {
 { MATROSKA_ID_VIDEOFRAMERATE,  EBML_FLOAT, 0, 
offsetof(MatroskaTrackVideo, frame_rate) },
 { MATROSKA_ID_VIDEODISPLAYWIDTH,   EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, display_width), { .u=-1 } },
@@ -128,18 +117,20 @@ EbmlSyntax matroska_track_video[] = {
 CHILD_OF(matroska_track)
 };
 
-static EbmlSyntax matroska_track_audio[] = {
-{ MATROSKA_ID_AUDIOSAMPLINGFREQ,EBML_FLOAT, 0, 
offsetof(MatroskaTrackAudio, samplerate), { .f = 8000.0 } },
-{ MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, EBML_FLOAT, 0, 
offsetof(MatroskaTrackAudio, out_samplerate) },
-{ MATROSKA_ID_AUDIOBITDEPTH,EBML_UINT,  0, 
offsetof(MatroskaTrackAudio, bitdepth) },
-{ MATROSKA_ID_AUDIOCHANNELS,EBML_UINT,  0, 
offsetof(MatroskaTrackAudio, channels),   { .u = 1 } },
-CHILD_OF(matroska_track)
+EbmlSyntax matroska_track_plane[] = {
+{ MATROSKA_ID_TRACKPLANEUID,  EBML_UINT, 0, 
offsetof(MatroskaTrackPlane,uid) },
+{ MATROSKA_ID_TRACKPLANETYPE, EBML_UINT, 0, 
offsetof(MatroskaTrackPlane,type) },
+CHILD_OF(matroska_track_combine_planes)
 };
 
-static EbmlSyntax matroska_track_encoding_compression[] = {
-{ MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, 
offsetof(MatroskaTrackCompression, algo) },
-{ MATROSKA_ID_ENCODINGCOMPSETTINGS, EBML_BIN,  0, 
offsetof(MatroskaTrackCompression, settings) },
-CHILD_OF(matroska_track_encoding)
+EbmlSyntax matroska_track_combine_planes[] = {
+{ MATROSKA_ID_TRACKPLANE, EBML_NEST, sizeof(MatroskaTrackPlane), 
offsetof(MatroskaTrackOperation,combine_planes), {.n = matroska_track_plane} },
+CHILD_OF(matroska_track_operation)
+};
+
+EbmlSyntax matroska_track_operation[] = {
+{ MATROSKA_ID_TRACKCOMBINEPLANES, EBML_NEST, 0, 0, {.n = 
matroska_track_combine_planes} },
+CHILD_OF(matroska_track)
 };
 
 static EbmlSyntax matroska_track_encoding_encryption[] = {
@@ -153,6 +144,12 @@ static EbmlSyntax matroska_track_encoding_encryption[] = {
 CHILD_OF(matroska_track_encoding)
 };
 
+static EbmlSyntax matroska_track_encoding_compression[] = {
+{ MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, 
offsetof(MatroskaTrackCompression,

[FFmpeg-devel] [PATCH 09/14] avformat/matroskadec: remove some implicit default value

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

All integers should be initialized to 0. Make the tables more consistent by
only setting non zero values.
---
 libavformat/matroskadec.c | 22 +++---
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 3640dd76d9..b021a4cce0 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -445,18 +445,18 @@ static EbmlSyntax matroska_mastering_meta[] = {
 
 static EbmlSyntax matroska_track_video_color[] = {
 { MATROSKA_ID_VIDEOCOLORMATRIXCOEFF,  EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, matrix_coefficients), { .u = 
AVCOL_SPC_UNSPECIFIED } },
-{ MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL,   EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, bits_per_channel), { .u=0 } },
-{ MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_sub_horz), { .u=0 } },
-{ MATROSKA_ID_VIDEOCOLORCHROMASUBVERT,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_sub_vert), { .u=0 } },
-{ MATROSKA_ID_VIDEOCOLORCBSUBHORZ,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, cb_sub_horz), { .u=0 } },
-{ MATROSKA_ID_VIDEOCOLORCBSUBVERT,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, cb_sub_vert), { .u=0 } },
+{ MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL,   EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, bits_per_channel) },
+{ MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_sub_horz) },
+{ MATROSKA_ID_VIDEOCOLORCHROMASUBVERT,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_sub_vert) },
+{ MATROSKA_ID_VIDEOCOLORCBSUBHORZ,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, cb_sub_horz) },
+{ MATROSKA_ID_VIDEOCOLORCBSUBVERT,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, cb_sub_vert) },
 { MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ, EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_siting_horz), { .u = 
MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED } },
 { MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT, EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, chroma_siting_vert), { .u = 
MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED } },
 { MATROSKA_ID_VIDEOCOLORRANGE,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, range), { .u = AVCOL_RANGE_UNSPECIFIED } },
 { MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS, EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, transfer_characteristics), { .u = 
AVCOL_TRC_UNSPECIFIED } },
 { MATROSKA_ID_VIDEOCOLORPRIMARIES,EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, primaries), { .u = AVCOL_PRI_UNSPECIFIED } },
-{ MATROSKA_ID_VIDEOCOLORMAXCLL,   EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, max_cll), { .u=0 } },
-{ MATROSKA_ID_VIDEOCOLORMAXFALL,  EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, max_fall), { .u=0 } },
+{ MATROSKA_ID_VIDEOCOLORMAXCLL,   EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, max_cll) },
+{ MATROSKA_ID_VIDEOCOLORMAXFALL,  EBML_UINT, 0, 
offsetof(MatroskaTrackVideoColor, max_fall) },
 { MATROSKA_ID_VIDEOCOLORMASTERINGMETA,EBML_NEST, 0, 
offsetof(MatroskaTrackVideoColor, mastering_meta), { .n = 
matroska_mastering_meta } },
 CHILD_OF(matroska_track_video)
 };
@@ -501,13 +501,13 @@ static EbmlSyntax matroska_track_audio[] = {
 };
 
 static EbmlSyntax matroska_track_encoding_compression[] = {
-{ MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, 
offsetof(MatroskaTrackCompression, algo), { .u = 0 } },
+{ MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, 
offsetof(MatroskaTrackCompression, algo) },
 { MATROSKA_ID_ENCODINGCOMPSETTINGS, EBML_BIN,  0, 
offsetof(MatroskaTrackCompression, settings) },
 CHILD_OF(matroska_track_encoding)
 };
 
 static EbmlSyntax matroska_track_encoding_encryption[] = {
-{ MATROSKA_ID_ENCODINGENCALGO,EBML_UINT, 0, 
offsetof(MatroskaTrackEncryption,algo), {.u = 0} },
+{ MATROSKA_ID_ENCODINGENCALGO,EBML_UINT, 0, 
offsetof(MatroskaTrackEncryption,algo) },
 { MATROSKA_ID_ENCODINGENCKEYID,   EBML_BIN, 0, 
offsetof(MatroskaTrackEncryption,key_id) },
 { MATROSKA_ID_ENCODINGENCAESSETTINGS, EBML_NONE },
 { MATROSKA_ID_ENCODINGSIGALGO,EBML_NONE },
@@ -518,7 +518,7 @@ static EbmlSyntax matroska_track_encoding_encryption[] = {
 };
 static EbmlSyntax matroska_track_encoding[] = {
 { MATROSKA_ID_ENCODINGSCOPE,   EBML_UINT, 0, 
offsetof(MatroskaTrackEncoding, scope),   { .u = 1 } },
-{ MATROSKA_ID_ENCODINGTYPE,EBML_UINT, 0, 
offsetof(MatroskaTrackEncoding, type),{ .u = 0 } },
+{ MATROSKA_ID_ENCODINGTYPE,EBML_UINT, 0, 
offsetof(MatroskaTrackEncoding, type) },
 { MATROSKA_ID_ENCODINGCOMPRESSION, EBML_NEST, 0, 
offsetof(MatroskaTrackEncoding, compression), { .n = 
matroska_track_encoding_compression } },
 { MATROSKA_ID_ENCODINGENCRYPTION,  EBML_NEST, 0, 
offsetof(MatroskaTrackEncoding

[FFmpeg-devel] [PATCH 14/14] avformat/matroska: use the generated semantic files

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

No functional value/added removed, only more regular spacing.
---
 libavformat/matroska_ids.h | 290 +++---
 libavformat/matroskasem.c  | 356 +++--
 2 files changed, 326 insertions(+), 320 deletions(-)

diff --git a/libavformat/matroska_ids.h b/libavformat/matroska_ids.h
index 321e555bec..f8e7cc927e 100644
--- a/libavformat/matroska_ids.h
+++ b/libavformat/matroska_ids.h
@@ -1,5 +1,7 @@
 /*
  * Matroska Semantic constants
+ *  DO NOT EDIT, GENERATED WITH schema_2_lavf_h.xsl
+ *
  * Copyright (c) 2003-2020 The FFmpeg Project
  *
  * This file is part of FFmpeg.
@@ -30,162 +32,164 @@
 #define MATROSKA_ID_SEGMENT0x18538067
 
 /* Matroska top-level master IDs */
-#define MATROSKA_ID_INFO   0x1549A966
-#define MATROSKA_ID_TRACKS 0x1654AE6B
-#define MATROSKA_ID_CUES   0x1C53BB6B
-#define MATROSKA_ID_TAGS   0x1254C367
-#define MATROSKA_ID_SEEKHEAD   0x114D9B74
-#define MATROSKA_ID_ATTACHMENTS 0x1941A469
-#define MATROSKA_ID_CLUSTER0x1F43B675
-#define MATROSKA_ID_CHAPTERS   0x1043A770
+#define MATROSKA_ID_INFO0x1549A966
+#define MATROSKA_ID_TRACKS  0x1654AE6B
+#define MATROSKA_ID_CUES0x1C53BB6B
+#define MATROSKA_ID_TAGS0x1254C367
+#define MATROSKA_ID_SEEKHEAD0x114D9B74
+#define MATROSKA_ID_ATTACHMENTS 0x1941A469
+#define MATROSKA_ID_CLUSTER 0x1F43B675
+#define MATROSKA_ID_CHAPTERS0x1043A770
 
 /* IDs in the info master */
-#define MATROSKA_ID_TIMECODESCALE 0x2AD7B1
-#define MATROSKA_ID_DURATION   0x4489
-#define MATROSKA_ID_TITLE  0x7BA9
-#define MATROSKA_ID_WRITINGAPP 0x5741
-#define MATROSKA_ID_MUXINGAPP  0x4D80
-#define MATROSKA_ID_DATEUTC0x4461
-#define MATROSKA_ID_SEGMENTUID 0x73A4
+#define MATROSKA_ID_TIMECODESCALE   0x2AD7B1
+#define MATROSKA_ID_DURATION0x4489
+#define MATROSKA_ID_TITLE   0x7BA9
+#define MATROSKA_ID_WRITINGAPP  0x5741
+#define MATROSKA_ID_MUXINGAPP   0x4D80
+#define MATROSKA_ID_DATEUTC 0x4461
+#define MATROSKA_ID_SEGMENTUID  0x73A4
 
-/* ID in the tracks master */
-#define MATROSKA_ID_TRACKENTRY 0xAE
+/* IDs in the tracks master */
+#define MATROSKA_ID_TRACKENTRY  0xAE
 
 /* IDs in the trackentry master */
-#define MATROSKA_ID_TRACKNUMBER 0xD7
-#define MATROSKA_ID_TRACKUID   0x73C5
-#define MATROSKA_ID_TRACKTYPE  0x83
-#define MATROSKA_ID_TRACKVIDEO 0xE0
-#define MATROSKA_ID_TRACKAUDIO 0xE1
-#define MATROSKA_ID_TRACKOPERATION 0xE2
-#define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
-#define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
-#define MATROSKA_ID_TRACKNAME  0x536E
-#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
-#define MATROSKA_ID_CODECID0x86
-#define MATROSKA_ID_CODECPRIVATE 0x63A2
-#define MATROSKA_ID_CODECNAME  0x258688
-#define MATROSKA_ID_CODECINFOURL 0x3B4040
-#define MATROSKA_ID_CODECDOWNLOADURL 0x26B240
-#define MATROSKA_ID_CODECDECODEALL 0xAA
-#define MATROSKA_ID_CODECDELAY 0x56AA
-#define MATROSKA_ID_SEEKPREROLL 0x56BB
-#define MATROSKA_ID_TRACKFLAGENABLED 0xB9
-#define MATROSKA_ID_TRACKFLAGDEFAULT 0x88
-#define MATROSKA_ID_TRACKFLAGFORCED 0x55AA
-#define MATROSKA_ID_TRACKFLAGLACING 0x9C
-#define MATROSKA_ID_TRACKMINCACHE 0x6DE7
-#define MATROSKA_ID_TRACKMAXCACHE 0x6DF8
-#define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
-#define MATROSKA_ID_TRACKCONTENTENCODINGS 0x6D80
+#define MATROSKA_ID_TRACKNUMBER 0xD7
+#define MATROSKA_ID_TRACKUID0x73C5
+#define MATROSKA_ID_TRACKTYPE   0x83
+#define MATROSKA_ID_TRACKVIDEO  0xE0
+#define MATROSKA_ID_TRACKAUDIO  0xE1
+#define MATROSKA_ID_TRACKOPERATION  0xE2
+#define MATROSKA_ID_TRACKTIMECODESCALE  0x23314F
+#define MATROSKA_ID_TRACKMAXBLKADDID0x55EE
+#define MATROSKA_ID_TRACKNAME   0x536E
+#define MATROSKA_ID_TRACKLANGUAGE   0x22B59C
+#define MATROSKA_ID_CODECID 0x86
+#define MATROSKA_ID_CODECPRIVATE0x63A2
+#define MATROSKA_ID_CODECNAME   0x258688
+#define MATROSKA_ID_CODECINFOURL0x3B4040
+#define MATROSKA_ID_CODECDOWNLOADURL0x26B240
+#define MATROSKA_ID_CODECDECODEALL  0xAA
+#define MATROSKA_ID_CODECDELAY  0x56AA
+#define MATROSKA_ID_SEEKPREROLL 0x56BB
+#define MATROSKA_ID_TRACKFLAGENABLED0xB9
+#define MATROSKA_ID_TRACKFLAGDEFAULT0x88
+#define MATROSKA_ID_TRACKFLAGFORCED 0x55AA
+#define MATROSKA_ID_TRACKFLAGLACING 0x9C
+#define MATROSKA_ID_TRACKMINCACHE   0x6DE7
+#define MATROSKA_ID_TRACKMAXCACHE   0x6DF8
+#define MATROSKA_ID_TRACKDEFAULTDURATION  0x23E383
+#define MATROSKA_ID_TRACKCONTENTENCODINGS  0x6D80
 
 /* IDs in the contentencodings master */
-#define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
+#define MATROSKA_ID_TRACKCONTENTENCODING  0x6240
 
 /* IDs in the content encoding master */
-#define MATROSKA_ID_ENCODINGORDER 0x5031
-#define MATROSKA_ID_ENCODINGSCOPE 0x5032
-#define MATROSKA_ID_ENCODINGTYPE 0x5033

[FFmpeg-devel] [PATCH 10/14] avformat/matroskadec: move the elements semantic in a separate file

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

So the file can be generated from the Matroska Schema.

The EbmlSyntax structures are not shared between files.
matroska_segments and matroska_cluster_enter also have their size predefined.

No functional changes.
---
 libavformat/Makefile  |   2 +-
 libavformat/matroskadec.c | 668 +-
 libavformat/matroskasem.c | 384 ++
 libavformat/matroskasem.h | 362 +
 4 files changed, 748 insertions(+), 668 deletions(-)
 create mode 100644 libavformat/matroskasem.c
 create mode 100644 libavformat/matroskasem.h

diff --git a/libavformat/Makefile b/libavformat/Makefile
index 8fd0d43721..09cd0d49ce 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -294,7 +294,7 @@ OBJS-$(CONFIG_LVF_DEMUXER)   += lvfdec.o
 OBJS-$(CONFIG_LXF_DEMUXER)   += lxfdec.o
 OBJS-$(CONFIG_M4V_DEMUXER)   += m4vdec.o rawdec.o
 OBJS-$(CONFIG_M4V_MUXER) += rawenc.o
-OBJS-$(CONFIG_MATROSKA_DEMUXER)  += matroskadec.o matroska.o  \
+OBJS-$(CONFIG_MATROSKA_DEMUXER)  += matroskadec.o matroskasem.o 
matroska.o \
 rmsipr.o flac_picture.o \
 oggparsevorbis.o vorbiscomment.o \
 flac_picture.o replaygain.o
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index b021a4cce0..8aa2cbda61 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -54,6 +54,7 @@
 #include "internal.h"
 #include "isom.h"
 #include "matroska.h"
+#include "matroskasem.h"
 #include "oggdec.h"
 /* For ff_codec_get_id(). */
 #include "riff.h"
@@ -80,673 +81,6 @@
  * to this many bytes of unknown data 
for the
  * SKIP_THRESHOLD check. */
 
-typedef enum {
-EBML_NONE,
-EBML_UINT,
-EBML_SINT,
-EBML_FLOAT,
-EBML_STR,
-EBML_UTF8,
-EBML_BIN,
-EBML_NEST,
-EBML_LEVEL1,
-EBML_STOP,
-EBML_TYPE_COUNT
-} EbmlType;
-
-typedef const struct EbmlSyntax {
-uint32_t id;
-EbmlType type;
-size_t list_elem_size;
-size_t data_offset;
-union {
-int64_t i;
-uint64_tu;
-double  f;
-const char *s;
-const struct EbmlSyntax *n;
-} def;
-} EbmlSyntax;
-
-typedef struct EbmlList {
-int nb_elem;
-unsigned int alloc_elem_size;
-void *elem;
-} EbmlList;
-
-typedef struct EbmlBin {
-int  size;
-AVBufferRef *buf;
-uint8_t *data;
-int64_t  pos;
-} EbmlBin;
-
-typedef struct Ebml {
-uint64_t version;
-uint64_t max_size;
-uint64_t id_length;
-char*doctype;
-uint64_t doctype_version;
-} Ebml;
-
-typedef struct MatroskaTrackCompression {
-uint64_t algo;
-EbmlBin  settings;
-} MatroskaTrackCompression;
-
-typedef struct MatroskaTrackEncryption {
-uint64_t algo;
-EbmlBin  key_id;
-} MatroskaTrackEncryption;
-
-typedef struct MatroskaTrackEncoding {
-uint64_t scope;
-uint64_t type;
-MatroskaTrackCompression compression;
-MatroskaTrackEncryption encryption;
-} MatroskaTrackEncoding;
-
-typedef struct MatroskaMasteringMeta {
-double r_x;
-double r_y;
-double g_x;
-double g_y;
-double b_x;
-double b_y;
-double white_x;
-double white_y;
-double max_luminance;
-double min_luminance;
-} MatroskaMasteringMeta;
-
-typedef struct MatroskaTrackVideoColor {
-uint64_t matrix_coefficients;
-uint64_t bits_per_channel;
-uint64_t chroma_sub_horz;
-uint64_t chroma_sub_vert;
-uint64_t cb_sub_horz;
-uint64_t cb_sub_vert;
-uint64_t chroma_siting_horz;
-uint64_t chroma_siting_vert;
-uint64_t range;
-uint64_t transfer_characteristics;
-uint64_t primaries;
-uint64_t max_cll;
-uint64_t max_fall;
-MatroskaMasteringMeta mastering_meta;
-} MatroskaTrackVideoColor;
-
-typedef struct MatroskaTrackVideoProjection {
-uint64_t type;
-EbmlBin private;
-double yaw;
-double pitch;
-double roll;
-} MatroskaTrackVideoProjection;
-
-typedef struct MatroskaTrackVideo {
-double   frame_rate;
-uint64_t display_width;
-uint64_t display_height;
-uint64_t pixel_width;
-uint64_t pixel_height;
-EbmlBin  color_space;
-uint64_t display_unit;
-uint64_t interlaced;
-uint64_t field_order;
-uint64_t stereo_mode;
-uint64_t alpha_mode;
-EbmlList color;
-MatroskaTrackVideoProjection projection;
-} MatroskaTrackVideo;
-
-typedef struct MatroskaTrackAudio {
-double   samplerate;
-double   out_samplerate;
-uint64_t bitdepth;
-uint64_t channels;
-
-/* real audio header (extracted from extradata) */
-int  coded_framesize;
-int  sub_packet_h;
-int  frame_size;
-int  sub_packet_size;
-i

[FFmpeg-devel] [PATCH 12/14] avformat/matroskasem: reorder some EbmlSyntax elements

2020-03-22 Thread Steve Lhomme
From: Steve Lhomme 

So it's easier to match with the XSLT ordering which has limited possibilities
(15 max criteria for all the syntax tables).

No functional changes.
---
 libavformat/matroskasem.c | 26 +-
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/libavformat/matroskasem.c b/libavformat/matroskasem.c
index 27aa6d9c4e..aca506b943 100644
--- a/libavformat/matroskasem.c
+++ b/libavformat/matroskasem.c
@@ -101,10 +101,6 @@ EbmlSyntax matroska_track_video[] = {
 { MATROSKA_ID_VIDEODISPLAYHEIGHT,  EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, display_height), { .u=-1 } },
 { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, pixel_width) },
 { MATROSKA_ID_VIDEOPIXELHEIGHT,EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, pixel_height) },
-{ MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN,   0, 
offsetof(MatroskaTrackVideo, color_space) },
-{ MATROSKA_ID_VIDEOALPHAMODE,  EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, alpha_mode) },
-{ MATROSKA_ID_VIDEOCOLOR,  EBML_NEST,  
sizeof(MatroskaTrackVideoColor), offsetof(MatroskaTrackVideo, color), { .n = 
matroska_track_video_color } },
-{ MATROSKA_ID_VIDEOPROJECTION, EBML_NEST,  0, 
offsetof(MatroskaTrackVideo, projection), { .n = 
matroska_track_video_projection } },
 { MATROSKA_ID_VIDEOPIXELCROPB, EBML_NONE },
 { MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE },
 { MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE },
@@ -112,6 +108,10 @@ EbmlSyntax matroska_track_video[] = {
 { MATROSKA_ID_VIDEODISPLAYUNIT,EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, display_unit), { .u= 
MATROSKA_VIDEO_DISPLAYUNIT_PIXELS } },
 { MATROSKA_ID_VIDEOFLAGINTERLACED, EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, interlaced),  { .u = 
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED } },
 { MATROSKA_ID_VIDEOFIELDORDER, EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, field_order), { .u = 
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } },
+{ MATROSKA_ID_VIDEOALPHAMODE,  EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, alpha_mode) },
+{ MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN,   0, 
offsetof(MatroskaTrackVideo, color_space) },
+{ MATROSKA_ID_VIDEOCOLOR,  EBML_NEST,  
sizeof(MatroskaTrackVideoColor), offsetof(MatroskaTrackVideo, color), { .n = 
matroska_track_video_color } },
+{ MATROSKA_ID_VIDEOPROJECTION, EBML_NEST,  0, 
offsetof(MatroskaTrackVideo, projection), { .n = 
matroska_track_video_projection } },
 { MATROSKA_ID_VIDEOSTEREOMODE, EBML_UINT,  0, 
offsetof(MatroskaTrackVideo, stereo_mode), { .u = 
MATROSKA_VIDEO_STEREOMODE_TYPE_NB } },
 { MATROSKA_ID_VIDEOASPECTRATIO,EBML_NONE },
 CHILD_OF(matroska_track)
@@ -187,18 +187,18 @@ EbmlSyntax matroska_track[] = {
 { MATROSKA_ID_TRACKFLAGFORCED,   EBML_UINT,  0, 
offsetof(MatroskaTrack, flag_forced) },
 { MATROSKA_ID_TRACKVIDEO,EBML_NEST,  0, 
offsetof(MatroskaTrack, video),{ .n = matroska_track_video } },
 { MATROSKA_ID_TRACKAUDIO,EBML_NEST,  0, 
offsetof(MatroskaTrack, audio),{ .n = matroska_track_audio } },
-{ MATROSKA_ID_TRACKOPERATION,EBML_NEST,  0, 
offsetof(MatroskaTrack, operation),{ .n = matroska_track_operation } },
-{ MATROSKA_ID_TRACKCONTENTENCODINGS, EBML_NEST,  0, 0, 
{ .n = matroska_track_encodings } },
-{ MATROSKA_ID_TRACKMAXBLKADDID,  EBML_UINT,  0, 
offsetof(MatroskaTrack, max_block_additional_id) },
-{ MATROSKA_ID_SEEKPREROLL,   EBML_UINT,  0, 
offsetof(MatroskaTrack, seek_preroll) },
 { MATROSKA_ID_TRACKFLAGENABLED,  EBML_NONE },
 { MATROSKA_ID_TRACKFLAGLACING,   EBML_NONE },
+{ MATROSKA_ID_TRACKMINCACHE, EBML_NONE },
+{ MATROSKA_ID_TRACKMAXCACHE, EBML_NONE },
+{ MATROSKA_ID_TRACKMAXBLKADDID,  EBML_UINT,  0, 
offsetof(MatroskaTrack, max_block_additional_id) },
 { MATROSKA_ID_CODECNAME, EBML_NONE },
-{ MATROSKA_ID_CODECDECODEALL,EBML_NONE },
 { MATROSKA_ID_CODECINFOURL,  EBML_NONE },
 { MATROSKA_ID_CODECDOWNLOADURL,  EBML_NONE },
-{ MATROSKA_ID_TRACKMINCACHE, EBML_NONE },
-{ MATROSKA_ID_TRACKMAXCACHE, EBML_NONE },
+{ MATROSKA_ID_CODECDECODEALL,EBML_NONE },
+{ MATROSKA_ID_SEEKPREROLL,   EBML_UINT,  0, 
offsetof(MatroskaTrack, seek_preroll) },
+{ MATROSKA_ID_TRACKOPERATION,EBML_NEST,  0, 
offsetof(MatroskaTrack, operation),{ .n = matroska_track_operation } },
+{ MATROSKA_ID_TRACKCONTENTENCODINGS, EBML_NEST,  0, 0, 
{ .n = matroska_track_encodings } },
 CHILD_OF(matroska_tracks)
 };
 
@@ -307,10 +307,10 @@ EbmlSyntax matroska_cluster_parsing[] = {
 { MATROSKA_ID_SIMPLEBLOCK, EBML_BIN,  0, offsetof(MatroskaBlock, bin) 
},
 { MATROSKA_ID_BLOCKGROUP,  EBML_NEST, 0, 0, { .n = matroska_block

Re: [FFmpeg-devel] [PATCH 13/14] tools: add XLSTs script to generate matroska semantic files

2020-03-22 Thread Steve Lhomme


> On 22 Mar 2020, at 11:34, Carl Eugen Hoyos  wrote:
> 
> Am So., 22. März 2020 um 10:02 Uhr schrieb Steve Lhomme :
>> 
>> From: Steve Lhomme 
>> 
>> Usage:
>> xsltproc -o matroska_ids.h schema_2_lavf_h.xsl ebml_matroska.xml
>> xsltproc -o matroskasem.c schema_2_lavf_sem_c.xsl ebml_matroska.xml
>> 
>> The ebml_matroska.xml file comes from
>> https://github.com/cellar-wg/matroska-specification/blob/master/ebml_matroska.xml
>> With an extra TagDefault_Bug element to parse an old invalid tag ID.
> 
>> tools/ebml_matroska.xml   | 1344 +
> 
> I would have expected that this file is not part of the FFmpeg source code.

I'm ok with that, although the original file is modified to add a bogus element 
still supported by lavf. If at some point the files are generated (before 
building or making a source package) the file should be down and patched to 
generate the files.

It seems FFmpeg doesn't have generated source files yet so I'm not sure what is 
the best/recommended way.

> 
>> tools/schema_2_lavf_h.xsl |  741 ++
>> tools/schema_2_lavf_sem_c.xsl | 1163 
>> 3 files changed, 3248 insertions(+)
>> create mode 100644 tools/ebml_matroska.xml
>> create mode 100644 tools/schema_2_lavf_h.xsl
>> create mode 100644 tools/schema_2_lavf_sem_c.xsl
> 
> Carl Eugen
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 02/14] avformat/matroska: clean the structure formatting

2020-03-28 Thread Steve Lhomme

On 2020-03-25 23:24, Andreas Rheinhardt wrote:

Steve Lhomme:

From: Steve Lhomme 

Always use a comma at the end, order elements by value.
---
  libavformat/matroska.h | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 9e33e51c94..e177cd027f 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -286,13 +286,13 @@ typedef enum {
  typedef enum {
  MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED = 0,
  MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED   = 1,
-MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2
+MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2,
  } MatroskaVideoInterlaceFlag;
  
  typedef enum {

  MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE  = 0,
-MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
  MATROSKA_VIDEO_FIELDORDER_TT   = 1,
+MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
  MATROSKA_VIDEO_FIELDORDER_BB   = 6,
  MATROSKA_VIDEO_FIELDORDER_TB   = 9,
  MATROSKA_VIDEO_FIELDORDER_BT   = 14,


Would it actually be allowed to add new values to the range of
FlagInterlaced (to which the MatroskaVideoInterlaceFlag enum
corresponds)? If no, then we should not add a comma, as this signals
extensibility.
The reordering looks good either way.


Yes, dependending on the DocType version it might be possible that some 
new values are added to enums (not just this one).


Also I'm not sure I can tell an element in the last of an "list" in XSLT 
so that would be more trouble to generate the code.

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 10/14] avformat/matroskadec: move the elements semantic in a separate file

2020-03-28 Thread Steve Lhomme

On 2020-03-25 3:09, Andreas Rheinhardt wrote:

Steve Lhomme:

From: Steve Lhomme 

So the file can be generated from the Matroska Schema.

The EbmlSyntax structures are not shared between files.
matroska_segments and matroska_cluster_enter also have their size predefined.

No functional changes.
---
  libavformat/Makefile  |   2 +-
  libavformat/matroskadec.c | 668 +-
  libavformat/matroskasem.c | 384 ++
  libavformat/matroskasem.h | 362 +
  4 files changed, 748 insertions(+), 668 deletions(-)
  create mode 100644 libavformat/matroskasem.c
  create mode 100644 libavformat/matroskasem.h


[...]


diff --git a/libavformat/matroskasem.h b/libavformat/matroskasem.h
new file mode 100644
index 00..8171982abf
--- /dev/null
+++ b/libavformat/matroskasem.h
@@ -0,0 +1,362 @@
+/*
+ * Matroska file semantic definition
+ * Copyright (c) 2003-2020 The FFmpeg project
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Matroska file demuxer
+ * @author Ronald Bultje 
+ * @author with a little help from Moritz Bunkus 
+ * @author totally reworked by Aurelien Jacobs 
+ * @see specs available on the Matroska project page: http://www.matroska.org/
+ */
+
+#ifndef AVFORMAT_MATROSKASEM_H
+#define AVFORMAT_MATROSKASEM_H
+
+#include 
+
+#include "matroska.h"
+#include "avformat.h"
+#include "libavutil/frame.h"


Is it possible that you just included this for AVBufferRef (which is
defined in libavutil/buffer.h)?


Sure, I'll give it a try.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 01/20] avformat/matroskaenc: Ensure that ChapterUID are != 0

2020-04-18 Thread Steve Lhomme
> On April 5, 2020 5:59 PM Andreas Rheinhardt  
> wrote:
> 
>  
> AVChapters have an int as id field and therefore this value can appear
> <= 0. When remuxing from Matroska, this value actually contains
> the lower 32 bits of the original ChapterUID (which can be 64 bits).
> 
> In order to ensure that the ChapterUID is always > 0, they were offset
> as follows (since 07704c61): First max(0, 1LL - chapter[i].id) was computed
> and stored in an uint32_t. And then the IDs were offset using this value.
> 
> This has two downsides:
> 1. It does not ensure that the UID is actually != 0: Namely if there is
> a chapter with id == INT_MIN, then the offset will be 2^31 + 1 and a
> chapter with id == INT_MAX will become 2^31 - 1 + 2^31 + 1 = 2^32 = 0,
> because the actual calculation was performed in 32 bits.
> 2. As soon as a chapter id appears to be negative, a nontrivial offset
> is used, so that not even a ChapterUID that only uses 32 bits is
> preserved.
> 
> So change this by treating the id as an unsigned value internally and
> only offset (by 1) if an id vanishes. The actual offsetting then has to
> be performed in 64 bits in order to make sure that no UINT32_MAX wraps
> around.

That means you are changing the chapter UIDs of the source when remuxing (if 
for some reason a chapter with no id was added in the process). If tags were 
referencing the chapter UIDs (TagChapterUID) they don't match the chapter 
anymore.

I think silently changing the IDs is wrong. But its was already like that 
before, so that's not breaking your patch. If anything your patch is less 
likely to break remuxing.

> Signed-off-by: Andreas Rheinhardt 
> ---
>  libavformat/matroskaenc.c | 15 ++-
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index 060e8b7816..a377d092df 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -1422,7 +1422,8 @@ static int mkv_write_chapters(AVFormatContext *s)
>  }
>  
>  chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0);
> -put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, c->id + 
> mkv->chapter_id_offset);
> +put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID,
> +  (uint32_t)c->id + (uint64_t)mkv->chapter_id_offset);
>  put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart);
>  put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend);
>  if (mkv->mode != MODE_WEBM) {
> @@ -1479,7 +1480,7 @@ static int mkv_write_simpletag(AVIOContext *pb, 
> AVDictionaryEntry *t)
>  }
>  
>  static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid,
> - unsigned int uid, ebml_master *tag)
> + uint64_t uid, ebml_master *tag)
>  {
>  AVIOContext *pb;
>  MatroskaMuxContext *mkv = s->priv_data;
> @@ -1518,7 +1519,7 @@ static int mkv_check_tag_name(const char *name, 
> uint32_t elementid)
>  }
>  
>  static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, uint32_t 
> elementid,
> - unsigned int uid)
> + uint64_t uid)
>  {
>  MatroskaMuxContext *mkv = s->priv_data;
>  ebml_master tag;
> @@ -1612,7 +1613,8 @@ static int mkv_write_tags(AVFormatContext *s)
>  if (!mkv_check_tag(ch->metadata, 
> MATROSKA_ID_TAGTARGETS_CHAPTERUID))
>  continue;
>  
> -ret = mkv_write_tag(s, ch->metadata, 
> MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id + mkv->chapter_id_offset);
> +ret = mkv_write_tag(s, ch->metadata, 
> MATROSKA_ID_TAGTARGETS_CHAPTERUID,
> +(uint32_t)ch->id + 
> (uint64_t)mkv->chapter_id_offset);
>  if (ret < 0)
>  return ret;
>  }
> @@ -1882,7 +1884,10 @@ static int mkv_write_header(AVFormatContext *s)
>  return ret;
>  
>  for (i = 0; i < s->nb_chapters; i++)
> -mkv->chapter_id_offset = FFMAX(mkv->chapter_id_offset, 1LL - 
> s->chapters[i]->id);
> +if (!s->chapters[i]->id) {
> +mkv->chapter_id_offset = 1;
> +break;
> +}
>  
>  ret = mkv_write_chapters(s);
>  if (ret < 0)
> -- 
> 2.20.1
> 
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 04/20] avformat/matroskaenc: Reuse random seed

2020-04-19 Thread Steve Lhomme
Wouldn't it be better to set the AVLFG in the MatroskaMuxContext in mkv_init 
and keep using it when needed ?

Then you can still update UIDs in the location you really need to create them.

> On April 5, 2020 5:59 PM Andreas Rheinhardt  
> wrote:
> 
>  
> This commit reuses the random seed generated in mkv_init() (to determine
> the TrackUIDs) for the SegmentUID in order to avoid a potentially
> expensive call to av_get_random_seed().
> 
> Signed-off-by: Andreas Rheinhardt 
> ---
>  libavformat/matroskaenc.c | 19 +--
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index d2046193ee..b93c50cb01 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -161,6 +161,8 @@ typedef struct MatroskaMuxContext {
>  int wrote_chapters;
>  
>  int allow_raw_vfw;
> +
> +uint32_t segment_uid[4];
>  } MatroskaMuxContext;
>  
>  /** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint,
> @@ -1821,15 +1823,7 @@ static int mkv_write_header(AVFormatContext *s)
>  put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
>  
>  if (mkv->mode != MODE_WEBM) {
> -uint32_t segment_uid[4];
> -AVLFG lfg;
> -
> -av_lfg_init(&lfg, av_get_random_seed());
> -
> -for (i = 0; i < 4; i++)
> -segment_uid[i] = av_lfg_get(&lfg);
> -
> -put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
> +put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 
> 16);
>  }
>  } else {
>  const char *ident = "Lavf";
> @@ -2661,9 +2655,14 @@ static int mkv_init(struct AVFormatContext *s)
>  return AVERROR(ENOMEM);
>  }
>  
> -if (!(s->flags & AVFMT_FLAG_BITEXACT))
> +if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
>  av_lfg_init(&c, av_get_random_seed());
>  
> +// Calculate the SegmentUID now in order not to waste our random 
> seed.
> +for (i = 0; i < 4; i++)
> +mkv->segment_uid[i] = av_lfg_get(&c);
> +}
> +
>  for (i = 0; i < s->nb_streams; i++) {
>  mkv_track *track = &mkv->tracks[i];
>  
> -- 
> 2.20.1
> 
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 06/20] avformat/matroskaenc: Make output more deterministic

2020-04-19 Thread Steve Lhomme
Not sure how FATE works but I suppose the pseudo-random becomes deterministic ? 
In that case the size should always be the same. And if not having a fixed size 
will make no difference.

If FATE can skip random parts of a file (which your patch would solve) it will 
miss inconsitencies of UIDs that should be the same in two places of the file. 
So IMO it's not good. I suggest to have a flag in the muxer to force the seed 
to a fixed value when using FATE.

> On April 5, 2020 5:59 PM Andreas Rheinhardt  
> wrote:
> 
>  
> Using random values for TrackUID and FileUID (as happens when the
> AVFMT_FLAG_BITEXACT flag is not set) has the obvious downside of making
> the output indeterministic. This commit mitigates this by writing the
> potentially random values with a fixed size of eight byte, even if their
> actual values would fit into less than eight bytes. This ensures that
> even in non-bitexact mode, the differences between two files generated
> with the same settings are restricted to a few bytes in the header.
> (Namely the SegmentUID, the TrackUIDs (in Tracks as well as when
> referencing them via TagTrackUID), the FileUIDs (in Attachments as
> well as in TagAttachmentUID) as well as the CRC-32 checksums of the
> Info, Tracks, Attachments and Tags level-1-elements.) Without this
> patch, there might be an offset/a size difference between two such
> files.
> 
> The FATE-tests had to be updated because the fixed-sized UIDs are also
> used in bitexact mode.
> 
> Signed-off-by: Andreas Rheinhardt 
> ---
>  libavformat/matroskaenc.c | 16 +--
>  tests/fate/matroska.mak   |  2 +-
>  tests/fate/wavpack.mak|  4 +-
>  tests/ref/fate/aac-autobsf-adtstoasc  |  4 +-
>  tests/ref/fate/binsub-mksenc  |  2 +-
>  tests/ref/fate/matroska-flac-extradata-update |  4 +-
>  tests/ref/fate/rgb24-mkv  |  4 +-
>  tests/ref/lavf-fate/av1.mkv   |  4 +-
>  tests/ref/lavf/mka|  4 +-
>  tests/ref/lavf/mkv|  4 +-
>  tests/ref/lavf/mkv_attachment |  4 +-
>  tests/ref/seek/lavf-mkv   | 44 +--
>  12 files changed, 53 insertions(+), 43 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index 135d5e3abd..cf2bb7b933 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -226,6 +226,16 @@ static void put_ebml_num(AVIOContext *pb, uint64_t num, 
> int bytes)
>  avio_w8(pb, (uint8_t)(num >> i * 8));
>  }
>  
> +/**
> + * Write a (random) UID with fixed size to make the output more deterministic
> + */
> +static void put_ebml_uid(AVIOContext *pb, uint32_t elementid, uint64_t uid)
> +{
> +put_ebml_id(pb, elementid);
> +put_ebml_num(pb, 8, 0);
> +avio_wb64(pb, uid);
> +}
> +
>  static void put_ebml_uint(AVIOContext *pb, uint32_t elementid, uint64_t val)
>  {
>  int i, bytes = 1;
> @@ -1104,7 +1114,7 @@ static int mkv_write_track(AVFormatContext *s, 
> MatroskaMuxContext *mkv,
>  track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
>  put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER,
> mkv->is_dash ? mkv->dash_track_number : i + 1);
> -put_ebml_uint (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid);
> +put_ebml_uid  (pb, MATROSKA_ID_TRACKUID, mkv->tracks[i].uid);
>  put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0);// no lacing 
> (yet)
>  
>  if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
> @@ -1485,7 +1495,7 @@ static int mkv_write_tag_targets(AVFormatContext *s, 
> uint32_t elementid,
>  *tag= start_ebml_master(pb, MATROSKA_ID_TAG,0);
>  targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 0);
>  if (elementid)
> -put_ebml_uint(pb, elementid, uid);
> +put_ebml_uid(pb, elementid, uid);
>  end_ebml_master(pb, targets);
>  return 0;
>  }
> @@ -1684,7 +1694,7 @@ static int mkv_write_attachments(AVFormatContext *s)
>  
>  put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype);
>  put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, 
> st->codecpar->extradata, st->codecpar->extradata_size);
> -put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, track->uid);
> +put_ebml_uid(dyn_cp, MATROSKA_ID_FILEUID, track->uid);
>  end_ebml_master(dyn_cp, attached_file);
>  }
>  end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0);
> diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak
> index 4b9ee7a872..8cc35d52da 100644
> --- a/tests/fate/matroska.mak
> +++ b/tests/fate/matroska.mak
> @@ -12,7 +12,7 @@ fate-matroska-prores-header-insertion-bz2: CMD = framecrc 
> -i $(TARGET_SAMPLES)/m
>  FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux
>  fate-matroska-remux: CMD = md5pipe -i 
> $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:

Re: [FFmpeg-devel] [PATCH 12/20] avformat/matroskaenc: Improve Cues in case of no video

2020-04-19 Thread Steve Lhomme
> On April 5, 2020 5:59 PM Andreas Rheinhardt  
> wrote:
> 
>  
> The Matroska muxer currently only adds CuePoints in three cases:
> a) For video keyframes. b) For the first audio frame in a new Cluster if
> in DASH-mode. c) For subtitles. This means that ordinary Matroska audio
> files won't have any Cues which impedes seeking.
> 
> This commit changes this. For every track in a file without video track
> it is checked and tracked whether a Cue entry has already been added
> for said track for the current Cluster. This is used to add a Cue entry
> for each first packet of each track in each Cluster.
> 
> Implements #3149.
> 
> Signed-off-by: Andreas Rheinhardt 
> ---
>  libavformat/matroskaenc.c | 21 +++
>  tests/ref/fate/aac-autobsf-adtstoasc  |  4 ++--
>  tests/ref/fate/matroska-flac-extradata-update |  4 ++--
>  tests/ref/lavf/mka|  4 ++--
>  4 files changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index b9bfd34756..a469d48cc0 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -2120,6 +2120,10 @@ static void mkv_end_cluster(AVFormatContext *s)
>  MatroskaMuxContext *mkv = s->priv_data;
>  
>  end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 
> 0, 1);
> +if (!mkv->have_video) {

You could initialize it even for video. In case in the future you want a Cue 
only on the first video keyframe of the Cluster.

> +for (unsigned i = 0; i < s->nb_streams; i++)
> +mkv->tracks[i].has_cue = 0;
> +}
>  mkv->cluster_pos = -1;
>  avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
>  }
> @@ -,7 +2226,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, 
> AVPacket *pkt)
>  return 0;
>  }
>  
> -static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int 
> add_cue)
> +static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
>  {
>  MatroskaMuxContext *mkv = s->priv_data;
>  AVIOContext *pb;
> @@ -2268,10 +2272,12 @@ static int mkv_write_packet_internal(AVFormatContext 
> *s, AVPacket *pkt, int add_
>  ret = mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe);
>  if (ret < 0)
>  return ret;
> -if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == 
> AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) {
> +if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && keyframe &&
> +(par->codec_type == AVMEDIA_TYPE_VIDEO || !mkv->have_video && 
> !track->has_cue)) {

You may restrict this to Audio/Subtitles. Other streams/tracks may not create a 
cue entry.

>  ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts,
> mkv->cluster_pos, relative_packet_pos, 
> -1);
>  if (ret < 0) return ret;
> +track->has_cue = 1;
>  }
>  } else {
>  if (par->codec_id == AV_CODEC_ID_WEBVTT) {
> @@ -2336,8 +2342,7 @@ static int mkv_write_packet(AVFormatContext *s, 
> AVPacket *pkt)
>  // on seeing key frames.
>  start_new_cluster = keyframe;
>  } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO &&
> -   (mkv->cluster_pos == -1 ||
> -cluster_time > mkv->cluster_time_limit)) {
> +   cluster_time > mkv->cluster_time_limit) {

Is this related to this patch ? It currently means that if the Cluster did not 
write any Block then a new cluster is not needed.

>  // For DASH audio, we create a Cluster based on cluster_time_limit
>  start_new_cluster = 1;
>  } else if (!mkv->is_dash &&
> @@ -2361,9 +2366,7 @@ static int mkv_write_packet(AVFormatContext *s, 
> AVPacket *pkt)
>  
>  // check if we have an audio packet cached
>  if (mkv->cur_audio_pkt.size > 0) {
> -// for DASH audio, a CuePoint has to be added when there is a new 
> cluster.
> -ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt,
> -mkv->is_dash ? start_new_cluster : 
> 0);
> +ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
>  av_packet_unref(&mkv->cur_audio_pkt);
>  if (ret < 0) {
>  av_log(s, AV_LOG_ERROR,
> @@ -2378,7 +2381,7 @@ static int mkv_write_packet(AVFormatContext *s, 
> AVPacket *pkt)
>  if (pkt->size > 0)
>  ret = av_packet_ref(&mkv->cur_audio_pkt, pkt);
>  } else
> -ret = mkv_write_packet_internal(s, pkt, 0);
> +ret = mkv_write_packet_internal(s, pkt);
>  return ret;
>  }
>  
> @@ -2406,7 +2409,7 @@ static int mkv_write_trailer(AVFormatContext *s)
>  
>  // check if we have an audio packet cached
>  if (mkv->cur_audio_pkt.size > 0) {
> -ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt, 0);
> +ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
> 

Re: [FFmpeg-devel] [PATCH 04/20] avformat/matroskaenc: Reuse random seed

2020-04-19 Thread Steve Lhomme
> On April 19, 2020 9:11 AM Andreas Rheinhardt  
> wrote:
> 
>  
> Steve Lhomme:
> > Wouldn't it be better to set the AVLFG in the MatroskaMuxContext in 
> > mkv_init and keep using it when needed ?
> > 
> > Then you can still update UIDs in the location you really need to create 
> > them.
> > 
> What other UIDs do I need? UIDs for tracks and attachments are created
> in init as is the SegmentUID. The EditionUID is not written as we only
> support ordinary chapters for now (FFmpeg does not have nested chapters
> or multiple editions or hierarchical metadata -- I really don't know how
> this could be supported). And the ChapterUIDs are not created randomly.

That's a general rule so you don't need to adapt everytime you need a new UIDs. 
And it's easier/cleaner to generate UIDs when the item they relate to is 
created.

Anyway, it's not a blocker, just a general remark.

As for other UIDs they should be randomized (hence the Unique in UIDs) unless 
you're remuxing or taking the values from other sources which is sometimes 
needed for advanced chapter handling or referencing a part of the same mux via 
a UID.
 
> - Andreas
> 
> >> On April 5, 2020 5:59 PM Andreas Rheinhardt  
> >> wrote:
> >>
> >>  
> >> This commit reuses the random seed generated in mkv_init() (to determine
> >> the TrackUIDs) for the SegmentUID in order to avoid a potentially
> >> expensive call to av_get_random_seed().
> >>
> >> Signed-off-by: Andreas Rheinhardt 
> >> ---
> >>  libavformat/matroskaenc.c | 19 +--
> >>  1 file changed, 9 insertions(+), 10 deletions(-)
> >>
> >> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> >> index d2046193ee..b93c50cb01 100644
> >> --- a/libavformat/matroskaenc.c
> >> +++ b/libavformat/matroskaenc.c
> >> @@ -161,6 +161,8 @@ typedef struct MatroskaMuxContext {
> >>  int wrote_chapters;
> >>  
> >>  int allow_raw_vfw;
> >> +
> >> +uint32_t segment_uid[4];
> >>  } MatroskaMuxContext;
> >>  
> >>  /** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint,
> >> @@ -1821,15 +1823,7 @@ static int mkv_write_header(AVFormatContext *s)
> >>  put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, 
> >> LIBAVFORMAT_IDENT);
> >>  
> >>  if (mkv->mode != MODE_WEBM) {
> >> -uint32_t segment_uid[4];
> >> -AVLFG lfg;
> >> -
> >> -av_lfg_init(&lfg, av_get_random_seed());
> >> -
> >> -for (i = 0; i < 4; i++)
> >> -segment_uid[i] = av_lfg_get(&lfg);
> >> -
> >> -put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
> >> +put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 
> >> 16);
> >>  }
> >>  } else {
> >>  const char *ident = "Lavf";
> >> @@ -2661,9 +2655,14 @@ static int mkv_init(struct AVFormatContext *s)
> >>  return AVERROR(ENOMEM);
> >>  }
> >>  
> >> -if (!(s->flags & AVFMT_FLAG_BITEXACT))
> >> +if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
> >>  av_lfg_init(&c, av_get_random_seed());
> >>  
> >> +// Calculate the SegmentUID now in order not to waste our random 
> >> seed.
> >> +for (i = 0; i < 4; i++)
> >> +mkv->segment_uid[i] = av_lfg_get(&c);
> >> +}
> >> +
> >>  for (i = 0; i < s->nb_streams; i++) {
> >>  mkv_track *track = &mkv->tracks[i];
> >>  
> >> -- 
> >> 2.20.1
> >>
> 
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] avformat/matroskaenc: Don't write elements with their default value

2020-04-19 Thread Steve Lhomme
LGTM.

In general it would be nice if this was "automatic". In other words when 
writing any element the value is automatically checked against the default 
value. Maybe using a macro that would also check the default value like this

PUT_EBML_VALUE(cp, EDITIONFLAGHIDDEN, value)

doing :
if (value != MATROSKA_DEFAULT_EDITIONFLAGHIDDEN)
  put_ebml_uint(cp, MATROSKA_ID_EDITIONFLAGHIDDEN, value)

even better :
#ifdef MATROSKA_DEFAULT_EDITIONFLAGHIDDEN
if (value != MATROSKA_DEFAULT_EDITIONFLAGHIDDEN)
#endif
  put_ebml_uint(cp, MATROSKA_ID_EDITIONFLAGHIDDEN, value)

I could easily generate all the default values from the specs.

> On April 14, 2020 3:46 AM Andreas Rheinhardt  
> wrote:
> 
>  
> This has happened when writing chapters: Both editions as well as
> chapters are by default not hidden and given that we don't support
> writing hidden chapters at all, we don't need to write said elements at
> all. The same goes for ChapterFlagEnabled.
> 
> Signed-off-by: Andreas Rheinhardt 
> ---
> This is supposed to get applied before the cosmetics patch.
> 
>  libavformat/matroskaenc.c | 5 -
>  1 file changed, 5 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index d0a02c0f5d..d3256d8f5d 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -1400,7 +1400,6 @@ static int mkv_write_chapters(AVFormatContext *s)
>  editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
>  if (mkv->mode != MODE_WEBM) {
>  put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
> -put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
>  }
>  for (i = 0; i < s->nb_chapters; i++) {
>  ebml_master chapteratom, chapterdisplay;
> @@ -1420,10 +1419,6 @@ static int mkv_write_chapters(AVFormatContext *s)
>(uint32_t)c->id + (uint64_t)mkv->chapter_id_offset);
>  put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart);
>  put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend);
> -if (mkv->mode != MODE_WEBM) {
> -put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
> -put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
> -}
>  if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
>  chapterdisplay = start_ebml_master(dyn_cp, 
> MATROSKA_ID_CHAPTERDISPLAY, 0);
>  put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value);
> -- 
> 2.20.1
> 
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH v2 1/4] fftools/qsv: enabling d3d11va/dxva2 device selection

2020-04-21 Thread Steve Lhomme

Hi,

On 2020-04-15 15:07, artem.ga...@gmail.com wrote:

From: Artem Galin 

child_device_type argument is responsible for selection.

Usage examples: -init_hw_device qsv:hw,child_device_type=d3d11va
 -init_hw_device qsv:hw,child_device_type=dxva2

Signed-off-by: Artem Galin 
---
  fftools/ffmpeg_opt.c | 12 +++-
  1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 95001a963f..82232c60b3 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -568,7 +568,17 @@ static int opt_init_hw_device(void *optctx, const char 
*opt, const char *arg)
  printf("\n");
  exit_program(0);
  } else {
-return hw_device_init_from_string(arg, NULL);
+HWDevice *dev;
+int err;
+if (!arg)
+return AVERROR(ENOMEM);
+err = hw_device_init_from_string(arg, &dev);
+if (err < 0)
+return err;
+hw_device_ctx = av_buffer_ref(dev->device_ref);
+if (!hw_device_ctx)
+return AVERROR(ENOMEM);
+return 0;


This is very similar to what is done in opt_vaapi_device().

Maybe you could modify the "qsv_device" handling to support this ? It 
will be ifdef'ed out when QSV is not enabled.


There might also be some side effects for other hardware devices. 
Especially the hw_device_ctx reference doesn't seem to be released (but 
it's the same in opt_vaapi_device so I might be missing something).



  }
  }
  
--

2.26.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH v2 4/4] libavutil/qsv: enabling d3d11va support

2020-04-21 Thread Steve Lhomme

On 2020-04-15 15:07, artem.ga...@gmail.com wrote:

From: Artem Galin 

Makes selection of d3d11va device type by default and over DirectX 9,
which is still supported but requires explicit selection.
This enables usage of non-powered/headless GPU, better HDR support.
Pool of resources is allocated as one texture with array of slices.


I'm all for it ;)


Added d3d11va device selection by vendor id.
Example: --init_hw_device d3d11va:,vendor=0x8086

DirectX 9 usage.
Example: --init_hw_device qsv:hw,child_device_type=dxva2


Same remark as before on the possible uninitialized handle_type.


Signed-off-by: Artem Galin 
---
  libavutil/hwcontext_d3d11va.c |  82 +++-
  libavutil/hwcontext_d3d11va.h |   8 +
  libavutil/hwcontext_qsv.c | 339 +-
  3 files changed, 371 insertions(+), 58 deletions(-)

diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index c8ae58f908..9d7615eb55 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -72,7 +72,7 @@ static av_cold void load_functions(void)
  }
  
  typedef struct D3D11VAFramesContext {

-int nb_surfaces_used;
+int nb_surfaces;


Probably better as a size_t


  DXGI_FORMAT format;
  
@@ -112,6 +112,8 @@ static void d3d11va_frames_uninit(AVHWFramesContext *ctx)

  if (s->staging_texture)
  ID3D11Texture2D_Release(s->staging_texture);
  s->staging_texture = NULL;
+
+av_freep(&frames_hwctx->texture_infos);
  }
  
  static int d3d11va_frames_get_constraints(AVHWDeviceContext *ctx,

@@ -152,8 +154,9 @@ static void free_texture(void *opaque, uint8_t *data)
  av_free(data);
  }
  
-static AVBufferRef *wrap_texture_buf(ID3D11Texture2D *tex, int index)

+static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D 
*tex, int index)
  {
+AVD3D11VAFramesContext *frames_hwctx = ctx->hwctx;
  AVBufferRef *buf;
  AVD3D11FrameDescriptor *desc = av_mallocz(sizeof(*desc));
  if (!desc) {
@@ -161,6 +164,10 @@ static AVBufferRef *wrap_texture_buf(ID3D11Texture2D *tex, 
int index)
  return NULL;
  }
  
+frames_hwctx->texture_infos[frames_hwctx->nb_surfaces_used].texture = tex;

+frames_hwctx->texture_infos[frames_hwctx->nb_surfaces_used].index = index;
+frames_hwctx->nb_surfaces_used++;
+
  desc->texture = tex;
  desc->index   = index;
  
@@ -199,13 +206,12 @@ static AVBufferRef *d3d11va_alloc_single(AVHWFramesContext *ctx)

  return NULL;
  }
  
-return wrap_texture_buf(tex, 0);

+return wrap_texture_buf(ctx, tex, 0);
  }
  
  static AVBufferRef *d3d11va_pool_alloc(void *opaque, int size)

  {
  AVHWFramesContext*ctx = (AVHWFramesContext*)opaque;
-D3D11VAFramesContext   *s = ctx->internal->priv;
  AVD3D11VAFramesContext *hwctx = ctx->hwctx;
  D3D11_TEXTURE2D_DESC  texDesc;
  
@@ -214,13 +220,13 @@ static AVBufferRef *d3d11va_pool_alloc(void *opaque, int size)
  
  ID3D11Texture2D_GetDesc(hwctx->texture, &texDesc);
  
-if (s->nb_surfaces_used >= texDesc.ArraySize) {

+if (hwctx->nb_surfaces_used >= texDesc.ArraySize) {
  av_log(ctx, AV_LOG_ERROR, "Static surface pool size exceeded.\n");
  return NULL;
  }
  
  ID3D11Texture2D_AddRef(hwctx->texture);

-return wrap_texture_buf(hwctx->texture, s->nb_surfaces_used++);
+return wrap_texture_buf(ctx, hwctx->texture, hwctx->nb_surfaces_used);
  }
  
  static int d3d11va_frames_init(AVHWFramesContext *ctx)

@@ -267,7 +273,7 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)
  av_log(ctx, AV_LOG_ERROR, "User-provided texture has mismatching 
parameters\n");
  return AVERROR(EINVAL);
  }
-} else if (texDesc.ArraySize > 0) {
+} else if (!(texDesc.BindFlags & D3D11_BIND_RENDER_TARGET) && 
texDesc.ArraySize > 0) {
  hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL, 
&hwctx->texture);
  if (FAILED(hr)) {
  av_log(ctx, AV_LOG_ERROR, "Could not create the texture (%lx)\n", 
(long)hr);
@@ -275,6 +281,12 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)
  }
  }
  
+hwctx->texture_infos = av_mallocz_array(ctx->initial_pool_size, sizeof(*hwctx->texture_infos));

+if (!hwctx->texture_infos)
+return AVERROR(ENOMEM);
+
+s->nb_surfaces = ctx->initial_pool_size;
+
  ctx->internal->pool_internal = 
av_buffer_pool_init2(sizeof(AVD3D11FrameDescriptor),
  ctx, 
d3d11va_pool_alloc, NULL);
  if (!ctx->internal->pool_internal)
@@ -511,15 +523,56 @@ static void d3d11va_device_uninit(AVHWDeviceContext 
*hwdev)
  }
  }
  
+static int d3d11va_device_find_adapter_by_vendor_id(AVHWDeviceContext *ctx, UINT creationFlags, char *vendor)

+{
+HRESULT hr;
+IDXGIAdapter *adapter = NULL;
+int adapter_id = 0;
+IDXGIFactory2 *factory;
+long int vendor_id = strtol(vendor, NULL, 0);
+

Re: [FFmpeg-devel] [PATCH v2 3/4] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair

2020-04-21 Thread Steve Lhomme
Mostly the same remarks as for 2/4 regarding the uneeded loop and 
uninitialized handle_type, plus comments below.


On 2020-04-15 15:07, artem.ga...@gmail.com wrote:

From: Artem Galin 

Adding DX11 relevant device type checks and adjusting callbacks with
proper MediaSDK pair type support.

Extending structure for proper MediaSDK pair type support.

Signed-off-by: Artem Galin 
---
  libavcodec/qsv.c  | 52 ---
  libavcodec/qsv_internal.h |  1 +
  2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index db98c75073..ceef1b7fd9 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -36,6 +36,8 @@
  #include "avcodec.h"
  #include "qsv_internal.h"
  
+#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))

+
  #if QSV_VERSION_ATLEAST(1, 12)
  #include "mfx/mfxvp8.h"
  #endif
@@ -221,8 +223,15 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, 
QSVFrame *frame)
  int i;
  for (i = 0; i < ctx->nb_mids; i++) {
  QSVMid *mid = &ctx->mids[i];
+#if CONFIG_VAAPI
  if (mid->handle == frame->surface.Data.MemId)
  return i;
+#else
+mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId;
+if ((mid->handle_pair.first == pair->first) &&
+(mid->handle_pair.second == pair->second))
+return i;
+#endif
  }
  return AVERROR_BUG;
  }
@@ -362,7 +371,11 @@ static int ff_qsv_set_display_handle(AVCodecContext 
*avctx, QSVSession *qs)
  int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
   const char *load_plugins, int gpu_copy)
  {
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
  mfxIMPL  impl = MFX_IMPL_AUTO_ANY;
+#else
+mfxIMPL  impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11;


Why is this needed ? If D3D11 is available it should pick it, no ? Does 
it mean you can favor D3D11 over D3D9 ?



+#endif
  mfxVersionver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
  mfxInitParam init_par = { MFX_IMPL_AUTO_ANY };
  
@@ -449,11 +462,19 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref)

  return NULL;
  }
  
+#if CONFIG_VAAPI

  for (i = 0; i < nb_surfaces; i++) {
  QSVMid *mid = &mids[i];
  mid->handle= frames_hwctx->surfaces[i].Data.MemId;
  mid->hw_frames_ref = hw_frames_ref1;
  }
+#else
+for (i = 0; i < nb_surfaces; i++) {
+QSVMid *mid = &mids[i];
+mid->handle_pair   = 
*((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId);
+mid->hw_frames_ref = hw_frames_ref1;
+}
+#endif
  
  return mids_buf;

  }
@@ -628,7 +649,11 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId 
mid, mfxFrameData *ptr)
  goto fail;
  
  qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info;

+#if CONFIG_VAAPI
  qsv_mid->surf.Data.MemId = qsv_mid->handle;
+#else
+qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair;
+#endif
  
  /* map the data to the system memory */

  ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame,
@@ -661,7 +686,17 @@ static mfxStatus qsv_frame_unlock(mfxHDL pthis, mfxMemId 
mid, mfxFrameData *ptr)
  static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
  {
  QSVMid *qsv_mid = (QSVMid*)mid;
+#if CONFIG_VAAPI
  *hdl = qsv_mid->handle;
+#else
+mfxHDLPair *pair_dst = (mfxHDLPair*)hdl;
+mfxHDLPair *pair_src = (mfxHDLPair*)&qsv_mid->handle_pair;
+
+pair_dst->first = pair_src->first;
+
+if (pair_src->second != (mfxMemId)MFX_INFINITE)
+pair_dst->second = pair_src->second;
+#endif
  return MFX_ERR_NONE;
  }
  
@@ -695,11 +730,20 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,

  return ff_qsv_print_error(avctx, err,
"Error querying the session attributes");
  
+if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) {

+handle_type = MFX_HANDLE_D3D11_DEVICE;
+} else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) {
+handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
+} else if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) {
+handle_type = MFX_HANDLE_VA_DISPLAY;
+}
+
  for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) {
-err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle);
-if (err == MFX_ERR_NONE) {
-handle_type = handle_types[i];
-break;
+if (handle_types[i] == handle_type) {
+err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], 
&handle);
+if (err == MFX_ERR_NONE) {
+break;
+}
  }
  handle = NULL;
  }
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 6489836a67..7a4a66e9d6 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -61,6 +61,7 @@
  typedef struct QSVMid {
  AVBufferRe

Re: [FFmpeg-devel] [PATCH v2 2/4] libavfilter/qsvvpp: enabling d3d11va support

2020-04-21 Thread Steve Lhomme

Comments below.

On 2020-04-15 15:07, artem.ga...@gmail.com wrote:

From: Artem Galin 

Adding DX11 relevant device type checks and adjusting callback with
proper MediaSDK pair type support.

Signed-off-by: Artem Galin 
---
  libavfilter/qsvvpp.c | 40 ++--
  1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
index 8d5ff2eb65..8c6c878bac 100644
--- a/libavfilter/qsvvpp.c
+++ b/libavfilter/qsvvpp.c
@@ -32,10 +32,11 @@
  #include "qsvvpp.h"
  #include "video.h"
  
-#define IS_VIDEO_MEMORY(mode)  (mode & (MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | \

+#define IS_VIDEO_MEMORY(mode)   (mode & 
(MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | \
  
MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET))
-#define IS_OPAQUE_MEMORY(mode) (mode & MFX_MEMTYPE_OPAQUE_FRAME)
-#define IS_SYSTEM_MEMORY(mode) (mode & MFX_MEMTYPE_SYSTEM_MEMORY)
+#define IS_OPAQUE_MEMORY(mode)  (mode & MFX_MEMTYPE_OPAQUE_FRAME)
+#define IS_SYSTEM_MEMORY(mode)  (mode & MFX_MEMTYPE_SYSTEM_MEMORY)


Not sure changing these lines just to add a space is worth.


+#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
  
  typedef struct QSVFrame {

  AVFrame  *frame;
@@ -129,7 +130,17 @@ static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, 
mfxFrameData *ptr)
  
  static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)

  {
+#if CONFIG_VAAPI
  *hdl = mid;
+#else
+mfxHDLPair *pair_dst = (mfxHDLPair*)hdl;
+mfxHDLPair *pair_src = (mfxHDLPair*)mid;
+
+pair_dst->first = pair_src->first;
+
+if (pair_src->second != (mfxMemId)MFX_INFINITE)
+pair_dst->second = pair_src->second;
+#endif
  return MFX_ERR_NONE;
  }
  
@@ -451,7 +462,7 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
  
  s->out_mem_mode = IS_OPAQUE_MEMORY(s->in_mem_mode) ?

MFX_MEMTYPE_OPAQUE_FRAME :
-  MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
+  MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | 
MFX_MEMTYPE_FROM_VPPOUT;


What's the effect of this flag on VAAPI ?

  
  out_frames_ctx   = (AVHWFramesContext *)out_frames_ref->data;

  out_frames_hwctx = out_frames_ctx->hwctx;
@@ -497,15 +508,24 @@ static int init_vpp_session(AVFilterContext *avctx, 
QSVVPPContext *s)
  return AVERROR_UNKNOWN;
  }
  
+if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) {

+handle_type = MFX_HANDLE_D3D11_DEVICE;
+} else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) {
+handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER;
+} else if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) {
+handle_type = MFX_HANDLE_VA_DISPLAY;
+}


handle_type is potentially used initialized after that. You probably 
want to return an error is the handle type is unknown.



+
  for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) {
-ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], 
&handle);
-if (ret == MFX_ERR_NONE) {
-handle_type = handle_types[i];
-break;
+if (handle_types[i] == handle_type) {


You're losing the possibility to pick whichever the system provides. 
Although in real life it may not be an issue if you can only have VAAPI 
or D3D9/D3D11 separately.


Also you don't need to do the for() loop since you only want to read the 
handle of the type you want.


The title of the patch is misleading. MFX_HANDLE_D3D11_DEVICE was 
already supported in the list of handles.



+ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], 
&handle);
+if (ret == MFX_ERR_NONE) {
+break;
+}
  }
+handle = NULL;
  }
-
-if (ret != MFX_ERR_NONE) {
+if (!handle) {
  av_log(avctx, AV_LOG_ERROR, "Error getting the session handle\n");
  return AVERROR_UNKNOWN;
  }
--
2.26.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH NV HEADERS] allow overriding the PREFIX from the environment

2019-09-12 Thread Steve Lhomme
---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index a51c2c9..c3a9209 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX ?= /usr/local
 LIBDIR = lib
 INSTALL = install
 SED = sed
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH NV HEADERS] Add cuCtxGetDevice

2019-09-12 Thread Steve Lhomme
It can be useful to determine if the decoder context is the same as the display
context.

It's used in some samples at https://github.com/NVIDIA/video-sdk-samples
---
 include/ffnvcodec/dynlink_cuda.h   | 1 +
 include/ffnvcodec/dynlink_loader.h | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/include/ffnvcodec/dynlink_cuda.h b/include/ffnvcodec/dynlink_cuda.h
index ad5da7c..cc1cc00 100644
--- a/include/ffnvcodec/dynlink_cuda.h
+++ b/include/ffnvcodec/dynlink_cuda.h
@@ -329,6 +329,7 @@ typedef CUresult CUDAAPI tcuMemcpy2D_v2(const CUDA_MEMCPY2D 
*pcopy);
 typedef CUresult CUDAAPI tcuMemcpy2DAsync_v2(const CUDA_MEMCPY2D *pcopy, 
CUstream hStream);
 typedef CUresult CUDAAPI tcuGetErrorName(CUresult error, const char** pstr);
 typedef CUresult CUDAAPI tcuGetErrorString(CUresult error, const char** pstr);
+typedef CUresult CUDAAPI tcuCtxGetDevice(CUdevice *device);
 
 typedef CUresult CUDAAPI tcuStreamCreate(CUstream *phStream, unsigned int 
flags);
 typedef CUresult CUDAAPI tcuStreamQuery(CUstream hStream);
diff --git a/include/ffnvcodec/dynlink_loader.h 
b/include/ffnvcodec/dynlink_loader.h
index 358acd5..a1fa323 100644
--- a/include/ffnvcodec/dynlink_loader.h
+++ b/include/ffnvcodec/dynlink_loader.h
@@ -156,6 +156,7 @@ typedef struct CudaFunctions {
 tcuMemcpy2DAsync_v2 *cuMemcpy2DAsync;
 tcuGetErrorName *cuGetErrorName;
 tcuGetErrorString *cuGetErrorString;
+tcuCtxGetDevice *cuCtxGetDevice;
 
 tcuStreamCreate *cuStreamCreate;
 tcuStreamQuery *cuStreamQuery;
@@ -280,6 +281,7 @@ static inline int cuda_load_functions(CudaFunctions 
**functions, void *logctx)
 LOAD_SYMBOL(cuMemcpy2DAsync, tcuMemcpy2DAsync_v2, "cuMemcpy2DAsync_v2");
 LOAD_SYMBOL(cuGetErrorName, tcuGetErrorName, "cuGetErrorName");
 LOAD_SYMBOL(cuGetErrorString, tcuGetErrorString, "cuGetErrorString");
+LOAD_SYMBOL(cuCtxGetDevice, tcuCtxGetDevice, "cuCtxGetDevice");
 
 LOAD_SYMBOL(cuStreamCreate, tcuStreamCreate, "cuStreamCreate");
 LOAD_SYMBOL(cuStreamQuery, tcuStreamQuery, "cuStreamQuery");
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH NV HEADERS] allow overriding the PREFIX from the environment

2019-09-12 Thread Steve Lhomme
This is for this repo: 
https://git.videolan.org/?p=ffmpeg/nv-codec-headers.git


On 2019-09-12 15:17, Steve Lhomme wrote:

---
  Makefile | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index a51c2c9..c3a9209 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX ?= /usr/local
  LIBDIR = lib
  INSTALL = install
  SED = sed
--
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH NV HEADERS] Add cuCtxGetDevice

2019-09-12 Thread Steve Lhomme
This is for this repo: 
https://git.videolan.org/?p=ffmpeg/nv-codec-headers.git


On 2019-09-12 15:19, Steve Lhomme wrote:

It can be useful to determine if the decoder context is the same as the display
context.

It's used in some samples at https://github.com/NVIDIA/video-sdk-samples
---
  include/ffnvcodec/dynlink_cuda.h   | 1 +
  include/ffnvcodec/dynlink_loader.h | 2 ++
  2 files changed, 3 insertions(+)

diff --git a/include/ffnvcodec/dynlink_cuda.h b/include/ffnvcodec/dynlink_cuda.h
index ad5da7c..cc1cc00 100644
--- a/include/ffnvcodec/dynlink_cuda.h
+++ b/include/ffnvcodec/dynlink_cuda.h
@@ -329,6 +329,7 @@ typedef CUresult CUDAAPI tcuMemcpy2D_v2(const CUDA_MEMCPY2D 
*pcopy);
  typedef CUresult CUDAAPI tcuMemcpy2DAsync_v2(const CUDA_MEMCPY2D *pcopy, 
CUstream hStream);
  typedef CUresult CUDAAPI tcuGetErrorName(CUresult error, const char** pstr);
  typedef CUresult CUDAAPI tcuGetErrorString(CUresult error, const char** pstr);
+typedef CUresult CUDAAPI tcuCtxGetDevice(CUdevice *device);
  
  typedef CUresult CUDAAPI tcuStreamCreate(CUstream *phStream, unsigned int flags);

  typedef CUresult CUDAAPI tcuStreamQuery(CUstream hStream);
diff --git a/include/ffnvcodec/dynlink_loader.h 
b/include/ffnvcodec/dynlink_loader.h
index 358acd5..a1fa323 100644
--- a/include/ffnvcodec/dynlink_loader.h
+++ b/include/ffnvcodec/dynlink_loader.h
@@ -156,6 +156,7 @@ typedef struct CudaFunctions {
  tcuMemcpy2DAsync_v2 *cuMemcpy2DAsync;
  tcuGetErrorName *cuGetErrorName;
  tcuGetErrorString *cuGetErrorString;
+tcuCtxGetDevice *cuCtxGetDevice;
  
  tcuStreamCreate *cuStreamCreate;

  tcuStreamQuery *cuStreamQuery;
@@ -280,6 +281,7 @@ static inline int cuda_load_functions(CudaFunctions 
**functions, void *logctx)
  LOAD_SYMBOL(cuMemcpy2DAsync, tcuMemcpy2DAsync_v2, "cuMemcpy2DAsync_v2");
  LOAD_SYMBOL(cuGetErrorName, tcuGetErrorName, "cuGetErrorName");
  LOAD_SYMBOL(cuGetErrorString, tcuGetErrorString, "cuGetErrorString");
+LOAD_SYMBOL(cuCtxGetDevice, tcuCtxGetDevice, "cuCtxGetDevice");
  
  LOAD_SYMBOL(cuStreamCreate, tcuStreamCreate, "cuStreamCreate");

  LOAD_SYMBOL(cuStreamQuery, tcuStreamQuery, "cuStreamQuery");
--
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH NV HEADERS] allow overriding the PREFIX from the environment

2019-09-13 Thread Steve Lhomme

Ah yes, it works (TIL).
Forget about this patch.

On 2019-09-12 16:26, Timo Rothenpieler wrote:

On 12/09/2019 15:17, Steve Lhomme wrote:

---
  Makefile | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index a51c2c9..c3a9209 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-PREFIX = /usr/local
+PREFIX ?= /usr/local


Overriding the prefix worked just fine last time I tested it.

You do make install PREFIX=...


  LIBDIR = lib
  INSTALL = install
  SED = sed


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH NV HEADERS] Add cuCtxGetDevice

2019-09-16 Thread Steve Lhomme

On 2019-09-13 11:56, Timo Rothenpieler wrote:

On 12/09/2019 15:19, Steve Lhomme wrote:
It can be useful to determine if the decoder context is the same as 
the display

context.

It's used in some samples at https://github.com/NVIDIA/video-sdk-samples
---
  include/ffnvcodec/dynlink_cuda.h   | 1 +
  include/ffnvcodec/dynlink_loader.h | 2 ++
  2 files changed, 3 insertions(+)



applied


Thanks !


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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH] avcodec/pthread_frame: do not give the hardware context internals to the user

2019-12-17 Thread Steve Lhomme
The internal data should not leak to the user. It can potentially be destroyed
twice since the hwaccel uninit was also copied back to the user.

This behaviour may only be found in VLC which uses frame threading with hardware
decoding.
---
 libavcodec/pthread_frame.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index 36ac0ac1e5..2150b4e048 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -275,14 +275,17 @@ static int update_context_from_thread(AVCodecContext 
*dst, AVCodecContext *src,
 dst->color_range = src->color_range;
 dst->chroma_sample_location = src->chroma_sample_location;
 
-dst->hwaccel = src->hwaccel;
-dst->hwaccel_context = src->hwaccel_context;
+if (!for_user) {
+dst->hwaccel = src->hwaccel;
+dst->hwaccel_context = src->hwaccel_context;
+}
 
 dst->channels   = src->channels;
 dst->sample_rate= src->sample_rate;
 dst->sample_fmt = src->sample_fmt;
 dst->channel_layout = src->channel_layout;
-dst->internal->hwaccel_priv_data = src->internal->hwaccel_priv_data;
+if (!for_user)
+dst->internal->hwaccel_priv_data = 
src->internal->hwaccel_priv_data;
 
 if (!!dst->hw_frames_ctx != !!src->hw_frames_ctx ||
 (dst->hw_frames_ctx && dst->hw_frames_ctx->data != 
src->hw_frames_ctx->data)) {
-- 
2.17.1

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH] avformat/matroskadec: Check parents remaining length

2019-02-23 Thread Steve Lhomme
Hi,

It's possible that it fixes the issue. When I did the patch I noticed some 
places used a similar value and some are using -1. I think this should be a 
define (probably set to UINT64_MAX) that is used everywhere. It's just a marker 
to say the length is unknown.


> On February 22, 2019 at 9:31 PM Dale Curtis  wrote:
> 
> +steve who submitted the original patch.
> 
> - dale
> 
> 
> On Thu, Feb 21, 2019 at 2:30 PM Dale Curtis < dalecur...@chromium.org 
> mailto:dalecur...@chromium.org > wrote:
> 
> > > One of our test clips is behaving differently after this 
> patch:
> > 
> > https://cs.chromium.org/chromium/src/media/test/data/bear-320x240-live.webm
> > 
> > The printed log message is:
> > [matroska,webm @ 0x1516c84f4e00] Invalid length 0xff > 
> > 0x12f in parent
> > 
> > Looking through the code I'm unsure which of the mixed usage 
> > "(uint64_t)-1" and "2**56-1" as marker values is correct. Changing the code 
> > to:
> > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> > index 9b706ab4e0..3015a0b230 100644
> > --- a/libavformat/matroskadec.c
> > +++ b/libavformat/matroskadec.c
> > @@ -1205,7 +1205,7 @@ static int 
> > ebml_parse_elem(MatroskaDemuxContext *matroska,
> >  MatroskaLevel *level = 
> > &matroska->levels[matroska->num_levels - 1];
> >  AVIOContext *pb = matroska->ctx->pb;
> >  int64_t pos = avio_tell(pb);
> > -if (level->length != (uint64_t) -1 &&
> > +if (level->length != 0xffULL &&
> >  (pos + length) > (level->start + level->length)) {
> >  av_log(matroska->ctx, AV_LOG_ERROR,
> > "Invalid length 0x%"PRIx64" > 0x%"PRIx64" 
> > in parent\n",
> > 
> > Resolves our issues. Should all other length tests be done the same 
> > way?
> > 
> > - dale
> > 
> > On Sun, Feb 17, 2019 at 12:45 AM Michael Niedermayer < 
> > michae...@gmx.at mailto:michae...@gmx.at > wrote:
> > 
> > > > > On Wed, Feb 13, 2019 at 01:41:31PM +0100, Michael 
> > Niedermayer wrote:
> > > > Reported-by: Steve Lhomme
> > > > This was found through the Hacker One program on VLC but is 
> > > not a security issue in libavformat
> > > > Signed-off-by: Michael Niedermayer 
> > > > ---
> > > >  libavformat/matroskadec.c | 21 +
> > > >  1 file changed, 21 insertions(+)
> > > 
> > > will apply an equivalent variant from steve
> > > 
> > > [...]
> > > --
> > > Michael GnuPG fingerprint: 
> > > 9FF2128B147EF6730BADF133611EC787040B0FAB
> > > 
> > > Asymptotically faster algorithms should always be preferred 
> > > if you have
> > > asymptotical amounts of data
> > > ___
> > > ffmpeg-devel mailing list
> > > ffmpeg-devel@ffmpeg.org mailto:ffmpeg-devel@ffmpeg.org
> > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> > > 
> > > > > 
> > > 


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


[FFmpeg-devel] [PATCH] avformat:matroskadec: use a define to mark the EBML length is unknown

2019-02-23 Thread Steve Lhomme
From: Steve Lhomme 

---
 libavformat/matroskadec.c | 12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 5aa8a105dc..0e3a6890c1 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -68,6 +68,8 @@
 
 #include "qtpalette.h"
 
+#define EBML_UNKNOWN_LENGTH  UINT64_MAX /* EBML unknown length, in uint64_t */
+
 typedef enum {
 EBML_NONE,
 EBML_UINT,
@@ -869,7 +871,7 @@ static int ebml_read_length(MatroskaDemuxContext *matroska, 
AVIOContext *pb,
 {
 int res = ebml_read_num(matroska, pb, 8, number);
 if (res > 0 && *number + 1 == 1ULL << (7 * res))
-*number = 0xffULL;
+*number = EBML_UNKNOWN_LENGTH;
 return res;
 }
 
@@ -1049,7 +1051,7 @@ static int ebml_parse_id(MatroskaDemuxContext *matroska, 
EbmlSyntax *syntax,
 break;
 if (!syntax[i].id && id == MATROSKA_ID_CLUSTER &&
 matroska->num_levels > 0   &&
-matroska->levels[matroska->num_levels - 1].length == 0xff)
+matroska->levels[matroska->num_levels - 1].length == 
EBML_UNKNOWN_LENGTH)
 return 0;  // we reached the end of an unknown size cluster
 if (!syntax[i].id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
 av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32"\n", id);
@@ -1201,7 +1203,7 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,
 MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1];
 AVIOContext *pb = matroska->ctx->pb;
 int64_t pos = avio_tell(pb);
-if (level->length != (uint64_t) -1 &&
+if (level->length != EBML_UNKNOWN_LENGTH &&
 (pos + length) > (level->start + level->length)) {
 av_log(matroska->ctx, AV_LOG_ERROR,
"Invalid length 0x%"PRIx64" > 0x%"PRIx64" in parent\n",
@@ -1610,7 +1612,7 @@ static int 
matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
 ret = AVERROR_INVALIDDATA;
 } else {
 level.start  = 0;
-level.length = (uint64_t) -1;
+level.length = EBML_UNKNOWN_LENGTH;
 matroska->levels[matroska->num_levels] = level;
 matroska->num_levels++;
 matroska->current_id   = 0;
@@ -1620,7 +1622,7 @@ static int 
matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
 /* remove dummy level */
 while (matroska->num_levels) {
 uint64_t length = 
matroska->levels[--matroska->num_levels].length;
-if (length == (uint64_t) -1)
+if (length == EBML_UNKNOWN_LENGTH)
 break;
 }
 }
-- 
2.18.0

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


Re: [FFmpeg-devel] [PATCH] Fix handling of unknown length case for matroska files.

2019-02-23 Thread Steve Lhomme

On 23/02/2019 00:41, Dale Curtis wrote:

Unknown length has a special encoding which is not uint64_t(-1).

Signed-off-by: Dale Curtis 
---
  libavformat/matroskadec.c | 13 -
  1 file changed, 8 insertions(+), 5 deletions(-)


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

Ah sorry, I didn't see you proposed the same thing.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] avformat:matroskadec: use a define to mark the EBML length is unknown

2019-02-24 Thread Steve Lhomme

On 23/02/2019 19:37, Michael Niedermayer wrote:

On Sat, Feb 23, 2019 at 11:14:33AM +0100, Steve Lhomme wrote:

From: Steve Lhomme 

---
  libavformat/matroskadec.c | 12 +++-
  1 file changed, 7 insertions(+), 5 deletions(-)

I think the commit message is a bit terse. This is not just a cosmetic
change (which one might think from reading just the commit message and
not looking at the change or related mails)

Can you provide a more verbose commit message ?
ill apply it with that

thanks

[...]


How about this ?

"
avformat:matroskadec: use a define to mark the EBML length is unknown

Unifying the way the EBML unknown length is signaled, rather than using two
incompatible values. UINT64_MAX cannot be read as a valid EBML length 
with the

current code.

Co-authored-by: Steve Lhomme 
Co-authored-by: Dale Curtis 

"
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] Hardware decoding buffer size

2017-03-21 Thread Steve Lhomme
Hi,

We have this bug in VLC with an MPEG2 file that decodes with green
bars at the top. After investigation it's because we allocate a
1920x1080 texture when it should actually need 1920x1088.
https://trac.videolan.org/vlc/ticket/17856

In software decoding it works because we adjust the
`ctx->coded_height` with avcodec_align_dimensions2(). But we do not
call it for hardware decoding. And looking at the code it seems it's
not meant to happen anyway (the DXVA pixel formats have no size
constraint).

So my question is: is it the job of libavcodec hardware decoders to
set the proper coded_width/coded_height, in which case there's a bug,
or it should be done outside of libavcodec ? And if so, how ?

Thanks
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/2] avcodec/mpeg12dec: set the coded dimensions with proper alignement

2017-03-22 Thread Steve Lhomme
---
 libavcodec/mpeg12dec.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index e49167f89e..55fcac0cb2 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -1291,12 +1291,11 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
 }
 
 if ((s1->mpeg_enc_ctx_allocated == 0)   ||
-avctx->coded_width   != s->width||
-avctx->coded_height  != s->height   ||
+avctx->coded_width   != FFALIGN(s->width, 16)   ||
+avctx->coded_height  != FFALIGN(s->height, s->progressive_sequence 
? 16 : 32)  ||
 s1->save_width   != s->width||
 s1->save_height  != s->height   ||
 av_cmp_q(s1->save_aspect, s->avctx->sample_aspect_ratio) ||
-(s1->save_progressive_seq != s->progressive_sequence && 
FFALIGN(s->height, 16) != FFALIGN(s->height, 32)) ||
 0) {
 if (s1->mpeg_enc_ctx_allocated) {
 ParseContext pc = s->parse_context;
@@ -1310,6 +1309,9 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
 if (ret < 0)
 return ret;
 
+avctx->coded_width  = FFALIGN(avctx->coded_width, 16);
+avctx->coded_height = FFALIGN(avctx->coded_height, 
s->progressive_sequence ? 16: 32);
+
 if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->bit_rate) {
 avctx->rc_max_rate = s->bit_rate;
 } else if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && s->bit_rate &&
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 2/2] avcodec/hevc: add the dimension constraints when attempting to use DXVA

2017-03-22 Thread Steve Lhomme
---
 libavcodec/hevc.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 505249e6b5..35e9a273fa 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -328,6 +328,14 @@ static void export_stream_params(AVCodecContext *avctx, 
const HEVCParamSets *ps,
   num, den, 1 << 30);
 }
 
+#if CONFIG_HEVC_DXVA2_HWACCEL || CONFIG_HEVC_D3D11VA_HWACCEL
+static void add_dxva_constraints(AVCodecContext *avctx)
+{
+avctx->coded_width  = FFALIGN(avctx->coded_width,  128);
+avctx->coded_height = FFALIGN(avctx->coded_height, 128);
+}
+#endif
+
 static int set_sps(HEVCContext *s, const HEVCSPS *sps, enum AVPixelFormat 
pix_fmt)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + 
CONFIG_HEVC_D3D11VA_HWACCEL + CONFIG_HEVC_VAAPI_HWACCEL + 
CONFIG_HEVC_VDPAU_HWACCEL)
@@ -352,9 +360,11 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, 
enum AVPixelFormat pix_fm
 case AV_PIX_FMT_YUVJ420P:
 #if CONFIG_HEVC_DXVA2_HWACCEL
 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
+add_dxva_constraints(s->avctx);
 #endif
 #if CONFIG_HEVC_D3D11VA_HWACCEL
 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
+add_dxva_constraints(s->avctx);
 #endif
 #if CONFIG_HEVC_VAAPI_HWACCEL
 *fmt++ = AV_PIX_FMT_VAAPI;
@@ -366,9 +376,11 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, 
enum AVPixelFormat pix_fm
 case AV_PIX_FMT_YUV420P10:
 #if CONFIG_HEVC_DXVA2_HWACCEL
 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
+add_dxva_constraints(s->avctx);
 #endif
 #if CONFIG_HEVC_D3D11VA_HWACCEL
 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
+add_dxva_constraints(s->avctx);
 #endif
 #if CONFIG_HEVC_VAAPI_HWACCEL
 *fmt++ = AV_PIX_FMT_VAAPI;
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 2/3] lavc: Add Content Light Level side metadata found in HEVC

2017-03-30 Thread Steve Lhomme
These data are necessary when transmitting HDR over HDMI.
---
 libavcodec/avcodec.h  |  7 +++
 libavcodec/avpacket.c |  1 +
 libavcodec/hevc_sei.c | 15 +++
 libavcodec/hevcdec.c  | 22 ++
 libavcodec/hevcdec.h  |  5 +
 libavcodec/utils.c|  1 +
 libavcodec/version.h  |  2 +-
 7 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 60f7acefbd..af08f7338a 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1583,6 +1583,13 @@ enum AVPacketSideDataType {
  * to the AVSphericalMapping structure.
  */
 AV_PKT_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CEA 861.3). This metadata should be
+ * associated with a video stream and containts data in the form of the
+ * AVContentLightMetadata struct.
+ */
+AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 8420d8b258..2c28a26a9a 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -374,6 +374,7 @@ const char *av_packet_side_data_name(enum 
AVPacketSideDataType type)
 case AV_PKT_DATA_METADATA_UPDATE:return "Metadata Update";
 case AV_PKT_DATA_MPEGTS_STREAM_ID:   return "MPEGTS Stream ID";
 case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display 
metadata";
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:return "Content light level 
metadata";
 case AV_PKT_DATA_SPHERICAL:  return "Spherical Mapping";
 }
 return NULL;
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 8fc026cf1e..bb299d5a9f 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -102,6 +102,19 @@ static int 
decode_nal_sei_mastering_display_info(HEVCContext *s)
 return 0;
 }
 
+static int decode_nal_sei_content_light_info(HEVCContext *s)
+{
+GetBitContext *gb = &s->HEVClc->gb;
+// Max and average light levels
+s->max_content_light_level = get_bits_long(gb, 16);
+s->max_pic_average_light_level = get_bits_long(gb, 16);
+// As this SEI message comes before the first frame that references it,
+// initialize the flag to 2 and decrement on IRAP access unit so it
+// persists for the coded video sequence (e.g., between two IRAPs)
+s-> sei_content_light_present = 2;
+return  0;
+}
+
 static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
 {
 GetBitContext *gb = &s->HEVClc->gb;
@@ -304,6 +317,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 }
 case SEI_TYPE_MASTERING_DISPLAY_INFO:
 return decode_nal_sei_mastering_display_info(s);
+case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+return decode_nal_sei_content_light_info(s);
 case SEI_TYPE_ACTIVE_PARAMETER_SETS:
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index ef21595c44..4ff269e58f 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2644,6 +2644,28 @@ static int set_side_data(HEVCContext *s)
"min_luminance=%f, max_luminance=%f\n",
av_q2d(metadata->min_luminance), 
av_q2d(metadata->max_luminance));
 }
+// Decrement the mastering display flag when IRAP frame has 
no_rasl_output_flag=1
+// so the side data persists for the entire coded video sequence.
+if (s->sei_content_light_present > 0 &&
+IS_IRAP(s) && s->no_rasl_output_flag) {
+s->sei_content_light_present--;
+}
+if (s->sei_content_light_present) {
+AVContentLightMetadata *metadata =
+av_content_light_metadata_create_side_data(out);
+if (!metadata)
+return AVERROR(ENOMEM);
+metadata->max_content_light_level.num = s->max_content_light_level;
+metadata->max_pic_avg_light_level.den = 1;
+metadata->max_pic_avg_light_level.num = s->max_pic_average_light_level;
+metadata->max_pic_avg_light_level.den = 1;
+
+av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
+av_log(s->avctx, AV_LOG_DEBUG,
+   "max_content_light_level=%f, max_pic_avg_light_level=%f\n",
+   av_q2d(metadata->max_content_light_level),
+   av_q2d(metadata->max_pic_avg_light_level));
+}
 
 if (s->a53_caption) {
 AVFrameSideData* sd = av_frame_new_side_data(out,
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index 0c7881286c..e5879a5c2b 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -596,6 +596,11 @@ typedef struct HEVCContext {
 uint32_t max_mastering_luminance;
 uint32_t min_mastering_luminance;
 
+/* content light level */
+int sei_content_light_present;
+uint16_t max_content_light_level;
+uint16_t max_pic_average_light_level;
+
 } HEV

[FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-03-30 Thread Steve Lhomme
As found in HEVC.

I put the code in mastering_display_metadata as they usually go together in
Blu-Ray UHD sources.
---
 libavutil/frame.c  |  1 +
 libavutil/frame.h  |  6 ++
 libavutil/mastering_display_metadata.c | 18 
 libavutil/mastering_display_metadata.h | 39 ++
 libavutil/version.h|  2 +-
 5 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 8811dcdcfe..dd12c5549c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
AVFrameSideDataType type)
 case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
 case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
type";
 case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display 
metadata";
+case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
level metadata";
 case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
 }
 return NULL;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 7cb78a1a44..45e21a11d4 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -127,6 +127,12 @@ enum AVFrameSideDataType {
  * libavutil/spherical.h.
  */
 AV_FRAME_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CEA 861.3). This payload containts data in
+ * the form of the AVContentLightMetadata struct.
+ */
+AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/mastering_display_metadata.c 
b/libavutil/mastering_display_metadata.c
index e1683e55c7..c41c90db12 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -41,3 +41,21 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFra
 
 return (AVMasteringDisplayMetadata *)side_data->data;
 }
+
+AVContentLightMetadata *av_content_light_metadata_alloc(void)
+{
+return av_mallocz(sizeof(AVContentLightMetadata));
+}
+
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+
sizeof(AVContentLightMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVContentLightMetadata));
+
+return (AVContentLightMetadata *)side_data->data;
+}
diff --git a/libavutil/mastering_display_metadata.h 
b/libavutil/mastering_display_metadata.h
index 936533fec4..5ad7f5bd42 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_alloc(void);
  */
 AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFrame *frame);
 
+/**
+ * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with av_content_light_metadata_alloc()
+ *   and its size is not a part of the public ABI.
+ */
+typedef struct AVContentLightMetadata {
+/**
+ * Max content light level (cd/m^2).
+ */
+AVRational max_content_light_level;
+
+/**
+ * Max avereage light level per picture (cd/m^2).
+ */
+AVRational max_pic_avg_light_level;
+} AVContentLightMetadata;
+
+/**
+ * Allocate an AVContentLightMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVContentLightMetadata filled with default values or NULL
+ * on failure.
+ */
+AVContentLightMetadata *av_content_light_metadata_alloc(void);
+
+/**
+ * Allocate a complete AVContentLightMetadata and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVContentLightMetadata structure to be filled by caller.
+ */
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame);
+
 #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index a14c0e7eb2..fedc6fa177 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  53
+#define LIBAVUTIL_VERSION_MINOR  54
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 3/3] avformat/dump : Display Content Light Level metadata

2017-03-30 Thread Steve Lhomme
---
 libavformat/dump.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/libavformat/dump.c b/libavformat/dump.c
index 7c811ce5d2..a8122f216b 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -343,6 +343,14 @@ static void dump_mastering_display_metadata(void *ctx, 
AVPacketSideData* sd) {
av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
 }
 
+static void dump_content_light_metadata(void *ctx, AVPacketSideData* sd)
+{
+AVContentLightMetadata* metadata = (AVContentLightMetadata*)sd->data;
+av_log(ctx, AV_LOG_INFO, "Content Light Level Metadata, "
+   "max_content_light_level=%f, max_pic_average_light_level=%f",
+   av_q2d(metadata->max_content_light_level), 
av_q2d(metadata->max_pic_avg_light_level));
+}
+
 static void dump_spherical(void *ctx, AVCodecParameters *par, AVPacketSideData 
*sd)
 {
 AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data;
@@ -435,6 +443,9 @@ static void dump_sidedata(void *ctx, AVStream *st, const 
char *indent)
 av_log(ctx, AV_LOG_INFO, "spherical: ");
 dump_spherical(ctx, st->codecpar, &sd);
 break;
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:
+dump_content_light_metadata(ctx, &sd);
+break;
 default:
 av_log(ctx, AV_LOG_INFO,
"unknown side data type %d (%d bytes)", sd.type, sd.size);
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-03-31 Thread Steve Lhomme
On Thu, Mar 30, 2017 at 5:50 PM, James Almer  wrote:
> On 3/30/2017 11:31 AM, Steve Lhomme wrote:
>> As found in HEVC.
>>
>> I put the code in mastering_display_metadata as they usually go together in
>> Blu-Ray UHD sources.
>> ---
>>  libavutil/frame.c  |  1 +
>>  libavutil/frame.h  |  6 ++
>>  libavutil/mastering_display_metadata.c | 18 
>>  libavutil/mastering_display_metadata.h | 39 
>> ++
>>  libavutil/version.h|  2 +-
>>  5 files changed, 65 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>> index 8811dcdcfe..dd12c5549c 100644
>> --- a/libavutil/frame.c
>> +++ b/libavutil/frame.c
>> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
>> AVFrameSideDataType type)
>>  case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
>>  case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
>> type";
>>  case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering 
>> display metadata";
>> +case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
>> level metadata";
>>  case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
>>  }
>>  return NULL;
>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>> index 7cb78a1a44..45e21a11d4 100644
>> --- a/libavutil/frame.h
>> +++ b/libavutil/frame.h
>> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>>   * libavutil/spherical.h.
>>   */
>>  AV_FRAME_DATA_SPHERICAL,
>> +
>> +/**
>> + * Content light level (based on CEA 861.3). This payload containts 
>> data in
>> + * the form of the AVContentLightMetadata struct.
>> + */
>> +AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>>  };
>>
>>  enum AVActiveFormatDescription {
>> diff --git a/libavutil/mastering_display_metadata.c 
>> b/libavutil/mastering_display_metadata.c
>> index e1683e55c7..c41c90db12 100644
>> --- a/libavutil/mastering_display_metadata.c
>> +++ b/libavutil/mastering_display_metadata.c
>> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_create_side_data(AVFra
>>
>>  return (AVMasteringDisplayMetadata *)side_data->data;
>>  }
>> +
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
>> +{
>> +return av_mallocz(sizeof(AVContentLightMetadata));
>> +}
>
> Could you add a size_t *size parameter that returns 
> sizeof(AVContentLightMetadata)?
> For the sake of being able to use av_stream_new_side_data() and
> av_stream_add_side_data() once and if required by containers without having to
> use sizeof(AVContentLightMetadata) from libavformat, like it currently 
> happens with
> mastering_display_metadata and stereo3d.

OK.

> See av_spherical_alloc().
>
>> +
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
>> *frame)
>> +{
>> +AVFrameSideData *side_data = av_frame_new_side_data(frame,
>> +
>> AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>> +
>> sizeof(AVContentLightMetadata));
>> +if (!side_data)
>> +return NULL;
>> +
>> +memset(side_data->data, 0, sizeof(AVContentLightMetadata));
>> +
>> +return (AVContentLightMetadata *)side_data->data;
>> +}
>> diff --git a/libavutil/mastering_display_metadata.h 
>> b/libavutil/mastering_display_metadata.h
>> index 936533fec4..5ad7f5bd42 100644
>> --- a/libavutil/mastering_display_metadata.h
>> +++ b/libavutil/mastering_display_metadata.h
>> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_alloc(void);
>>   */
>>  AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>>
>> +/**
>> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
>> + *
>> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
>> + * appropriate type.
>> + *
>> + * @note The struct should be allocated with 
>> av_content_light_metadata_alloc()
>> + *   and its size is not a part of the public ABI.
>> + */
>> +typedef struct AVContentLightMetadata {
>> +/**
>> + * Max content light level (cd/m^2).
>> + */
>> +AVR

Re: [FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-03-31 Thread Steve Lhomme
On Thu, Mar 30, 2017 at 4:46 PM, Hendrik Leppkes  wrote:
> On Thu, Mar 30, 2017 at 4:31 PM, Steve Lhomme  wrote:
>> As found in HEVC.
>>
>> I put the code in mastering_display_metadata as they usually go together in
>> Blu-Ray UHD sources.
>> ---
>>  libavutil/frame.c  |  1 +
>>  libavutil/frame.h  |  6 ++
>>  libavutil/mastering_display_metadata.c | 18 
>>  libavutil/mastering_display_metadata.h | 39 
>> ++
>>  libavutil/version.h|  2 +-
>>  5 files changed, 65 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>> index 8811dcdcfe..dd12c5549c 100644
>> --- a/libavutil/frame.c
>> +++ b/libavutil/frame.c
>> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
>> AVFrameSideDataType type)
>>  case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
>>  case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
>> type";
>>  case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering 
>> display metadata";
>> +case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
>> level metadata";
>>  case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
>>  }
>>  return NULL;
>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>> index 7cb78a1a44..45e21a11d4 100644
>> --- a/libavutil/frame.h
>> +++ b/libavutil/frame.h
>> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>>   * libavutil/spherical.h.
>>   */
>>  AV_FRAME_DATA_SPHERICAL,
>> +
>> +/**
>> + * Content light level (based on CEA 861.3). This payload containts 
>> data in
>> + * the form of the AVContentLightMetadata struct.
>> + */
>> +AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>>  };
>>
>>  enum AVActiveFormatDescription {
>> diff --git a/libavutil/mastering_display_metadata.c 
>> b/libavutil/mastering_display_metadata.c
>> index e1683e55c7..c41c90db12 100644
>> --- a/libavutil/mastering_display_metadata.c
>> +++ b/libavutil/mastering_display_metadata.c
>> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_create_side_data(AVFra
>>
>>  return (AVMasteringDisplayMetadata *)side_data->data;
>>  }
>> +
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
>> +{
>> +return av_mallocz(sizeof(AVContentLightMetadata));
>> +}
>> +
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
>> *frame)
>> +{
>> +AVFrameSideData *side_data = av_frame_new_side_data(frame,
>> +
>> AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>> +
>> sizeof(AVContentLightMetadata));
>> +if (!side_data)
>> +return NULL;
>> +
>> +memset(side_data->data, 0, sizeof(AVContentLightMetadata));
>> +
>> +return (AVContentLightMetadata *)side_data->data;
>> +}
>> diff --git a/libavutil/mastering_display_metadata.h 
>> b/libavutil/mastering_display_metadata.h
>> index 936533fec4..5ad7f5bd42 100644
>> --- a/libavutil/mastering_display_metadata.h
>> +++ b/libavutil/mastering_display_metadata.h
>> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_alloc(void);
>>   */
>>  AVMasteringDisplayMetadata 
>> *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>>
>> +/**
>> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
>> + *
>> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
>> + * appropriate type.
>> + *
>> + * @note The struct should be allocated with 
>> av_content_light_metadata_alloc()
>> + *   and its size is not a part of the public ABI.
>> + */
>> +typedef struct AVContentLightMetadata {
>> +/**
>> + * Max content light level (cd/m^2).
>> + */
>> +AVRational max_content_light_level;
>> +
>> +/**
>> + * Max avereage light level per picture (cd/m^2).
>
> It might be better to call this how the spec calls it: Maximum
> frame-average light level (MaxFALL), instead of coming up with a
> slight rewording, that could just cause confusion.

I used the names from the HEVC spec I have. But in avutil a more
common name is pr

[FFmpeg-devel] [PATCH 2/3] lavc: Add Content Light Level side metadata found in HEVC

2017-03-31 Thread Steve Lhomme
These data are necessary when transmitting HDR over HDMI.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- update with MaxCLL/MaxFALL changes in avutil
---
 libavcodec/avcodec.h  |  7 +++
 libavcodec/avpacket.c |  1 +
 libavcodec/hevc_sei.c | 15 +++
 libavcodec/hevcdec.c  | 18 ++
 libavcodec/hevcdec.h  |  5 +
 libavcodec/utils.c|  1 +
 libavcodec/version.h  |  2 +-
 7 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 60f7acefbd..6ded74b512 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1583,6 +1583,13 @@ enum AVPacketSideDataType {
  * to the AVSphericalMapping structure.
  */
 AV_PKT_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This metadata should be
+ * associated with a video stream and containts data in the form of the
+ * AVContentLightMetadata struct.
+ */
+AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 8420d8b258..2c28a26a9a 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -374,6 +374,7 @@ const char *av_packet_side_data_name(enum 
AVPacketSideDataType type)
 case AV_PKT_DATA_METADATA_UPDATE:return "Metadata Update";
 case AV_PKT_DATA_MPEGTS_STREAM_ID:   return "MPEGTS Stream ID";
 case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display 
metadata";
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:return "Content light level 
metadata";
 case AV_PKT_DATA_SPHERICAL:  return "Spherical Mapping";
 }
 return NULL;
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 8fc026cf1e..bb299d5a9f 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -102,6 +102,19 @@ static int 
decode_nal_sei_mastering_display_info(HEVCContext *s)
 return 0;
 }
 
+static int decode_nal_sei_content_light_info(HEVCContext *s)
+{
+GetBitContext *gb = &s->HEVClc->gb;
+// Max and average light levels
+s->max_content_light_level = get_bits_long(gb, 16);
+s->max_pic_average_light_level = get_bits_long(gb, 16);
+// As this SEI message comes before the first frame that references it,
+// initialize the flag to 2 and decrement on IRAP access unit so it
+// persists for the coded video sequence (e.g., between two IRAPs)
+s-> sei_content_light_present = 2;
+return  0;
+}
+
 static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
 {
 GetBitContext *gb = &s->HEVClc->gb;
@@ -304,6 +317,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 }
 case SEI_TYPE_MASTERING_DISPLAY_INFO:
 return decode_nal_sei_mastering_display_info(s);
+case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+return decode_nal_sei_content_light_info(s);
 case SEI_TYPE_ACTIVE_PARAMETER_SETS:
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index ef21595c44..61426979ae 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2644,6 +2644,24 @@ static int set_side_data(HEVCContext *s)
"min_luminance=%f, max_luminance=%f\n",
av_q2d(metadata->min_luminance), 
av_q2d(metadata->max_luminance));
 }
+// Decrement the mastering display flag when IRAP frame has 
no_rasl_output_flag=1
+// so the side data persists for the entire coded video sequence.
+if (s->sei_content_light_present > 0 &&
+IS_IRAP(s) && s->no_rasl_output_flag) {
+s->sei_content_light_present--;
+}
+if (s->sei_content_light_present) {
+AVContentLightMetadata *metadata =
+av_content_light_metadata_create_side_data(out);
+if (!metadata)
+return AVERROR(ENOMEM);
+metadata->MaxCLL  = s->max_content_light_level;
+metadata->MaxFALL = s->max_pic_average_light_level;
+
+av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
+av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
+   metadata->MaxCLL, metadata->MaxFALL);
+}
 
 if (s->a53_caption) {
 AVFrameSideData* sd = av_frame_new_side_data(out,
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index 0c7881286c..e5879a5c2b 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -596,6 +596,11 @@ typedef struct HEVCContext {
 uint32_t max_mastering_luminance;
 uint32_t min_mastering_luminance;
 
+/* content light level */
+int sei_content_light_present;
+uint16_t max_content_light_level;
+uint16_t max_pic_average_light_level;
+
 } HEVCContext;
 
 int ff_hevc_decode_nal_sei(HEVCContext *s);
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 3e8677d0f4..8a47a32663 100644
--- a/

[FFmpeg-devel] [PATCH 3/3] avformat/dump : Display Content Light Level metadata

2017-03-31 Thread Steve Lhomme
--
update the previous patch:
- use MaxCLL/MaxFALL which are not rational numbers anymore
---
 libavformat/dump.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/libavformat/dump.c b/libavformat/dump.c
index 7c811ce5d2..0ab3465db8 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -343,6 +343,14 @@ static void dump_mastering_display_metadata(void *ctx, 
AVPacketSideData* sd) {
av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
 }
 
+static void dump_content_light_metadata(void *ctx, AVPacketSideData* sd)
+{
+AVContentLightMetadata* metadata = (AVContentLightMetadata*)sd->data;
+av_log(ctx, AV_LOG_INFO, "Content Light Level Metadata, "
+   "MaxCLL=%d, MaxFALL=%d",
+   metadata->MaxCLL, metadata->MaxFALL);
+}
+
 static void dump_spherical(void *ctx, AVCodecParameters *par, AVPacketSideData 
*sd)
 {
 AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data;
@@ -435,6 +443,9 @@ static void dump_sidedata(void *ctx, AVStream *st, const 
char *indent)
 av_log(ctx, AV_LOG_INFO, "spherical: ");
 dump_spherical(ctx, st->codecpar, &sd);
 break;
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:
+dump_content_light_metadata(ctx, &sd);
+break;
 default:
 av_log(ctx, AV_LOG_INFO,
"unknown side data type %d (%d bytes)", sd.type, sd.size);
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-03-31 Thread Steve Lhomme
As found in HEVC.

I put the code in mastering_display_metadata as they usually go together in
Blu-Ray UHD sources.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- use MaxCLL and MaxFALL names that are more commonly found
- use unsigned integer rather than rational numbers as (supposedly) in the specs
- provide the structure size on output of av_content_light_metadata_alloc()
---
 libavutil/frame.c  |  1 +
 libavutil/frame.h  |  6 ++
 libavutil/mastering_display_metadata.c | 23 
 libavutil/mastering_display_metadata.h | 39 ++
 libavutil/version.h|  2 +-
 5 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 8811dcdcfe..dd12c5549c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
AVFrameSideDataType type)
 case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
 case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
type";
 case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display 
metadata";
+case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
level metadata";
 case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
 }
 return NULL;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 7cb78a1a44..1ecb6a087a 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -127,6 +127,12 @@ enum AVFrameSideDataType {
  * libavutil/spherical.h.
  */
 AV_FRAME_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This payload containts data in
+ * the form of the AVContentLightMetadata struct.
+ */
+AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/mastering_display_metadata.c 
b/libavutil/mastering_display_metadata.c
index e1683e55c7..6069347617 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -41,3 +41,26 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFra
 
 return (AVMasteringDisplayMetadata *)side_data->data;
 }
+
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size)
+{
+AVContentLightMetadata *metadata = 
av_mallocz(sizeof(AVContentLightMetadata));
+
+if (size)
+*size = sizeof(*metadata);
+
+return metadata;
+}
+
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+
sizeof(AVContentLightMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVContentLightMetadata));
+
+return (AVContentLightMetadata *)side_data->data;
+}
diff --git a/libavutil/mastering_display_metadata.h 
b/libavutil/mastering_display_metadata.h
index 936533fec4..847b0b62c6 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_alloc(void);
  */
 AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFrame *frame);
 
+/**
+ * Content light level needed by to transmit HDR over HDMI (CTA-861.3).
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with av_content_light_metadata_alloc()
+ *   and its size is not a part of the public ABI.
+ */
+typedef struct AVContentLightMetadata {
+/**
+ * Max content light level (cd/m^2).
+ */
+unsigned MaxCLL;
+
+/**
+ * Max average light level per frame (cd/m^2).
+ */
+unsigned MaxFALL;
+} AVContentLightMetadata;
+
+/**
+ * Allocate an AVContentLightMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVContentLightMetadata filled with default values or NULL
+ * on failure.
+ */
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size);
+
+/**
+ * Allocate a complete AVContentLightMetadata and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVContentLightMetadata structure to be filled by caller.
+ */
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame);
+
 #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index a14c0e7eb2..fedc6fa177 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  53
+#define LIBAVUTIL_VERSION_MINOR  54
 #define LIBAVUTIL_VERSION_MI

[FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-04-02 Thread Steve Lhomme
As found in HEVC.

I put the code in mastering_display_metadata as they usually go together in
Blu-Ray UHD sources.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- use MaxCLL and MaxFALL names that are more commonly found
- use unsigned integer rather than rational numbers as (supposedly) in the specs
- provide the structure size on output of av_content_light_metadata_alloc()
update the previous patch:
- rebased and updated version bump
---
 libavutil/frame.c  |  1 +
 libavutil/frame.h  |  6 ++
 libavutil/mastering_display_metadata.c | 23 
 libavutil/mastering_display_metadata.h | 39 ++
 libavutil/version.h|  2 +-
 5 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 8811dcdcfe..dd12c5549c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
AVFrameSideDataType type)
 case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
 case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
type";
 case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display 
metadata";
+case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
level metadata";
 case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
 }
 return NULL;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 7cb78a1a44..1ecb6a087a 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -127,6 +127,12 @@ enum AVFrameSideDataType {
  * libavutil/spherical.h.
  */
 AV_FRAME_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This payload containts data in
+ * the form of the AVContentLightMetadata struct.
+ */
+AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/mastering_display_metadata.c 
b/libavutil/mastering_display_metadata.c
index e1683e55c7..6069347617 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -41,3 +41,26 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFra
 
 return (AVMasteringDisplayMetadata *)side_data->data;
 }
+
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size)
+{
+AVContentLightMetadata *metadata = 
av_mallocz(sizeof(AVContentLightMetadata));
+
+if (size)
+*size = sizeof(*metadata);
+
+return metadata;
+}
+
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+
sizeof(AVContentLightMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVContentLightMetadata));
+
+return (AVContentLightMetadata *)side_data->data;
+}
diff --git a/libavutil/mastering_display_metadata.h 
b/libavutil/mastering_display_metadata.h
index 936533fec4..847b0b62c6 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_alloc(void);
  */
 AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFrame *frame);
 
+/**
+ * Content light level needed by to transmit HDR over HDMI (CTA-861.3).
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with av_content_light_metadata_alloc()
+ *   and its size is not a part of the public ABI.
+ */
+typedef struct AVContentLightMetadata {
+/**
+ * Max content light level (cd/m^2).
+ */
+unsigned MaxCLL;
+
+/**
+ * Max average light level per frame (cd/m^2).
+ */
+unsigned MaxFALL;
+} AVContentLightMetadata;
+
+/**
+ * Allocate an AVContentLightMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVContentLightMetadata filled with default values or NULL
+ * on failure.
+ */
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size);
+
+/**
+ * Allocate a complete AVContentLightMetadata and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVContentLightMetadata structure to be filled by caller.
+ */
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame);
+
 #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index d89a4187e8..abea2163be 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  57
+#de

[FFmpeg-devel] [PATCH 2/3] lavc: Add Content Light Level side metadata found in HEVC

2017-04-02 Thread Steve Lhomme
These data are necessary when transmitting HDR over HDMI.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- update with MaxCLL/MaxFALL changes in avutil
update the previous patch:
- rebased and updated version bump
---
 libavcodec/avcodec.h  |  7 +++
 libavcodec/avpacket.c |  1 +
 libavcodec/hevc_sei.c | 15 +++
 libavcodec/hevcdec.c  | 18 ++
 libavcodec/hevcdec.h  |  5 +
 libavcodec/utils.c|  1 +
 libavcodec/version.h  |  2 +-
 7 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index d7804773cb..92549e1ed9 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1583,6 +1583,13 @@ enum AVPacketSideDataType {
  * to the AVSphericalMapping structure.
  */
 AV_PKT_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This metadata should be
+ * associated with a video stream and containts data in the form of the
+ * AVContentLightMetadata struct.
+ */
+AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index e633245a62..4bf830bb8a 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -374,6 +374,7 @@ const char *av_packet_side_data_name(enum 
AVPacketSideDataType type)
 case AV_PKT_DATA_METADATA_UPDATE:return "Metadata Update";
 case AV_PKT_DATA_MPEGTS_STREAM_ID:   return "MPEGTS Stream ID";
 case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display 
metadata";
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:return "Content light level 
metadata";
 case AV_PKT_DATA_SPHERICAL:  return "Spherical Mapping";
 }
 return NULL;
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 8fc026cf1e..bb299d5a9f 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -102,6 +102,19 @@ static int 
decode_nal_sei_mastering_display_info(HEVCContext *s)
 return 0;
 }
 
+static int decode_nal_sei_content_light_info(HEVCContext *s)
+{
+GetBitContext *gb = &s->HEVClc->gb;
+// Max and average light levels
+s->max_content_light_level = get_bits_long(gb, 16);
+s->max_pic_average_light_level = get_bits_long(gb, 16);
+// As this SEI message comes before the first frame that references it,
+// initialize the flag to 2 and decrement on IRAP access unit so it
+// persists for the coded video sequence (e.g., between two IRAPs)
+s-> sei_content_light_present = 2;
+return  0;
+}
+
 static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
 {
 GetBitContext *gb = &s->HEVClc->gb;
@@ -304,6 +317,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 }
 case SEI_TYPE_MASTERING_DISPLAY_INFO:
 return decode_nal_sei_mastering_display_info(s);
+case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+return decode_nal_sei_content_light_info(s);
 case SEI_TYPE_ACTIVE_PARAMETER_SETS:
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index ef21595c44..61426979ae 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2644,6 +2644,24 @@ static int set_side_data(HEVCContext *s)
"min_luminance=%f, max_luminance=%f\n",
av_q2d(metadata->min_luminance), 
av_q2d(metadata->max_luminance));
 }
+// Decrement the mastering display flag when IRAP frame has 
no_rasl_output_flag=1
+// so the side data persists for the entire coded video sequence.
+if (s->sei_content_light_present > 0 &&
+IS_IRAP(s) && s->no_rasl_output_flag) {
+s->sei_content_light_present--;
+}
+if (s->sei_content_light_present) {
+AVContentLightMetadata *metadata =
+av_content_light_metadata_create_side_data(out);
+if (!metadata)
+return AVERROR(ENOMEM);
+metadata->MaxCLL  = s->max_content_light_level;
+metadata->MaxFALL = s->max_pic_average_light_level;
+
+av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
+av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
+   metadata->MaxCLL, metadata->MaxFALL);
+}
 
 if (s->a53_caption) {
 AVFrameSideData* sd = av_frame_new_side_data(out,
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index 0c7881286c..e5879a5c2b 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -596,6 +596,11 @@ typedef struct HEVCContext {
 uint32_t max_mastering_luminance;
 uint32_t min_mastering_luminance;
 
+/* content light level */
+int sei_content_light_present;
+uint16_t max_content_light_level;
+uint16_t max_pic_average_light_level;
+
 } HEVCContext;
 
 int ff_hevc_decode_nal_sei(HEVCContext *s);
diff --git a/libavcodec/utils.c b

[FFmpeg-devel] [PATCH 3/3] avformat/dump : Display Content Light Level metadata

2017-04-02 Thread Steve Lhomme
--
update the previous patch:
- use MaxCLL/MaxFALL which are not rational numbers anymore
---
 libavformat/dump.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/libavformat/dump.c b/libavformat/dump.c
index ef4a6b093b..8fd58a0dba 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -343,6 +343,14 @@ static void dump_mastering_display_metadata(void *ctx, 
AVPacketSideData* sd) {
av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
 }
 
+static void dump_content_light_metadata(void *ctx, AVPacketSideData* sd)
+{
+AVContentLightMetadata* metadata = (AVContentLightMetadata*)sd->data;
+av_log(ctx, AV_LOG_INFO, "Content Light Level Metadata, "
+   "MaxCLL=%d, MaxFALL=%d",
+   metadata->MaxCLL, metadata->MaxFALL);
+}
+
 static void dump_spherical(void *ctx, AVCodecParameters *par, AVPacketSideData 
*sd)
 {
 AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data;
@@ -426,6 +434,9 @@ static void dump_sidedata(void *ctx, AVStream *st, const 
char *indent)
 av_log(ctx, AV_LOG_INFO, "spherical: ");
 dump_spherical(ctx, st->codecpar, &sd);
 break;
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:
+dump_content_light_metadata(ctx, &sd);
+break;
 default:
 av_log(ctx, AV_LOG_INFO,
"unknown side data type %d (%d bytes)", sd.type, sd.size);
-- 
2.11.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/3] lavu: add support for Content Light Level side metadata

2017-04-03 Thread Steve Lhomme
As found in HEVC.

I put the code in mastering_display_metadata as they usually go together in
Blu-Ray UHD sources.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- use MaxCLL and MaxFALL names that are more commonly found
- use unsigned integer rather than rational numbers as (supposedly) in the specs
- provide the structure size on output of av_content_light_metadata_alloc()
update the previous patch:
- rebased and updated version bump
update the previous patch:
- rebased and updated version bump
- fix contains typo
---
 libavutil/frame.c  |  1 +
 libavutil/frame.h  |  6 ++
 libavutil/mastering_display_metadata.c | 23 
 libavutil/mastering_display_metadata.h | 39 ++
 libavutil/version.h|  2 +-
 5 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 8811dcdcfe..dd12c5549c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum 
AVFrameSideDataType type)
 case AV_FRAME_DATA_SKIP_SAMPLES:return "Skip samples";
 case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:  return "Audio service 
type";
 case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display 
metadata";
+case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: return "Content light 
level metadata";
 case AV_FRAME_DATA_GOP_TIMECODE:return "GOP timecode";
 }
 return NULL;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 7cb78a1a44..4d8c1bed4f 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -127,6 +127,12 @@ enum AVFrameSideDataType {
  * libavutil/spherical.h.
  */
 AV_FRAME_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This payload contains data in
+ * the form of the AVContentLightMetadata struct.
+ */
+AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/mastering_display_metadata.c 
b/libavutil/mastering_display_metadata.c
index e1683e55c7..6069347617 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -41,3 +41,26 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFra
 
 return (AVMasteringDisplayMetadata *)side_data->data;
 }
+
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size)
+{
+AVContentLightMetadata *metadata = 
av_mallocz(sizeof(AVContentLightMetadata));
+
+if (size)
+*size = sizeof(*metadata);
+
+return metadata;
+}
+
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+
sizeof(AVContentLightMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVContentLightMetadata));
+
+return (AVContentLightMetadata *)side_data->data;
+}
diff --git a/libavutil/mastering_display_metadata.h 
b/libavutil/mastering_display_metadata.h
index 936533fec4..847b0b62c6 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -86,4 +86,43 @@ AVMasteringDisplayMetadata 
*av_mastering_display_metadata_alloc(void);
  */
 AVMasteringDisplayMetadata 
*av_mastering_display_metadata_create_side_data(AVFrame *frame);
 
+/**
+ * Content light level needed by to transmit HDR over HDMI (CTA-861.3).
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with av_content_light_metadata_alloc()
+ *   and its size is not a part of the public ABI.
+ */
+typedef struct AVContentLightMetadata {
+/**
+ * Max content light level (cd/m^2).
+ */
+unsigned MaxCLL;
+
+/**
+ * Max average light level per frame (cd/m^2).
+ */
+unsigned MaxFALL;
+} AVContentLightMetadata;
+
+/**
+ * Allocate an AVContentLightMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVContentLightMetadata filled with default values or NULL
+ * on failure.
+ */
+AVContentLightMetadata *av_content_light_metadata_alloc(size_t *size);
+
+/**
+ * Allocate a complete AVContentLightMetadata and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVContentLightMetadata structure to be filled by caller.
+ */
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame 
*frame);
+
 #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index b0f9ba4f4e..95e1e929f3 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */

[FFmpeg-devel] [PATCH 2/3] lavc: Add Content Light Level side metadata found in HEVC

2017-04-03 Thread Steve Lhomme
These data are necessary when transmitting HDR over HDMI.

--
update the previous patch:
- rename CEA 861.3 to CTA-861.3
- update with MaxCLL/MaxFALL changes in avutil
update the previous patch:
- rebased and updated version bump
---
 libavcodec/avcodec.h  |  7 +++
 libavcodec/avpacket.c |  1 +
 libavcodec/hevc_sei.c | 15 +++
 libavcodec/hevcdec.c  | 18 ++
 libavcodec/hevcdec.h  |  5 +
 libavcodec/utils.c|  1 +
 libavcodec/version.h  |  2 +-
 7 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index d7804773cb..92549e1ed9 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1583,6 +1583,13 @@ enum AVPacketSideDataType {
  * to the AVSphericalMapping structure.
  */
 AV_PKT_DATA_SPHERICAL,
+
+/**
+ * Content light level (based on CTA-861.3). This metadata should be
+ * associated with a video stream and containts data in the form of the
+ * AVContentLightMetadata struct.
+ */
+AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index e633245a62..4bf830bb8a 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -374,6 +374,7 @@ const char *av_packet_side_data_name(enum 
AVPacketSideDataType type)
 case AV_PKT_DATA_METADATA_UPDATE:return "Metadata Update";
 case AV_PKT_DATA_MPEGTS_STREAM_ID:   return "MPEGTS Stream ID";
 case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display 
metadata";
+case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:return "Content light level 
metadata";
 case AV_PKT_DATA_SPHERICAL:  return "Spherical Mapping";
 }
 return NULL;
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index 8fc026cf1e..bb299d5a9f 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -102,6 +102,19 @@ static int 
decode_nal_sei_mastering_display_info(HEVCContext *s)
 return 0;
 }
 
+static int decode_nal_sei_content_light_info(HEVCContext *s)
+{
+GetBitContext *gb = &s->HEVClc->gb;
+// Max and average light levels
+s->max_content_light_level = get_bits_long(gb, 16);
+s->max_pic_average_light_level = get_bits_long(gb, 16);
+// As this SEI message comes before the first frame that references it,
+// initialize the flag to 2 and decrement on IRAP access unit so it
+// persists for the coded video sequence (e.g., between two IRAPs)
+s-> sei_content_light_present = 2;
+return  0;
+}
+
 static int decode_nal_sei_frame_packing_arrangement(HEVCContext *s)
 {
 GetBitContext *gb = &s->HEVClc->gb;
@@ -304,6 +317,8 @@ static int decode_nal_sei_prefix(HEVCContext *s, int type, 
int size)
 }
 case SEI_TYPE_MASTERING_DISPLAY_INFO:
 return decode_nal_sei_mastering_display_info(s);
+case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+return decode_nal_sei_content_light_info(s);
 case SEI_TYPE_ACTIVE_PARAMETER_SETS:
 active_parameter_sets(s);
 av_log(s->avctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index ef21595c44..61426979ae 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2644,6 +2644,24 @@ static int set_side_data(HEVCContext *s)
"min_luminance=%f, max_luminance=%f\n",
av_q2d(metadata->min_luminance), 
av_q2d(metadata->max_luminance));
 }
+// Decrement the mastering display flag when IRAP frame has 
no_rasl_output_flag=1
+// so the side data persists for the entire coded video sequence.
+if (s->sei_content_light_present > 0 &&
+IS_IRAP(s) && s->no_rasl_output_flag) {
+s->sei_content_light_present--;
+}
+if (s->sei_content_light_present) {
+AVContentLightMetadata *metadata =
+av_content_light_metadata_create_side_data(out);
+if (!metadata)
+return AVERROR(ENOMEM);
+metadata->MaxCLL  = s->max_content_light_level;
+metadata->MaxFALL = s->max_pic_average_light_level;
+
+av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
+av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
+   metadata->MaxCLL, metadata->MaxFALL);
+}
 
 if (s->a53_caption) {
 AVFrameSideData* sd = av_frame_new_side_data(out,
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index 0c7881286c..e5879a5c2b 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -596,6 +596,11 @@ typedef struct HEVCContext {
 uint32_t max_mastering_luminance;
 uint32_t min_mastering_luminance;
 
+/* content light level */
+int sei_content_light_present;
+uint16_t max_content_light_level;
+uint16_t max_pic_average_light_level;
+
 } HEVCContext;
 
 int ff_hevc_decode_nal_sei(HEVCContext *s);
diff --git a/libavcodec/utils.c b

[FFmpeg-devel] ff_thread_get_format and metadata

2017-04-06 Thread Steve Lhomme
Hi,

As I am progressing in proper HDR10 support in VLC, I am facing an
issue. The mastering (and lighting pending patch) metadata are set on
the AVFrame but not available to the ff_get_format() receiver.

That means when we configure our vout and decoder we don't know if
it's going to have HDR metadata or not.

Could we move the mastering (and lighting) metadata on the
AVCodecContext ? Or provide the metadata on the ff_get_format() call ?

I CC'ed libav as they have opinions on possible API changes, even
though there is no mastering metadata support in there yet.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [libav-devel] ff_thread_get_format and metadata

2017-04-06 Thread Steve Lhomme
On Thu, Apr 6, 2017 at 11:08 AM, Hendrik Leppkes  wrote:
> On Thu, Apr 6, 2017 at 11:01 AM, Steve Lhomme  wrote:
>> Hi,
>>
>> As I am progressing in proper HDR10 support in VLC, I am facing an
>> issue. The mastering (and lighting pending patch) metadata are set on
>> the AVFrame but not available to the ff_get_format() receiver.
>>
>> That means when we configure our vout and decoder we don't know if
>> it's going to have HDR metadata or not.
>>
>> Could we move the mastering (and lighting) metadata on the
>> AVCodecContext ? Or provide the metadata on the ff_get_format() call ?
>>
>> I CC'ed libav as they have opinions on possible API changes, even
>> though there is no mastering metadata support in there yet.
>
>
> I'm against polluting AVCodecContext with more random fields, and
> get_format is fixed API/ABI, we can't change that very easily.

I understand, that's why I prefer asking before trying things out.

> In general, this is per-frame metadata, which can appear or change
> with any given frame, without get_format being invoked again. You
> should probably just be able to have your output react to that once it
> receives it.

This is already the case. I copy the relevant metadata of the AVFrame
in the picture we are going to display. But the underlying stream
format has no idea that it has HDR metadata. We can't tell the user
what kind of metadata the stream has (think of ffprobe-like info).

Also as a more general case there can even be an issue with
selecting/configuring the display when ff_get_format() is called. For
example you don't know the frame packing format (3D, side by side,
etc). It's available in SEI_TYPE_FRAME_PACKING for H264 and HEVC.

Couldn't there be a way to query AVCodecContext for certain metadata ?
In the case of HEVC/H264 it would look in the calling associated
HEVCContext/H264Context. Which is the (upper) context that is calling
the ff_get_format().

> - Hendrik
> ___
> libav-devel mailing list
> libav-de...@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [libav-devel] ff_thread_get_format and metadata

2017-04-06 Thread Steve Lhomme
On Thu, Apr 6, 2017 at 11:38 AM, wm4  wrote:
> On Thu, 6 Apr 2017 11:08:24 +0200
> Hendrik Leppkes  wrote:
>
>> On Thu, Apr 6, 2017 at 11:01 AM, Steve Lhomme  wrote:
>> > Hi,
>> >
>> > As I am progressing in proper HDR10 support in VLC, I am facing an
>> > issue. The mastering (and lighting pending patch) metadata are set on
>> > the AVFrame but not available to the ff_get_format() receiver.
>> >
>> > That means when we configure our vout and decoder we don't know if
>> > it's going to have HDR metadata or not.
>> >
>> > Could we move the mastering (and lighting) metadata on the
>> > AVCodecContext ? Or provide the metadata on the ff_get_format() call ?
>> >
>> > I CC'ed libav as they have opinions on possible API changes, even
>> > though there is no mastering metadata support in there yet.
>>
>>
>> I'm against polluting AVCodecContext with more random fields, and
>> get_format is fixed API/ABI, we can't change that very easily.
>>
>> In general, this is per-frame metadata, which can appear or change
>> with any given frame, without get_format being invoked again. You
>> should probably just be able to have your output react to that once it
>> receives it.
>
> +1
>
> Also, get_format is not for such things - it's to allocate frames
> _only_, and thus needs only size and pixfmt.

Yes, but for example if you're going to have stereo pictures you may
need to setup your allocated textures a certain way.

Also AVColorPrimaries are found in the mastering metadata are found in
AVCodecContext, should the metadata write there instead ?

> You should configure your vout based on the _decoded_ frame, not
> get_format.
> ___
> libav-devel mailing list
> libav-de...@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [libav-devel] ff_thread_get_format and metadata

2017-04-06 Thread Steve Lhomme
On Thu, Apr 6, 2017 at 1:08 PM, Hendrik Leppkes  wrote:
> On Thu, Apr 6, 2017 at 11:35 AM, Steve Lhomme  wrote:
>> On Thu, Apr 6, 2017 at 11:08 AM, Hendrik Leppkes  wrote:
>>> On Thu, Apr 6, 2017 at 11:01 AM, Steve Lhomme  wrote:
>>>> Hi,
>>>>
>>>> As I am progressing in proper HDR10 support in VLC, I am facing an
>>>> issue. The mastering (and lighting pending patch) metadata are set on
>>>> the AVFrame but not available to the ff_get_format() receiver.
>>>>
>>>> That means when we configure our vout and decoder we don't know if
>>>> it's going to have HDR metadata or not.
>>>>
>>>> Could we move the mastering (and lighting) metadata on the
>>>> AVCodecContext ? Or provide the metadata on the ff_get_format() call ?
>>>>
>>>> I CC'ed libav as they have opinions on possible API changes, even
>>>> though there is no mastering metadata support in there yet.
>>>
>>>
>>> I'm against polluting AVCodecContext with more random fields, and
>>> get_format is fixed API/ABI, we can't change that very easily.
>>
>> I understand, that's why I prefer asking before trying things out.
>>
>>> In general, this is per-frame metadata, which can appear or change
>>> with any given frame, without get_format being invoked again. You
>>> should probably just be able to have your output react to that once it
>>> receives it.
>>
>> This is already the case. I copy the relevant metadata of the AVFrame
>> in the picture we are going to display. But the underlying stream
>> format has no idea that it has HDR metadata. We can't tell the user
>> what kind of metadata the stream has (think of ffprobe-like info).
>>
>
> So you just want this for probing, not even for actual playback?
> The users will get over it then, I'm sure. Otherwise you could just
> decode one frame and retrieve the metadata - thats the best way to
> retrieve full accurate information anyway.

In this particular case, for now, yes. But I am asking a more general
question on how metadata, that are necessary for playback may be known
when configuring the playback pipeline, can be provided early.

I guess for now I can find a solution for my special use case.

> - Hendrik
> ___
> libav-devel mailing list
> libav-de...@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 3/3] avformat/dump : Display Content Light Level metadata

2017-04-06 Thread Steve Lhomme
Thanks !

On Thu, Apr 6, 2017 at 4:45 PM, James Almer  wrote:
> On 4/2/2017 5:08 AM, Steve Lhomme wrote:
>> --
>> update the previous patch:
>> - use MaxCLL/MaxFALL which are not rational numbers anymore
>> ---
>>  libavformat/dump.c | 11 +++
>>  1 file changed, 11 insertions(+)
>>
>> diff --git a/libavformat/dump.c b/libavformat/dump.c
>> index ef4a6b093b..8fd58a0dba 100644
>> --- a/libavformat/dump.c
>> +++ b/libavformat/dump.c
>> @@ -343,6 +343,14 @@ static void dump_mastering_display_metadata(void *ctx, 
>> AVPacketSideData* sd) {
>> av_q2d(metadata->min_luminance), 
>> av_q2d(metadata->max_luminance));
>>  }
>>
>> +static void dump_content_light_metadata(void *ctx, AVPacketSideData* sd)
>> +{
>> +AVContentLightMetadata* metadata = (AVContentLightMetadata*)sd->data;
>> +av_log(ctx, AV_LOG_INFO, "Content Light Level Metadata, "
>> +   "MaxCLL=%d, MaxFALL=%d",
>> +   metadata->MaxCLL, metadata->MaxFALL);
>> +}
>> +
>>  static void dump_spherical(void *ctx, AVCodecParameters *par, 
>> AVPacketSideData *sd)
>>  {
>>  AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data;
>> @@ -426,6 +434,9 @@ static void dump_sidedata(void *ctx, AVStream *st, const 
>> char *indent)
>>  av_log(ctx, AV_LOG_INFO, "spherical: ");
>>  dump_spherical(ctx, st->codecpar, &sd);
>>  break;
>> +case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:
>> +dump_content_light_metadata(ctx, &sd);
>> +break;
>>  default:
>>  av_log(ctx, AV_LOG_INFO,
>> "unknown side data type %d (%d bytes)", sd.type, 
>> sd.size);
>>
>
> Pushed, thanks.
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 2/4] qsvenc: the return value is not any kind of int, it's a mfxStatus

2017-09-21 Thread Steve Lhomme
---
 libavcodec/qsvenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 5eb506fb76..772336b719 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -989,7 +989,7 @@ static int encode_frame(AVCodecContext *avctx, 
QSVEncContext *q,
 mfxSyncPoint *sync = NULL;
 QSVFrame *qsv_frame = NULL;
 mfxEncodeCtrl* enc_ctrl = NULL;
-int ret;
+mfxStatus ret;
 
 if (frame) {
 ret = submit_frame(q, frame, &qsv_frame);
-- 
2.12.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] h264_sei: handle stereoscopy frame sequential flags

2017-09-21 Thread Steve Lhomme
From: "Mohammed (Shaan) Huzaifa Danish" 

---
 libavcodec/h264_sei.c   | 6 --
 libavcodec/h264_sei.h   | 1 +
 libavcodec/h264_slice.c | 2 ++
 libavutil/stereo3d.h| 4 
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index 332ae50860..d28a9b61f6 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -326,9 +326,11 @@ static int 
decode_frame_packing_arrangement(H264SEIFramePacking *h,
 h->content_interpretation_type= get_bits(gb, 6);
 
 // the following skips: spatial_flipping_flag, frame0_flipped_flag,
-// field_views_flag, current_frame_is_frame0_flag,
+// field_views_flag
+skip_bits(gb, 3);
+h->current_frame_is_frame0_flag = get_bits1(gb);
 // frame0_self_contained_flag, frame1_self_contained_flag
-skip_bits(gb, 6);
+skip_bits(gb, 2);
 
 if (!h->quincunx_sampling_flag && h->frame_packing_arrangement_type != 
5)
 skip_bits(gb, 16);  // frame[01]_grid_position_[xy]
diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h
index a53f1899fa..817b4eaae9 100644
--- a/libavcodec/h264_sei.h
+++ b/libavcodec/h264_sei.h
@@ -125,6 +125,7 @@ typedef struct H264SEIFramePacking {
 int frame_packing_arrangement_repetition_period;
 int content_interpretation_type;
 int quincunx_sampling_flag;
+int current_frame_is_frame0_flag;
 } H264SEIFramePacking;
 
 typedef struct H264SEIDisplayOrientation {
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 2577edd8a6..2de9abe650 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1246,6 +1246,8 @@ static int h264_export_frame_props(H264Context *h)
 
 if (fp->content_interpretation_type == 2)
 stereo->flags = AV_STEREO3D_FLAG_INVERT;
+if (fp->current_frame_is_frame0_flag)
+stereo->flags |= AV_STEREO3D_FLAG_FRAME0;
 }
 }
 
diff --git a/libavutil/stereo3d.h b/libavutil/stereo3d.h
index 54f4c4c5c7..190918c3c6 100644
--- a/libavutil/stereo3d.h
+++ b/libavutil/stereo3d.h
@@ -146,6 +146,10 @@ enum AVStereo3DType {
  * Inverted views, Right/Bottom represents the left view.
  */
 #define AV_STEREO3D_FLAG_INVERT (1 << 0)
+/**
+ * This frame is frame0 (left view), otherwise it's the right view.
+ */
+#define AV_STEREO3D_FLAG_FRAME0 (1 << 1)
 
 /**
  * Stereo 3D type: this structure describes how two videos are packed
-- 
2.12.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 3/4] qsvenc: merge the output fifo elements into a structure

2017-09-21 Thread Steve Lhomme
This is cleaner to read and less error prone.
---
 libavcodec/qsvenc.c | 117 +---
 1 file changed, 56 insertions(+), 61 deletions(-)

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 772336b719..bbf72e54b0 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -69,6 +69,13 @@ static const struct {
 #endif
 };
 
+struct QSVpacket
+{
+AVPacket new_pkt;
+mfxBitstream *bs;
+mfxSyncPoint *syncp;
+};
+
 static const char *print_profile(mfxU16 profile)
 {
 int i;
@@ -727,8 +734,7 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
 
 q->param.AsyncDepth = q->async_depth;
 
-q->async_fifo = av_fifo_alloc((1 + q->async_depth) *
-  (sizeof(AVPacket) + sizeof(mfxSyncPoint*) + 
sizeof(mfxBitstream*)));
+q->async_fifo = av_fifo_alloc((1 + q->async_depth) * sizeof(struct 
QSVpacket));
 if (!q->async_fifo)
 return AVERROR(ENOMEM);
 
@@ -979,14 +985,19 @@ static void print_interlace_msg(AVCodecContext *avctx, 
QSVEncContext *q)
 }
 }
 
+static void qsv_packet_release(struct QSVpacket *qsv_pkt)
+{
+av_packet_unref(&qsv_pkt->new_pkt);
+av_freep(qsv_pkt->bs);
+av_freep(qsv_pkt->syncp);
+}
+
 static int encode_frame(AVCodecContext *avctx, QSVEncContext *q,
 const AVFrame *frame)
 {
-AVPacket new_pkt = { 0 };
-mfxBitstream *bs;
+struct QSVpacket qsv_pkt = { 0 };
 
 mfxFrameSurface1 *surf = NULL;
-mfxSyncPoint *sync = NULL;
 QSVFrame *qsv_frame = NULL;
 mfxEncodeCtrl* enc_ctrl = NULL;
 mfxStatus ret;
@@ -1003,33 +1014,33 @@ static int encode_frame(AVCodecContext *avctx, 
QSVEncContext *q,
 enc_ctrl = &qsv_frame->enc_ctrl;
 }
 
-ret = av_new_packet(&new_pkt, q->packet_size);
+ret = av_new_packet(&qsv_pkt.new_pkt, q->packet_size);
 if (ret < 0) {
 av_log(avctx, AV_LOG_ERROR, "Error allocating the output packet\n");
 return ret;
 }
 
-bs = av_mallocz(sizeof(*bs));
-if (!bs) {
-av_packet_unref(&new_pkt);
+qsv_pkt.bs = av_mallocz(sizeof(*qsv_pkt.bs));
+if (!qsv_pkt.bs) {
+av_packet_unref(&qsv_pkt.new_pkt);
 return AVERROR(ENOMEM);
 }
-bs->Data  = new_pkt.data;
-bs->MaxLength = new_pkt.size;
+qsv_pkt.bs->Data  = qsv_pkt.new_pkt.data;
+qsv_pkt.bs->MaxLength = qsv_pkt.new_pkt.size;
 
 if (q->set_encode_ctrl_cb) {
 q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
 }
 
-sync = av_mallocz(sizeof(*sync));
-if (!sync) {
-av_freep(&bs);
-av_packet_unref(&new_pkt);
+qsv_pkt.syncp = av_mallocz(sizeof(*qsv_pkt.syncp));
+if (!qsv_pkt.syncp) {
+av_freep(&qsv_pkt.bs);
+av_packet_unref(&qsv_pkt.new_pkt);
 return AVERROR(ENOMEM);
 }
 
 do {
-ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, bs, 
sync);
+ret = MFXVideoENCODE_EncodeFrameAsync(q->session, enc_ctrl, surf, 
qsv_pkt.bs, qsv_pkt.syncp);
 if (ret == MFX_WRN_DEVICE_BUSY)
 av_usleep(500);
 } while (ret == MFX_WRN_DEVICE_BUSY || ret == MFX_WRN_IN_EXECUTION);
@@ -1038,9 +1049,7 @@ static int encode_frame(AVCodecContext *avctx, 
QSVEncContext *q,
 ff_qsv_print_warning(avctx, ret, "Warning during encoding");
 
 if (ret < 0) {
-av_packet_unref(&new_pkt);
-av_freep(&bs);
-av_freep(&sync);
+qsv_packet_release(&qsv_pkt);
 return (ret == MFX_ERR_MORE_DATA) ?
0 : ff_qsv_print_error(avctx, ret, "Error during encoding");
 }
@@ -1048,14 +1057,10 @@ static int encode_frame(AVCodecContext *avctx, 
QSVEncContext *q,
 if (ret == MFX_WRN_INCOMPATIBLE_VIDEO_PARAM && frame->interlaced_frame)
 print_interlace_msg(avctx, q);
 
-if (*sync) {
-av_fifo_generic_write(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL);
-av_fifo_generic_write(q->async_fifo, &sync,sizeof(sync),NULL);
-av_fifo_generic_write(q->async_fifo, &bs,  sizeof(bs),NULL);
+if (*qsv_pkt.syncp) {
+av_fifo_generic_write(q->async_fifo, &qsv_pkt, sizeof(qsv_pkt), NULL);
 } else {
-av_freep(&sync);
-av_packet_unref(&new_pkt);
-av_freep(&bs);
+qsv_packet_release(&qsv_pkt);
 }
 
 return 0;
@@ -1072,57 +1077,53 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext 
*q,
 
 if (!av_fifo_space(q->async_fifo) ||
 (!frame && av_fifo_size(q->async_fifo))) {
-AVPacket new_pkt;
-mfxBitstream *bs;
-mfxSyncPoint *sync;
+struct QSVpacket qsv_pkt;
 
-av_fifo_generic_read(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL);
-av_fifo_generic_read(q->async_fifo, &sync,sizeof(sync),NULL);
-av_fifo_generic_read(q->async_fifo, &bs,  sizeof(bs),  NULL);
+av_fifo_generic_read(q->async_fifo, &qsv_pkt, sizeof(qsv_pkt), NULL);
 
   

[FFmpeg-devel] [PATCH 1/4] qsv: fix the max payload size

2017-09-21 Thread Steve Lhomme
We only have one possible Payload for now: A53 CC
---
 libavcodec/qsv_internal.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index c0305508dd..5419db05be 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -32,7 +32,7 @@
 
 #define ASYNC_DEPTH_DEFAULT 4   // internal parallelism
 
-#define QSV_MAX_ENC_PAYLOAD 2   // # of mfxEncodeCtrl payloads supported
+#define QSV_MAX_ENC_PAYLOAD 1   // # of mfxEncodeCtrl payloads supported
 
 #define QSV_VERSION_ATLEAST(MAJOR, MINOR)   \
 (MFX_VERSION_MAJOR > (MAJOR) || \
-- 
2.12.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 4/4] qsvenc: use 'else' on exclusive code

2017-09-21 Thread Steve Lhomme
---
 libavcodec/qsvenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index bbf72e54b0..806cef5633 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -1048,7 +1048,7 @@ static int encode_frame(AVCodecContext *avctx, 
QSVEncContext *q,
 if (ret > 0)
 ff_qsv_print_warning(avctx, ret, "Warning during encoding");
 
-if (ret < 0) {
+else if (ret < 0) {
 qsv_packet_release(&qsv_pkt);
 return (ret == MFX_ERR_MORE_DATA) ?
0 : ff_qsv_print_error(avctx, ret, "Error during encoding");
-- 
2.12.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH] d3d11va: use the proper slice index

2016-10-10 Thread Steve Lhomme
Any comment on this ? We are waiting or this patch to proceed with the
related patch in VLC (because we need to rely on the proper revision).

It's been merged in libav with a slightly different commit text:

The decoding buffer index expected by D3D11VA is the one from the
ID3D11Texture2D not the one from the ID3D11VideoDecoderOutputView array
in AVD3D11VAContext.

Otherwise, when providing decoder slices that do not start from 0,
pictures appear in bogus order. For an invalid index crashes and
image corruption can occur.

On Wed, Oct 5, 2016 at 12:52 PM, Steve Lhomme  wrote:
> The slice index expected by D3D11VA is the one from the texture not from the
> array or texture/slices.
>
> In VLC the slices we provide the decoder don't start from 0 and thus pictures
> appear in bogus order. With possible crashes and corruptions when using an
> invalid index.
>
> --
> * forgot to bump the minor version
> * get rid of DXVA_CONTEXT_SURFACE
> * bump the minor version, not the macro
> ---
>  libavcodec/dxva2.c  | 12 +++-
>  libavcodec/dxva2_internal.h |  3 ---
>  libavcodec/version.h|  2 +-
>  3 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
> index f68df86..e168233 100644
> --- a/libavcodec/dxva2.c
> +++ b/libavcodec/dxva2.c
> @@ -42,8 +42,18 @@ unsigned ff_dxva2_get_surface_index(const AVCodecContext 
> *avctx,
>  unsigned i;
>
>  for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++)
> -if (DXVA_CONTEXT_SURFACE(avctx, ctx, i) == surface)
> +#if CONFIG_D3D11VA
> +if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && 
> ctx->d3d11va.surface[i] == surface)
> +{
> +D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
> +ID3D11VideoDecoderOutputView_GetDesc(ctx->d3d11va.surface[i], 
> &viewDesc);
> +return viewDesc.Texture2D.ArraySlice;
> +}
> +#endif
> +#if CONFIG_DXVA2
> +if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] 
> == surface)
>  return i;
> +#endif
>
>  assert(0);
>  return 0;
> diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
> index ad89f82..24adb99 100644
> --- a/libavcodec/dxva2_internal.h
> +++ b/libavcodec/dxva2_internal.h
> @@ -70,7 +70,6 @@ typedef union {
>  #if CONFIG_D3D11VA && CONFIG_DXVA2
>  #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.workaround : ctx->dxva2.workaround)
>  #define DXVA_CONTEXT_COUNT(avctx, ctx)  (avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.surface_count : 
> ctx->dxva2.surface_count)
> -#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.surface[i] : ctx->dxva2.surface[i])
>  #define DXVA_CONTEXT_DECODER(avctx, ctx)(avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.decoder : ctx->dxva2.decoder)
>  #define DXVA_CONTEXT_REPORT_ID(avctx, ctx)  (*(avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? &ctx->d3d11va.report_id : &ctx->dxva2.report_id))
>  #define DXVA_CONTEXT_CFG(avctx, ctx)(avctx->pix_fmt == 
> AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg : ctx->dxva2.cfg)
> @@ -80,7 +79,6 @@ typedef union {
>  #elif CONFIG_DXVA2
>  #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
>  #define DXVA_CONTEXT_COUNT(avctx, ctx)  (ctx->dxva2.surface_count)
> -#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (ctx->dxva2.surface[i])
>  #define DXVA_CONTEXT_DECODER(avctx, ctx)(ctx->dxva2.decoder)
>  #define DXVA_CONTEXT_REPORT_ID(avctx, ctx)  (*(&ctx->dxva2.report_id))
>  #define DXVA_CONTEXT_CFG(avctx, ctx)(ctx->dxva2.cfg)
> @@ -90,7 +88,6 @@ typedef union {
>  #elif CONFIG_D3D11VA
>  #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround)
>  #define DXVA_CONTEXT_COUNT(avctx, ctx)  (ctx->d3d11va.surface_count)
> -#define DXVA_CONTEXT_SURFACE(avctx, ctx, i) (ctx->d3d11va.surface[i])
>  #define DXVA_CONTEXT_DECODER(avctx, ctx)(ctx->d3d11va.decoder)
>  #define DXVA_CONTEXT_REPORT_ID(avctx, ctx)  (*(&ctx->d3d11va.report_id))
>  #define DXVA_CONTEXT_CFG(avctx, ctx)(ctx->d3d11va.cfg)
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index de7280f..a91595b 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,7 +29,7 @@
>
>  #define LIBAVCODEC_VERSION_MAJOR  57
>  #define LIBAVCODEC_VERSION_MINOR  60
> -#define LIBAVCODEC_VERSION_MICRO 101
> +#define LIBAVCODEC_VERSION_MICRO 102
>
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> LIBAVCODEC_VERSION_MINOR, \
> --
> 2.8.2
>
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/2] dxva2: make ff_dxva2_get_surface() static

2016-12-01 Thread Steve Lhomme
---
 libavcodec/dxva2.c  | 2 +-
 libavcodec/dxva2_internal.h | 2 --
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 04a9c11..a64b1b5 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -29,7 +29,7 @@
 #include "avcodec.h"
 #include "dxva2_internal.h"
 
-void *ff_dxva2_get_surface(const AVFrame *frame)
+static void *ff_dxva2_get_surface(const AVFrame *frame)
 {
 return frame->data[3];
 }
diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
index 24adb99..c962810 100644
--- a/libavcodec/dxva2_internal.h
+++ b/libavcodec/dxva2_internal.h
@@ -96,8 +96,6 @@ typedef union {
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigResidDiffAccelerator)
 #endif
 
-void *ff_dxva2_get_surface(const AVFrame *frame);
-
 unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
 const AVDXVAContext *,
 const AVFrame *frame);
-- 
2.10.1.windows.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 2/2] dxva2: get the slice number directly from the surface in D3D11VA

2016-12-01 Thread Steve Lhomme
No need to loop through the known surfaces, we'll use it anyway.

The loop is only done for DXVA2
---
 libavcodec/dxva2.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index a64b1b5..459e267 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -41,20 +41,20 @@ unsigned ff_dxva2_get_surface_index(const AVCodecContext 
*avctx,
 void *surface = ff_dxva2_get_surface(frame);
 unsigned i;
 
-for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) {
 #if CONFIG_D3D11VA
-if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && 
ctx->d3d11va.surface[i] == surface)
-{
-D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
-ID3D11VideoDecoderOutputView_GetDesc(ctx->d3d11va.surface[i], 
&viewDesc);
-return viewDesc.Texture2D.ArraySlice;
-}
+if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD)
+{
+D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
+ID3D11VideoDecoderOutputView_GetDesc((ID3D11VideoDecoderOutputView*) 
surface, &viewDesc);
+return viewDesc.Texture2D.ArraySlice;
+}
 #endif
 #if CONFIG_DXVA2
+for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) {
 if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] == 
surface)
 return i;
-#endif
 }
+#endif
 
 assert(0);
 return 0;
-- 
2.10.1.windows.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 2/2] dxva2: get the slice number directly from the surface in D3D11VA

2016-12-01 Thread Steve Lhomme
On Thu, Dec 1, 2016 at 3:43 PM, Hendrik Leppkes  wrote:
> On Thu, Dec 1, 2016 at 3:13 PM, Stève Lhomme  wrote:
>> I think I should update the minor version number as I need to rely on
>> this behaviour change in VLC, the surface array will be empty.
>>
>> Should I also change the headers so that they don't require the output
>> surface to be pre-allocated ?
>
> How does this end up being a behavior change? The commit doesn't make
> it sound like it would change anything but simplify the code.

Before this change the d3d11va.surface and d3d11va.surface_count could
not be NULL/0 respectively. They had to be filled. But with this
change it's not necessary anymore. We may even drop them in the
future.

I should investigate if the same thing is possible with D3D9 surfaces.

> Please document the changed behavior in the commit message, then.

OK

> - Hendrik
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 2/4] dxva2: use a single macro to test if the DXVA context is valid

2016-12-01 Thread Steve Lhomme
From: Steve Lhomme 

---
 libavcodec/dxva2_h264.c | 4 +---
 libavcodec/dxva2_hevc.c | 4 +---
 libavcodec/dxva2_internal.h | 5 +
 libavcodec/dxva2_mpeg2.c| 4 +---
 libavcodec/dxva2_vc1.c  | 4 +---
 libavcodec/dxva2_vp9.c  | 4 +---
 6 files changed, 10 insertions(+), 15 deletions(-)

diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c
index 82a772d..59fa5e3 100644
--- a/libavcodec/dxva2_h264.c
+++ b/libavcodec/dxva2_h264.c
@@ -450,9 +450,7 @@ static int dxva2_h264_start_frame(AVCodecContext *avctx,
 AVDXVAContext *ctx = avctx->hwaccel_context;
 struct dxva2_picture_context *ctx_pic = 
h->cur_pic_ptr->hwaccel_picture_private;
 
-if (DXVA_CONTEXT_DECODER(avctx, ctx) == NULL ||
-DXVA_CONTEXT_CFG(avctx, ctx) == NULL ||
-DXVA_CONTEXT_COUNT(avctx, ctx) <= 0)
+if (!DXVA_CONTEXT_VALID(avctx, ctx))
 return -1;
 assert(ctx_pic);
 
diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
index 5a312ea..981c888 100644
--- a/libavcodec/dxva2_hevc.c
+++ b/libavcodec/dxva2_hevc.c
@@ -364,9 +364,7 @@ static int dxva2_hevc_start_frame(AVCodecContext *avctx,
 AVDXVAContext *ctx = avctx->hwaccel_context;
 struct hevc_dxva2_picture_context *ctx_pic = 
h->ref->hwaccel_picture_private;
 
-if (DXVA_CONTEXT_DECODER(avctx, ctx) == NULL ||
-DXVA_CONTEXT_CFG(avctx, ctx) == NULL ||
-DXVA_CONTEXT_COUNT(avctx, ctx) <= 0)
+if (!DXVA_CONTEXT_VALID(avctx, ctx))
 return -1;
 av_assert0(ctx_pic);
 
diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
index c962810..e5322ef 100644
--- a/libavcodec/dxva2_internal.h
+++ b/libavcodec/dxva2_internal.h
@@ -76,6 +76,9 @@ typedef union {
 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx)  (avctx->pix_fmt == 
AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigBitstreamRaw : 
ctx->dxva2.cfg->ConfigBitstreamRaw)
 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) (avctx->pix_fmt == 
AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigIntraResidUnsigned : 
ctx->dxva2.cfg->ConfigIntraResidUnsigned)
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (avctx->pix_fmt == 
AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigResidDiffAccelerator : 
ctx->dxva2.cfg->ConfigResidDiffAccelerator)
+#define DXVA_CONTEXT_VALID(avctx, ctx)  (DXVA_CONTEXT_DECODER(avctx, 
ctx) && \
+ DXVA_CONTEXT_CFG(avctx, ctx) 
&& \
+ DXVA_CONTEXT_COUNT(avctx, 
ctx))
 #elif CONFIG_DXVA2
 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
 #define DXVA_CONTEXT_COUNT(avctx, ctx)  (ctx->dxva2.surface_count)
@@ -85,6 +88,7 @@ typedef union {
 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx)  
(ctx->dxva2.cfg->ConfigBitstreamRaw)
 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) 
(ctx->dxva2.cfg->ConfigIntraResidUnsigned)
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) 
(ctx->dxva2.cfg->ConfigResidDiffAccelerator)
+#define DXVA_CONTEXT_VALID(avctx, ctx)  (ctx->dxva2.decoder && 
ctx->dxva2.cfg && ctx->dxva2.surface_count)
 #elif CONFIG_D3D11VA
 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->d3d11va.workaround)
 #define DXVA_CONTEXT_COUNT(avctx, ctx)  (ctx->d3d11va.surface_count)
@@ -94,6 +98,7 @@ typedef union {
 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx)  
(ctx->d3d11va.cfg->ConfigBitstreamRaw)
 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigIntraResidUnsigned)
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigResidDiffAccelerator)
+#define DXVA_CONTEXT_VALID(avctx, ctx)  (ctx->d3d11va.decoder && 
ctx->d3d11va.cfg && ctx->d3d11va.surface_count)
 #endif
 
 unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
diff --git a/libavcodec/dxva2_mpeg2.c b/libavcodec/dxva2_mpeg2.c
index c2f0b58..14ac48f 100644
--- a/libavcodec/dxva2_mpeg2.c
+++ b/libavcodec/dxva2_mpeg2.c
@@ -262,9 +262,7 @@ static int dxva2_mpeg2_start_frame(AVCodecContext *avctx,
 struct dxva2_picture_context *ctx_pic =
 s->current_picture_ptr->hwaccel_picture_private;
 
-if (DXVA_CONTEXT_DECODER(avctx, ctx) == NULL ||
-DXVA_CONTEXT_CFG(avctx, ctx) == NULL ||
-DXVA_CONTEXT_COUNT(avctx, ctx) <= 0)
+if (!DXVA_CONTEXT_VALID(avctx, ctx))
 return -1;
 assert(ctx_pic);
 
diff --git a/libavcodec/dxva2_vc1.c b/libavcodec/dxva2_vc1.c
index 36bf1ba..cc97d7b 100644
--- a/libavcodec/dxva2_vc1.c
+++ b/libavcodec/dxva2_vc1.c
@@ -317,9 +317,7 @@ static int dxva2_vc1_start_frame(AVCodecContext *avctx,
 AVDXVAContext *ctx = avctx->hwaccel_context;
 struct dxva2_picture_context *ctx_pic = 
v->s.current_picture_ptr->hwaccel_picture_private;
 
-if (DXVA_CONTEXT_DECODER(avctx, ctx) == 

[FFmpeg-devel] [PATCH 3/4] dxva2: get the slice number directly from the surface in D3D11VA

2016-12-01 Thread Steve Lhomme
From: Steve Lhomme 

No need to loop through the known surfaces, we'll use it anyway.

The loop is only done for DXVA2
---
 libavcodec/dxva2.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index a64b1b5..459e267 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -41,20 +41,20 @@ unsigned ff_dxva2_get_surface_index(const AVCodecContext 
*avctx,
 void *surface = ff_dxva2_get_surface(frame);
 unsigned i;
 
-for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) {
 #if CONFIG_D3D11VA
-if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && 
ctx->d3d11va.surface[i] == surface)
-{
-D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
-ID3D11VideoDecoderOutputView_GetDesc(ctx->d3d11va.surface[i], 
&viewDesc);
-return viewDesc.Texture2D.ArraySlice;
-}
+if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD)
+{
+D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc;
+ID3D11VideoDecoderOutputView_GetDesc((ID3D11VideoDecoderOutputView*) 
surface, &viewDesc);
+return viewDesc.Texture2D.ArraySlice;
+}
 #endif
 #if CONFIG_DXVA2
+for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) {
 if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] == 
surface)
 return i;
-#endif
 }
+#endif
 
 assert(0);
 return 0;
-- 
2.10.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 1/4] dxva2: make ff_dxva2_get_surface() static

2016-12-01 Thread Steve Lhomme
From: Steve Lhomme 

---
 libavcodec/dxva2.c  | 2 +-
 libavcodec/dxva2_internal.h | 2 --
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 04a9c11..a64b1b5 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -29,7 +29,7 @@
 #include "avcodec.h"
 #include "dxva2_internal.h"
 
-void *ff_dxva2_get_surface(const AVFrame *frame)
+static void *ff_dxva2_get_surface(const AVFrame *frame)
 {
 return frame->data[3];
 }
diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
index 24adb99..c962810 100644
--- a/libavcodec/dxva2_internal.h
+++ b/libavcodec/dxva2_internal.h
@@ -96,8 +96,6 @@ typedef union {
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigResidDiffAccelerator)
 #endif
 
-void *ff_dxva2_get_surface(const AVFrame *frame);
-
 unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
 const AVDXVAContext *,
 const AVFrame *frame);
-- 
2.10.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 4/4] dxva2: allow an empty array of ID3D11VideoDecoderOutputView

2016-12-01 Thread Steve Lhomme
From: Steve Lhomme 

We can pick the correct slice index directly from the 
ID3D11VideoDecoderOutputView
casted from data[3].
---
 libavcodec/dxva2_internal.h | 4 ++--
 libavcodec/version.h| 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
index e5322ef..dfff4d6 100644
--- a/libavcodec/dxva2_internal.h
+++ b/libavcodec/dxva2_internal.h
@@ -78,7 +78,7 @@ typedef union {
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) (avctx->pix_fmt == 
AV_PIX_FMT_D3D11VA_VLD ? ctx->d3d11va.cfg->ConfigResidDiffAccelerator : 
ctx->dxva2.cfg->ConfigResidDiffAccelerator)
 #define DXVA_CONTEXT_VALID(avctx, ctx)  (DXVA_CONTEXT_DECODER(avctx, 
ctx) && \
  DXVA_CONTEXT_CFG(avctx, ctx) 
&& \
- DXVA_CONTEXT_COUNT(avctx, 
ctx))
+ (avctx->pix_fmt == 
AV_PIX_FMT_D3D11VA_VLD || ctx->dxva2.surface_count))
 #elif CONFIG_DXVA2
 #define DXVA_CONTEXT_WORKAROUND(avctx, ctx) (ctx->dxva2.workaround)
 #define DXVA_CONTEXT_COUNT(avctx, ctx)  (ctx->dxva2.surface_count)
@@ -98,7 +98,7 @@ typedef union {
 #define DXVA_CONTEXT_CFG_BITSTREAM(avctx, ctx)  
(ctx->d3d11va.cfg->ConfigBitstreamRaw)
 #define DXVA_CONTEXT_CFG_INTRARESID(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigIntraResidUnsigned)
 #define DXVA_CONTEXT_CFG_RESIDACCEL(avctx, ctx) 
(ctx->d3d11va.cfg->ConfigResidDiffAccelerator)
-#define DXVA_CONTEXT_VALID(avctx, ctx)  (ctx->d3d11va.decoder && 
ctx->d3d11va.cfg && ctx->d3d11va.surface_count)
+#define DXVA_CONTEXT_VALID(avctx, ctx)  (ctx->d3d11va.decoder && 
ctx->d3d11va.cfg)
 #endif
 
 unsigned ff_dxva2_get_surface_index(const AVCodecContext *avctx,
diff --git a/libavcodec/version.h b/libavcodec/version.h
index c28867a..69aae45 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
 
 #define LIBAVCODEC_VERSION_MAJOR  57
 #define LIBAVCODEC_VERSION_MINOR  66
-#define LIBAVCODEC_VERSION_MICRO 108
+#define LIBAVCODEC_VERSION_MICRO 109
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
-- 
2.10.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] ffmpeg: add ffmpeg_d3d11va

2016-12-13 Thread Steve Lhomme
From: Steve Lhomme 

The code is similar to ffmpeg_dxva2. The decoded output needs to be copied into
a staging texture that can be accessed by the CPU as the decoder texture can't
be accessed by the CPU.
---
 Makefile   |   1 +
 configure  |  14 ++
 ffmpeg.h   |   2 +
 ffmpeg_d3d11va.c   | 416 +++
 ffmpeg_opt.c   |   3 +
 libavutil/Makefile |   3 +
 libavutil/hwcontext.c  |   3 +
 libavutil/hwcontext.h  |   1 +
 libavutil/hwcontext_d3d11va.c  | 436 +
 libavutil/hwcontext_d3d11va.h  |  74 +++
 libavutil/hwcontext_internal.h |   1 +
 libavutil/version.h|   2 +-
 12 files changed, 955 insertions(+), 1 deletion(-)
 create mode 100644 ffmpeg_d3d11va.c
 create mode 100644 libavutil/hwcontext_d3d11va.c
 create mode 100644 libavutil/hwcontext_d3d11va.h

diff --git a/Makefile b/Makefile
index 8aa72fd..a48d471 100644
--- a/Makefile
+++ b/Makefile
@@ -38,6 +38,7 @@ OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_videotoolbox.o
 endif
 OBJS-ffmpeg-$(CONFIG_CUVID)   += ffmpeg_cuvid.o
 OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
+OBJS-ffmpeg-$(HAVE_D3D11VA_LIB) += ffmpeg_d3d11va.o
 OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
 OBJS-ffserver += ffserver_config.o
 
diff --git a/configure b/configure
index 9dfd006..dea8339 100755
--- a/configure
+++ b/configure
@@ -2050,6 +2050,8 @@ HAVE_LIST="
 $TYPES_LIST
 atomics_native
 dos_paths
+d3d11va_lib
+d3d11vaapi_cobj
 dxva2_lib
 dxva2api_cobj
 libc_msvcrt
@@ -6037,6 +6039,15 @@ enabled dxva2api_h &&
 int main(void) { IDirectXVideoDecoder *o = NULL; 
IDirectXVideoDecoder_Release(o); return 0; }
 EOF
 
+enabled d3d11_h &&
+check_cc <
+#include 
+int main(void) { ID3D11VideoDevice *o = NULL; ID3D11VideoDevice_Release(o); 
return 0; }
+EOF
+
 enabled vaapi &&
 check_lib va/va.h vaInitialize -lva ||
 disable vaapi
@@ -6368,6 +6379,9 @@ if test $target_os = "haiku"; then
 disable posix_memalign
 fi
 
+enabled_all d3d11va d3d11vaapi_cobj &&
+enable d3d11va_lib
+
 enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
 prepend ffmpeg_libs $($ldflags_filter "-lole32") &&
 enable dxva2_lib
diff --git a/ffmpeg.h b/ffmpeg.h
index ebe5bf0..a12701e 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -61,6 +61,7 @@ enum HWAccelID {
 HWACCEL_NONE = 0,
 HWACCEL_AUTO,
 HWACCEL_VDPAU,
+HWACCEL_D3D11VA,
 HWACCEL_DXVA2,
 HWACCEL_VDA,
 HWACCEL_VIDEOTOOLBOX,
@@ -633,6 +634,7 @@ int ifilter_parameters_from_decoder(InputFilter *ifilter, 
const AVCodecContext *
 int ffmpeg_parse_options(int argc, char **argv);
 
 int vdpau_init(AVCodecContext *s);
+int d3d11va_init(AVCodecContext *s);
 int dxva2_init(AVCodecContext *s);
 int vda_init(AVCodecContext *s);
 int videotoolbox_init(AVCodecContext *s);
diff --git a/ffmpeg_d3d11va.c b/ffmpeg_d3d11va.c
new file mode 100644
index 000..f6f8186
--- /dev/null
+++ b/ffmpeg_d3d11va.c
@@ -0,0 +1,416 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include 
+
+#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+#endif
+#define COBJMACROS
+
+#include 
+
+#include 
+
+#include "ffmpeg.h"
+
+#include "libavcodec/d3d11va.h"
+
+#include "libavutil/avassert.h"
+#include "libavutil/buffer.h"
+#include "libavutil/frame.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/pixfmt.h"
+
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_d3d11va.h"
+
+/* define all the GUIDs used directly here,
+   to avoid problems with inconsistent dxva2api.h versions in mingw-w64 and 
different MSVC version */
+#include 
+DEFINE_GUID(DXVA2_ModeMPEG2_VLD,  0xee27417f, 
0x5e28,0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);
+DEFINE_GUID(DXVA2_ModeMPEG2and1_VLD,  0x86695f12, 
0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);
+DEFINE_GUID(DXVA2_ModeH264_E, 0x1b81be68, 
0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,

[FFmpeg-devel] [PATCH] configure: use -O1 with MSVC by default

2016-12-13 Thread Steve Lhomme
From: Steve Lhomme 

Otherwise some ARM and other unsupported CPU is linked with -O0
---
 configure | 1 +
 1 file changed, 1 insertion(+)

diff --git a/configure b/configure
index 9dfd006..d623ced 100755
--- a/configure
+++ b/configure
@@ -4087,6 +4087,7 @@ probe_cc(){
 _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
 _cflags_speed="-O2"
 _cflags_size="-O1"
+_cflags_noopt="-O1"
 if $_cc -nologo- 2>&1 | grep -q Linker; then
 _ld_o='-out:$@'
 else
-- 
2.10.2

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] ffmpeg: add ffmpeg_d3d11va

2016-12-13 Thread Steve Lhomme
From: Steve Lhomme 

The code is similar to ffmpeg_dxva2. The decoded output needs to be copied into
a staging texture that can be accessed by the CPU as the decoder texture can't
be accessed by the CPU.
---
 Makefile   |   1 +
 configure  |  14 ++
 ffmpeg.h   |   2 +
 ffmpeg_d3d11va.c   | 416 +++
 ffmpeg_opt.c   |   3 +
 libavutil/Makefile |   3 +
 libavutil/hwcontext.c  |   3 +
 libavutil/hwcontext.h  |   1 +
 libavutil/hwcontext_d3d11va.c  | 436 +
 libavutil/hwcontext_d3d11va.h  |  74 +++
 libavutil/hwcontext_internal.h |   1 +
 libavutil/version.h|   2 +-
 12 files changed, 955 insertions(+), 1 deletion(-)
 create mode 100644 ffmpeg_d3d11va.c
 create mode 100644 libavutil/hwcontext_d3d11va.c
 create mode 100644 libavutil/hwcontext_d3d11va.h

diff --git a/Makefile b/Makefile
index 8aa72fd..a48d471 100644
--- a/Makefile
+++ b/Makefile
@@ -38,6 +38,7 @@ OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_videotoolbox.o
 endif
 OBJS-ffmpeg-$(CONFIG_CUVID)   += ffmpeg_cuvid.o
 OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
+OBJS-ffmpeg-$(HAVE_D3D11VA_LIB) += ffmpeg_d3d11va.o
 OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
 OBJS-ffserver += ffserver_config.o
 
diff --git a/configure b/configure
index 9dfd006..dea8339 100755
--- a/configure
+++ b/configure
@@ -2050,6 +2050,8 @@ HAVE_LIST="
 $TYPES_LIST
 atomics_native
 dos_paths
+d3d11va_lib
+d3d11vaapi_cobj
 dxva2_lib
 dxva2api_cobj
 libc_msvcrt
@@ -6037,6 +6039,15 @@ enabled dxva2api_h &&
 int main(void) { IDirectXVideoDecoder *o = NULL; 
IDirectXVideoDecoder_Release(o); return 0; }
 EOF
 
+enabled d3d11_h &&
+check_cc <
+#include 
+int main(void) { ID3D11VideoDevice *o = NULL; ID3D11VideoDevice_Release(o); 
return 0; }
+EOF
+
 enabled vaapi &&
 check_lib va/va.h vaInitialize -lva ||
 disable vaapi
@@ -6368,6 +6379,9 @@ if test $target_os = "haiku"; then
 disable posix_memalign
 fi
 
+enabled_all d3d11va d3d11vaapi_cobj &&
+enable d3d11va_lib
+
 enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
 prepend ffmpeg_libs $($ldflags_filter "-lole32") &&
 enable dxva2_lib
diff --git a/ffmpeg.h b/ffmpeg.h
index ebe5bf0..a12701e 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -61,6 +61,7 @@ enum HWAccelID {
 HWACCEL_NONE = 0,
 HWACCEL_AUTO,
 HWACCEL_VDPAU,
+HWACCEL_D3D11VA,
 HWACCEL_DXVA2,
 HWACCEL_VDA,
 HWACCEL_VIDEOTOOLBOX,
@@ -633,6 +634,7 @@ int ifilter_parameters_from_decoder(InputFilter *ifilter, 
const AVCodecContext *
 int ffmpeg_parse_options(int argc, char **argv);
 
 int vdpau_init(AVCodecContext *s);
+int d3d11va_init(AVCodecContext *s);
 int dxva2_init(AVCodecContext *s);
 int vda_init(AVCodecContext *s);
 int videotoolbox_init(AVCodecContext *s);
diff --git a/ffmpeg_d3d11va.c b/ffmpeg_d3d11va.c
new file mode 100644
index 000..f6f8186
--- /dev/null
+++ b/ffmpeg_d3d11va.c
@@ -0,0 +1,416 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include 
+
+#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+#endif
+#define COBJMACROS
+
+#include 
+
+#include 
+
+#include "ffmpeg.h"
+
+#include "libavcodec/d3d11va.h"
+
+#include "libavutil/avassert.h"
+#include "libavutil/buffer.h"
+#include "libavutil/frame.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/pixfmt.h"
+
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_d3d11va.h"
+
+/* define all the GUIDs used directly here,
+   to avoid problems with inconsistent dxva2api.h versions in mingw-w64 and 
different MSVC version */
+#include 
+DEFINE_GUID(DXVA2_ModeMPEG2_VLD,  0xee27417f, 
0x5e28,0x4e65,0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9);
+DEFINE_GUID(DXVA2_ModeMPEG2and1_VLD,  0x86695f12, 
0x340e,0x4f04,0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60);
+DEFINE_GUID(DXVA2_ModeH264_E, 0x1b81be68, 
0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,

  1   2   3   >