87#define XMP_GCONTAINER_MAX_LEN 1024
96 "number of dependents reached (%d).\n",
img->index,
base->index,
122 if (
base->index != 0) {
124 "be the primary image (stream 0), got stream %d\n",
131 "as %s for a different stream group.\n", sg->
index, gain->
index,
136 for (
int i = 0;
i <
base->nb_rev_deps;
i++) {
140 "specified as a gain map for stream %d.\n", sg->
index,
155 if (
ctx->nb_streams < 2)
162 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
165 img->start =
img->end = -1;
167 img->ext_size[n] = -1;
176 for (
unsigned i = 0;
i <
ctx->nb_stream_groups;
i++) {
191 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
214#define CHECK_IDENT(strc) (len >= sizeof(strc) && !memcmp(gb->buffer, strc, sizeof(strc)))
220 "APP2 segments\n",
img->index);
226 "short\n",
img->index);
243 if (
img->packet->size) {
251 bytestream2_get_be16(&gb) != (0xFF00 |
SOI))
260 if (bytestream2_get_byte(&gb) != 0xFF) {
266 int marker = bytestream2_get_byte(&gb);
267 while (marker == 0xFF)
268 marker = bytestream2_get_byte(&gb);
269 if (marker ==
SOS || marker ==
TEM || (marker >=
RST0 && marker <=
EOI)) {
270 if (!
img->splice_pos)
275 int len = bytestream2_get_be16(&gb) - 2;
278 "0x%x\n",
img->index,
pos);
298 if (!
img->splice_pos)
309 if (!
img->splice_pos) {
317 "but is missing ISO 21496-1 metadata\n",
img->index);
334#define XMP_GCONTAINER_TEMPLATE \
335 "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 5.1.2\">\n" \
336 " <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" \
337 " <rdf:Description\n" \
338 " xmlns:Container=\"" XMP_CONTAINER_NS "\"\n" \
339 " xmlns:Item=\"" XMP_ITEM_NS "\"\n" \
340 " xmlns:hdrgm=\"" FF_GAIN_MAP_XMP_NAMESPACE "\"\n" \
341 " hdrgm:Version=\"1.0\">\n" \
342 " <Container:Directory>\n" \
344 " <rdf:li rdf:parseType=\"Resource\">\n" \
345 " <Container:Item\n" \
346 " Item:Semantic=\"Primary\"\n" \
347 " Item:Mime=\"image/jpeg\"/>\n" \
349 " <rdf:li rdf:parseType=\"Resource\">\n" \
350 " <Container:Item\n" \
351 " Item:Semantic=\"GainMap\"\n" \
352 " Item:Mime=\"image/jpeg\"\n" \
353 " Item:Length=\"%d\"/>\n" \
356 " </Container:Directory>\n" \
357 " </rdf:Description>\n" \
362 "XMP buffer too small for template and values");
369 for (
int i = 0;
i <
base->nb_rev_deps;
i++) {
371 gain =
base->rev_deps[
i];
379 "packet; omitting the GContainer directory, as a JPEG file may "
380 "only contain one.\n");
384 int ret = snprintf(
s->xmp_gcontainer,
sizeof(
s->xmp_gcontainer),
421#define RELPOS(x) (avio_tell(pb) - base - tiff_base + (x))
427 const int nb_tags = 3;
443 const int64_t entry_size =
sizeof(
int32_t[3]) +
sizeof(int16_t[2]);
450 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
455 if (
entry->nb_rev_deps)
492 sizeof(uint16_t[2]));
509 if (
ctx->nb_streams > 1) {
517 for (
int i = 0;
i <
img->nb_rev_deps;
i++) {
519 switch (rdep->
role) {
535 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
555 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
556 if (!
s->images[
i].packet->size) {
576 for (
int i = 0;
i <
ctx->nb_streams;
i++) {
579 if (
img->ext_size[j] > UINT16_MAX) {
581 "large (%"PRId64
" bytes)\n",
img->index, j,
img->ext_size[j]);
596 for (
int i = 0;
i <
ctx->nb_streams;
i++)
603 .p.name =
"jpeg_mpf",
605 .p.mime_type =
"image/jpeg",
606 .p.extensions =
"jpg,jpeg",
static double val(void *priv, double ch)
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void avio_w8(AVIOContext *s, int b)
void avio_wb32(AVIOContext *s, unsigned int val)
void avio_wb16(AVIOContext *s, unsigned int val)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
int ffio_open_null_buf(AVIOContext **s)
Open a write-only fake memory stream.
int ffio_close_null_buf(AVIOContext *s)
Close a null buffer.
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static av_always_inline int bytestream2_tell(const GetByteContext *g)
#define i(width, name, range_min, range_max)
#define EOI
End Of Image marker.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
char * av_strnstr(const char *haystack, const char *needle, size_t hay_length)
Locate the first occurrence of the string needle in the string haystack where not more than hay_lengt...
Shared definitions for JPEG Multi-Picture Format (CIPA DC-007).
static int mpf_build_gcontainer_xmp(AVFormatContext *ctx)
static int mpf_write_packet(AVFormatContext *ctx, AVPacket *pkt)
static int mpf_write_trailer(AVFormatContext *ctx)
static int register_dep(AVFormatContext *ctx, MPFImage *img, MPFImage *base)
static int mpf_write(AVFormatContext *ctx, AVIOContext *pb)
static int mpf_write_index(AVFormatContext *ctx, AVIOContext *pb, int64_t base, MPFImage *img)
static int init_gain_map(AVFormatContext *ctx, const AVStreamGroup *sg)
static void mpf_write_xmp(AVFormatContext *ctx, AVIOContext *pb, MPFImage *img)
#define XMP_GCONTAINER_TEMPLATE
static const struct @351235250060104351276150033220250051201364246176 mpf_roles[MPF_ROLE_NB]
#define XMP_GCONTAINER_MAX_LEN
static void parse_app1(MPFImage *img, const GetByteContext *gb, int len)
static int mpf_write_extensions(AVFormatContext *ctx, AVIOContext *pb, int64_t base, MPFImage *img)
#define CHECK_IDENT(strc)
static int parse_app2(AVFormatContext *ctx, MPFImage *img, const GetByteContext *gb, int len)
static void update_offset(AVIOContext *pb, int64_t base, int64_t *offset)
static int mpf_init(AVFormatContext *ctx)
static void mpf_write_iso21496(AVIOContext *pb, MPFImage *src)
static void mpf_uninit(AVFormatContext *ctx)
Serialization of AVGainMapParams into the metadata blobs that image formats carry it in,...
#define FF_GAIN_MAP_XMP_IDENT
#define FF_GAIN_MAP_XMP_NAMESPACE
#define AV_ISO21496_IDENTIFIER
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
MJPEG encoder and decoder.
#define FF_OFMT_FLAG_ONLY_DEFAULT_CODECS
If this flag is set, then the only permitted audio/video/subtitle codec ids are AVOutputFormat....
#define FF_ARRAY_ELEMS(a)
This structure stores compressed data.
enum AVStreamGroupEntryType type
AVStreamGroupLayeredVideo is meant to define the relation between a base layer video stream and a sep...
unsigned int el_index
Index of the enhancement layer stream in AVStreamGroup.
unsigned int nb_entries
Number of elements in AVStreamGroup.entries.
enum AVStreamGroupParamsType type
Group type.
AVStreamGroupEntry ** entries
A list of streams or child groups in the group.
unsigned int index
Group index in AVFormatContext.
union AVStreamGroup::@313244315204024013007202273061153315146016101155 params
Group type-specific parameters.
struct AVStreamGroupLayeredVideo * layered_video
int index
stream index in AVFormatContext
int64_t ext_size[MPF_EXT_NB]
char xmp_gcontainer[1024]