mirror of https://github.com/mpv-player/mpv
demux/packet: add support for ITU T.35 metadata in Matroska
This commit is contained in:
parent
4f828676fd
commit
b68c742b27
|
@ -78,6 +78,9 @@ struct ebml_parse_ctx {
|
||||||
#define EBML_UINT_INVALID UINT64_MAX
|
#define EBML_UINT_INVALID UINT64_MAX
|
||||||
#define EBML_INT_INVALID INT64_MAX
|
#define EBML_INT_INVALID INT64_MAX
|
||||||
|
|
||||||
|
/* Block Addition Mappings */
|
||||||
|
#define MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35 4
|
||||||
|
|
||||||
bool ebml_is_mkv_level1_id(uint32_t id);
|
bool ebml_is_mkv_level1_id(uint32_t id);
|
||||||
uint32_t ebml_read_id (stream_t *s);
|
uint32_t ebml_read_id (stream_t *s);
|
||||||
uint64_t ebml_read_length (stream_t *s);
|
uint64_t ebml_read_length (stream_t *s);
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
|
#include <libavutil/hdr_dynamic_metadata.h>
|
||||||
#include <libavutil/intreadwrite.h>
|
#include <libavutil/intreadwrite.h>
|
||||||
|
|
||||||
#include "common/av_common.h"
|
#include "common/av_common.h"
|
||||||
#include "common/common.h"
|
#include "common/common.h"
|
||||||
#include "demux.h"
|
#include "demux.h"
|
||||||
|
#include "demux/ebml.h"
|
||||||
|
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
|
@ -232,6 +234,54 @@ int demux_packet_add_blockadditional(struct demux_packet *dp, uint64_t id,
|
||||||
{
|
{
|
||||||
if (!dp->avpacket)
|
if (!dp->avpacket)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
switch (id) {
|
||||||
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 5, 100)
|
||||||
|
case MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35: {
|
||||||
|
static const uint8_t ITU_T_T35_COUNTRY_CODE_US = 0xB5;
|
||||||
|
static const uint16_t ITU_T_T35_PROVIDER_CODE_SMTPE = 0x3C;
|
||||||
|
|
||||||
|
if (size < 6)
|
||||||
|
break;
|
||||||
|
|
||||||
|
uint8_t *p = data;
|
||||||
|
|
||||||
|
uint8_t country_code = AV_RB8(p);
|
||||||
|
p += sizeof(country_code);
|
||||||
|
uint16_t provider_code = AV_RB16(p);
|
||||||
|
p += sizeof(provider_code);
|
||||||
|
|
||||||
|
if (country_code != ITU_T_T35_COUNTRY_CODE_US ||
|
||||||
|
provider_code != ITU_T_T35_PROVIDER_CODE_SMTPE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
uint16_t provider_oriented_code = AV_RB16(p);
|
||||||
|
p += sizeof(provider_oriented_code);
|
||||||
|
uint8_t application_identifier = AV_RB8(p);
|
||||||
|
p += sizeof(application_identifier);
|
||||||
|
|
||||||
|
if (provider_oriented_code != 1 || application_identifier != 4)
|
||||||
|
break;
|
||||||
|
|
||||||
|
size_t hdrplus_size;
|
||||||
|
AVDynamicHDRPlus *hdrplus = av_dynamic_hdr_plus_alloc(&hdrplus_size);
|
||||||
|
MP_HANDLE_OOM(hdrplus);
|
||||||
|
|
||||||
|
if (av_dynamic_hdr_plus_from_t35(hdrplus, p, size - (p - (uint8_t *)data)) < 0 ||
|
||||||
|
av_packet_add_side_data(dp->avpacket, AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
|
||||||
|
(uint8_t *)hdrplus, hdrplus_size) < 0)
|
||||||
|
{
|
||||||
|
av_free(hdrplus);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t *sd = av_packet_new_side_data(dp->avpacket,
|
uint8_t *sd = av_packet_new_side_data(dp->avpacket,
|
||||||
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
|
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
|
||||||
8 + size);
|
8 + size);
|
||||||
|
|
Loading…
Reference in New Issue