13
0

Update libaaf to v1.0-11-gb04c547

This commit is contained in:
agfline 2024-04-17 23:56:57 +02:00 committed by Robin Gareus
parent 895fe2f753
commit 41587d3c06
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
16 changed files with 158 additions and 101 deletions

View File

@ -1951,8 +1951,8 @@ retrieveProperty (AAF_Data* aafd, aafObject* Obj, aafPropertyDef* Def, aafProper
Prop->sf = p->_storedForm; Prop->sf = p->_storedForm;
/* /*
TODO Prop->len / Prop->val ---> retrieveStrongReference() retrieveStrongReferenceSet() retrieveStrongReferenceVector() TODO Prop->len / Prop->val ---> retrieveStrongReference() retrieveStrongReferenceSet() retrieveStrongReferenceVector()
only used to retrieve node name ? There could be a better approach. only used to retrieve node name ? There could be a better approach.
*/ */
Prop->len = p->_length; Prop->len = p->_length;
@ -2127,18 +2127,18 @@ getNodeProperties (AAF_Data* aafd, cfbNode* Node)
*/ */
/* /*
uint32_t prop_sz = sizeof(aafPropertyIndexHeader_t); uint32_t prop_sz = sizeof(aafPropertyIndexHeader_t);
uint32_t i = 0; uint32_t i = 0;
for ( i = 0; i < ((aafPropertyIndexHeader_t*)stream)->_entryCount; i++ ) for ( i = 0; i < ((aafPropertyIndexHeader_t*)stream)->_entryCount; i++ )
prop_sz += (((aafPropertyIndexEntry_t*)(stream+((sizeof(aafPropertyIndexEntry_t)*i)+sizeof(aafPropertyIndexHeader_t))))->_length) + sizeof(aafPropertyIndexEntry_t); prop_sz += (((aafPropertyIndexEntry_t*)(stream+((sizeof(aafPropertyIndexEntry_t)*i)+sizeof(aafPropertyIndexHeader_t))))->_length) + sizeof(aafPropertyIndexEntry_t);
if ( prop_sz != stream_sz ) if ( prop_sz != stream_sz )
warning( L"Stream length (%lu Bytes) does not match property length (%u Bytes).", warning( L"Stream length (%lu Bytes) does not match property length (%u Bytes).",
stream_sz, stream_sz,
prop_sz ); prop_sz );
*/ */
return stream; return stream;
} }

View File

@ -131,7 +131,7 @@ aaf_dump_TaggedValueSet (AAF_Data* aafd, aafObject* ObjCollection, const char* p
ANSI_COLOR_DARKGREY (log), ANSI_COLOR_DARKGREY (log),
(name) ? name : "<unknown>", (name) ? name : "<unknown>",
ANSI_COLOR_RESET (log), ANSI_COLOR_RESET (log),
(name) ? (size_t) (34 - (int)strlen (name)) : (size_t) (34 - strlen ("<unknown>")), " ", (name) ? (size_t)(34 - (int)strlen (name)) : (size_t)(34 - strlen ("<unknown>")), " ",
ANSI_COLOR_DARKGREY (log), ANSI_COLOR_DARKGREY (log),
aaft_TypeIDToText (&indirect->TypeDef), aaft_TypeIDToText (&indirect->TypeDef),
ANSI_COLOR_RESET (log), ANSI_COLOR_RESET (log),

View File

@ -888,3 +888,44 @@ externalAudioDataReaderCallback (unsigned char* buf, size_t offset, size_t reqle
return byteRead; return byteRead;
} }
aafiAudioEssencePointer*
aafi_audioEssencePointer_exists_before (AAF_Iface* aafi, aafiAudioEssencePointer* audioEssencePointerList)
{
aafiAudioTrack* at = NULL;
aafiTimelineItem* ai = NULL;
aafiAudioClip* ac = NULL;
aafiAudioEssencePointer* aep1 = NULL;
aafiAudioEssencePointer* aep2 = NULL;
AAFI_foreachAudioTrack (aafi, at)
{
AAFI_foreachTrackItem (at, ai)
{
if (ai->type != AAFI_AUDIO_CLIP) {
continue;
}
ac = (aafiAudioClip*)ai->data;
aep1 = audioEssencePointerList;
int found = 1;
AAFI_foreachEssencePointer (ac->essencePointerList, aep2)
{
if (!aep1 || aep1->essenceFile != aep2->essenceFile || aep1->essenceChannel != aep2->essenceChannel) {
found = 0;
break;
}
aep1 = aep1->next;
}
if (found && aep1 == NULL) {
return ac->essencePointerList;
}
}
}
return NULL;
}

View File

@ -3166,12 +3166,23 @@ aafi_retrieveData (AAF_Iface* aafi)
AAFI_foreachTrackItem (audioTrack, audioItem) AAFI_foreachTrackItem (audioTrack, audioItem)
{ {
if (audioItem->type == AAFI_TRANS) { if (audioItem->type != AAFI_AUDIO_CLIP) {
continue; continue;
} }
audioClip = (aafiAudioClip*)audioItem->data; audioClip = (aafiAudioClip*)audioItem->data;
audioClip->channels = aafi_getAudioEssencePointerChannelCount (audioClip->essencePointerList); audioClip->channels = aafi_getAudioEssencePointerChannelCount (audioClip->essencePointerList);
/*
* we check if any previous clip is using the exact same essence pointer,
* to avoid duplication and allow to detect when multiple clips are using
* the same essence.
*/
aafiAudioEssencePointer* prev = aafi_audioEssencePointer_exists_before (aafi, audioClip->essencePointerList);
if (prev) {
audioClip->essencePointerList = prev;
}
} }
} }

View File

@ -214,6 +214,12 @@ aafi_release (AAF_Iface** aafi)
aafi_freeAudioTracks (&(*aafi)->Audio->Tracks); aafi_freeAudioTracks (&(*aafi)->Audio->Tracks);
aafi_freeAudioEssences (&(*aafi)->Audio->essenceFiles); aafi_freeAudioEssences (&(*aafi)->Audio->essenceFiles);
aafiAudioEssencePointer* essencePointer = (*aafi)->Audio->essencePointerList;
while (essencePointer) {
essencePointer = aafi_freeAudioEssencePointer (essencePointer);
}
free ((*aafi)->Audio); free ((*aafi)->Audio);
} }
@ -358,7 +364,7 @@ aafi_convertUnit (aafPosition_t value, aafRational_t* valueEditRate, aafRational
return 0; return 0;
} }
return (aafPosition_t) ((double)value * (destEditRateFloat / valueEditRateFloat)); return (aafPosition_t)((double)value * (destEditRateFloat / valueEditRateFloat));
} }
uint64_t uint64_t
@ -391,7 +397,7 @@ aafi_convertUnitUint64 (aafPosition_t value, aafRational_t* valueEditRate, aafRa
return 0; return 0;
} }
return (uint64_t) ((double)value * (destEditRateFloat / valueEditRateFloat)); return (uint64_t)((double)value * (destEditRateFloat / valueEditRateFloat));
} }
int int
@ -506,8 +512,8 @@ aafi_applyGainOffset (AAF_Iface* aafi, aafiAudioGain** gain, aafiAudioGain* offs
* is the same accross all gains in file. Thus, we devide both gain numbers * is the same accross all gains in file. Thus, we devide both gain numbers
* by offset denominator, so we fit inside uint32_t. * by offset denominator, so we fit inside uint32_t.
*/ */
(*gain)->value[i].numerator = (int32_t) (((int64_t) (*gain)->value[i].numerator * (int64_t)offset->value[0].numerator) / (int64_t)offset->value[0].denominator); (*gain)->value[i].numerator = (int32_t)(((int64_t)(*gain)->value[i].numerator * (int64_t)offset->value[0].numerator) / (int64_t)offset->value[0].denominator);
(*gain)->value[i].denominator = (int32_t) (((int64_t) (*gain)->value[i].denominator * (int64_t)offset->value[0].denominator) / (int64_t)offset->value[0].denominator); (*gain)->value[i].denominator = (int32_t)(((int64_t)(*gain)->value[i].denominator * (int64_t)offset->value[0].denominator) / (int64_t)offset->value[0].denominator);
// debug( "Setting (*gain)->value[%i] = %i/%i * %i/%i", // debug( "Setting (*gain)->value[%i] = %i/%i * %i/%i",
// i, // i,
// (*gain)->value[i].numerator, // (*gain)->value[i].numerator,
@ -798,11 +804,11 @@ aafi_newAudioEssencePointer (AAF_Iface* aafi, aafiAudioEssencePointer** list, aa
last->next = essencePointer; last->next = essencePointer;
} else { } else {
*list = essencePointer; *list = essencePointer;
essencePointer->aafiNext = aafi->Audio->essencePointerList;
aafi->Audio->essencePointerList = essencePointer;
} }
essencePointer->aafiNext = aafi->Audio->essencePointerList;
aafi->Audio->essencePointerList = essencePointer;
return *list; return *list;
} }
@ -985,8 +991,6 @@ aafi_freeAudioClip (aafiAudioClip* audioClip)
aafi_freeAudioGain (audioClip->automation); aafi_freeAudioGain (audioClip->automation);
aafi_freeMetadata (&(audioClip->metadata)); aafi_freeMetadata (&(audioClip->metadata));
aafi_freeAudioEssencePointer (audioClip->essencePointerList);
free (audioClip); free (audioClip);
} }
@ -1042,16 +1046,14 @@ aafi_freeMetadata (aafiMetaData** CommentList)
*CommentList = NULL; *CommentList = NULL;
} }
void aafiAudioEssencePointer*
aafi_freeAudioEssencePointer (aafiAudioEssencePointer* essencePointer) aafi_freeAudioEssencePointer (aafiAudioEssencePointer* essencePointer)
{ {
aafiAudioEssencePointer* next = NULL; aafiAudioEssencePointer* next = essencePointer->aafiNext;
while (essencePointer) { free (essencePointer);
next = essencePointer->next;
free (essencePointer); return next;
essencePointer = next;
}
} }
void void

View File

@ -1912,19 +1912,19 @@ aaft_PIDToText (AAF_Data* aafd, aafPID_t pid)
return "PID_BWFImportDescriptor_UnknownBWFChunks"; return "PID_BWFImportDescriptor_UnknownBWFChunks";
/* the following is marked as "dynamic" in ref implementation : /* the following is marked as "dynamic" in ref implementation :
* AAF/ref-impl/include/ref-api/AAFTypes.h * AAF/ref-impl/include/ref-api/AAFTypes.h
* *
* case PID_MPEGVideoDescriptor_SingleSequence: * case PID_MPEGVideoDescriptor_SingleSequence:
* case PID_MPEGVideoDescriptor_ConstantBPictureCount: * case PID_MPEGVideoDescriptor_ConstantBPictureCount:
* case PID_MPEGVideoDescriptor_CodedContentScanning: * case PID_MPEGVideoDescriptor_CodedContentScanning:
* case PID_MPEGVideoDescriptor_LowDelay: * case PID_MPEGVideoDescriptor_LowDelay:
* case PID_MPEGVideoDescriptor_ClosedGOP: * case PID_MPEGVideoDescriptor_ClosedGOP:
* case PID_MPEGVideoDescriptor_IdenticalGOP: * case PID_MPEGVideoDescriptor_IdenticalGOP:
* case PID_MPEGVideoDescriptor_MaxGOP: * case PID_MPEGVideoDescriptor_MaxGOP:
* case PID_MPEGVideoDescriptor_MaxBPictureCount: * case PID_MPEGVideoDescriptor_MaxBPictureCount:
* case PID_MPEGVideoDescriptor_BitRate: * case PID_MPEGVideoDescriptor_BitRate:
* case PID_MPEGVideoDescriptor_ProfileAndLevel: * case PID_MPEGVideoDescriptor_ProfileAndLevel:
*/ */
case PID_ClassDefinition_ParentClass: case PID_ClassDefinition_ParentClass:
return "PID_ClassDefinition_ParentClass"; return "PID_ClassDefinition_ParentClass";

View File

@ -729,7 +729,7 @@ cfb_getStream (CFB_Data* cfbd, cfbNode* node, unsigned char** stream, uint64_t*
return 0; return 0;
} }
cpy_sz = ((stream_len - offset) < (uint64_t) (1 << cfbd->hdr->_uMiniSectorShift)) ? (stream_len - offset) : (uint64_t) (1 << cfbd->hdr->_uMiniSectorShift); cpy_sz = ((stream_len - offset) < (uint64_t)(1 << cfbd->hdr->_uMiniSectorShift)) ? (stream_len - offset) : (uint64_t)(1 << cfbd->hdr->_uMiniSectorShift);
memcpy (*stream + offset, buf, cpy_sz); memcpy (*stream + offset, buf, cpy_sz);
@ -740,7 +740,7 @@ cfb_getStream (CFB_Data* cfbd, cfbNode* node, unsigned char** stream, uint64_t*
} else { } else {
CFB_foreachSectorInChain (cfbd, buf, id) CFB_foreachSectorInChain (cfbd, buf, id)
{ {
cpy_sz = ((stream_len - offset) < (uint64_t) (1 << cfbd->hdr->_uSectorShift)) ? (stream_len - offset) : (uint64_t) (1 << cfbd->hdr->_uSectorShift); cpy_sz = ((stream_len - offset) < (uint64_t)(1 << cfbd->hdr->_uSectorShift)) ? (stream_len - offset) : (uint64_t)(1 << cfbd->hdr->_uSectorShift);
memcpy (*stream + offset, buf, cpy_sz); memcpy (*stream + offset, buf, cpy_sz);
@ -1073,7 +1073,7 @@ cfb_retrieveMiniFAT (CFB_Data* cfbd)
* its ID (a.k.a SID) : * its ID (a.k.a SID) :
* *
* ``` * ```
cfbNode *node = CFB_Data.nodes[ID]; cfbNode *node = CFB_Data.nodes[ID];
* ``` * ```
* *
* @param cfbd Pointer to the CFB_Data structure. * @param cfbd Pointer to the CFB_Data structure.

View File

@ -92,16 +92,16 @@ typedef SSIZE_T ssize_t;
(uri->scheme_t != URI_SCHEME_T_FILE && \ (uri->scheme_t != URI_SCHEME_T_FILE && \
!(uri->opts & URI_OPT_IGNORE_FRAGMENT)) !(uri->opts & URI_OPT_IGNORE_FRAGMENT))
#define URI_SET_STR(str, start, end) \ #define URI_SET_STR(str, start, end) \
\ \
str = malloc (sizeof (char) * (uint32_t) ((end - start) + 1)); \ str = malloc (sizeof (char) * (uint32_t)((end - start) + 1)); \
\ \
if (!str) { \ if (!str) { \
error ("Out of memory"); \ error ("Out of memory"); \
goto err; \ goto err; \
} \ } \
\ \
snprintf (str, (uint32_t) (end - start) + 1, "%s", start); snprintf (str, (uint32_t)(end - start) + 1, "%s", start);
static char* static char*
uriDecodeString (char* src, char* dst); uriDecodeString (char* src, char* dst);
@ -787,7 +787,7 @@ uriIsIPv6 (const char* s, size_t size, char** err)
if (!IS_DIGIT (*(s + i))) { if (!IS_DIGIT (*(s + i))) {
loopback = -1; loopback = -1;
} else { } else {
loopback += (*(s + i) - '0'); //atoi(*(s+i)); loopback += (*(s + i) - '0'); // atoi(*(s+i));
} }
} }

View File

@ -601,7 +601,7 @@ typedef struct _aafData {
*/ */
#define aafRationalToint64(r) \ #define aafRationalToint64(r) \
(((r).denominator == 0) ? 0 : (int64_t) ((r).numerator / (r).denominator)) (((r).denominator == 0) ? 0 : (int64_t)((r).numerator / (r).denominator))
/** /**
* Loops through each aafPropertyIndexEntry_t of a "properties" node stream. * Loops through each aafPropertyIndexEntry_t of a "properties" node stream.

View File

@ -55,6 +55,9 @@ aafi_parse_audio_essence (AAF_Iface* aafi, aafiAudioEssenceFile* audioEssenceFil
int int
aafi_build_unique_audio_essence_name (AAF_Iface* aafi, aafiAudioEssenceFile* audioEssenceFile); aafi_build_unique_audio_essence_name (AAF_Iface* aafi, aafiAudioEssenceFile* audioEssenceFile);
aafiAudioEssencePointer*
aafi_audioEssencePointer_exists_before (AAF_Iface* aafi, aafiAudioEssencePointer* audioEssencePointerList);
/** /**
* @} * @}
*/ */

View File

@ -468,11 +468,11 @@ typedef struct aafiAudioClip {
*/ */
/* /*
* set with CompoMob's SourceClip::StartTime. In the case of an OperationGroup(AudioChannelCombiner), * set with CompoMob's SourceClip::StartTime. In the case of an OperationGroup(AudioChannelCombiner),
* There is one SourceClip per audio channel. So even though it's very unlikely, there could possibly * There is one SourceClip per audio channel. So even though it's very unlikely, there could possibly
* be one essence_offset per channel. * be one essence_offset per channel.
* Value is in edit unit, edit rate definition is aafiAudioTrack->edit_rate * Value is in edit unit, edit rate definition is aafiAudioTrack->edit_rate
*/ */
aafPosition_t essence_offset; aafPosition_t essence_offset;
aafiMetaData* metadata; aafiMetaData* metadata;
@ -1060,7 +1060,7 @@ aafi_freeMarkers (aafiMarker** aafi);
void void
aafi_freeMetadata (aafiMetaData** CommentList); aafi_freeMetadata (aafiMetaData** CommentList);
void aafiAudioEssencePointer*
aafi_freeAudioEssencePointer (aafiAudioEssencePointer* audioEssenceGroupEntry); aafi_freeAudioEssencePointer (aafiAudioEssencePointer* audioEssenceGroupEntry);
void void

View File

@ -57,33 +57,33 @@ typedef enum aafStoredForm_e {
typedef int32_t AAFTypeCategory_t; typedef int32_t AAFTypeCategory_t;
typedef enum _eAAFTypeCategory_e typedef enum _eAAFTypeCategory_e
{ {
AAFTypeCatUnknown = 0, // can only occur in damaged files AAFTypeCatUnknown = 0, // can only occur in damaged files
AAFTypeCatInt = 1, // any integral type AAFTypeCatInt = 1, // any integral type
AAFTypeCatCharacter = 2, // any character type AAFTypeCatCharacter = 2, // any character type
AAFTypeCatStrongObjRef = 3, // strong object reference AAFTypeCatStrongObjRef = 3, // strong object reference
AAFTypeCatWeakObjRef = 4, // weak object reference AAFTypeCatWeakObjRef = 4, // weak object reference
AAFTypeCatRename = 5, // renamed type AAFTypeCatRename = 5, // renamed type
AAFTypeCatEnum = 6, // enumerated type AAFTypeCatEnum = 6, // enumerated type
AAFTypeCatFixedArray = 7, // fixed-size array AAFTypeCatFixedArray = 7, // fixed-size array
AAFTypeCatVariableArray = 8, // variably-sized array AAFTypeCatVariableArray = 8, // variably-sized array
AAFTypeCatSet = 9, // set of strong object references or AAFTypeCatSet = 9, // set of strong object references or
// set of weak object references // set of weak object references
AAFTypeCatRecord = 10, // a structured type AAFTypeCatRecord = 10, // a structured type
AAFTypeCatStream = 11, // potentially huge amount of data AAFTypeCatStream = 11, // potentially huge amount of data
AAFTypeCatString = 12, // null-terminated variably-sized AAFTypeCatString = 12, // null-terminated variably-sized
// array of characters // array of characters
AAFTypeCatExtEnum = 13, // extendible enumerated type AAFTypeCatExtEnum = 13, // extendible enumerated type
AAFTypeCatIndirect = 14, // type must be determined at runtime AAFTypeCatIndirect = 14, // type must be determined at runtime
AAFTypeCatOpaque = 15, // type can be determined at runtime AAFTypeCatOpaque = 15, // type can be determined at runtime
AAFTypeCatEncrypted = 16 // type can be determined at runtime AAFTypeCatEncrypted = 16 // type can be determined at runtime
// but bits are encrypted // but bits are encrypted
} AAFTypeCategory_e; } AAFTypeCategory_e;
*/ */
/* /*
* :: Types Definition * :: Types Definition
* see Git nevali/aaf/ref-impl/include/ref-api/AAFTypes.h * see Git nevali/aaf/ref-impl/include/ref-api/AAFTypes.h
*/ */
typedef unsigned char aafByte_t; typedef unsigned char aafByte_t;
@ -369,7 +369,7 @@ typedef struct _aafRGBAComponent_t {
} aafRGBAComponent_t; } aafRGBAComponent_t;
//typedef aafRGBAComponent_t aafRGBALayout[8]; // typedef aafRGBAComponent_t aafRGBALayout[8];
/** /**
* This structure map the first bytes in a **properties** stream * This structure map the first bytes in a **properties** stream
@ -521,7 +521,7 @@ typedef struct aafStrongRefSetEntry_t {
* of the first aafStrongRefSetEntry_t is used to * of the first aafStrongRefSetEntry_t is used to
* form the name of the first element in the set and so * form the name of the first element in the set and so
* on. The #_localKey is an insertion key. * on. The #_localKey is an insertion key.
*/ */
uint32_t _localKey; uint32_t _localKey;
@ -588,7 +588,7 @@ typedef struct aafStrongRefVectorEntry_t {
* of the first aafStrongRefVectorEntry_t is used to * of the first aafStrongRefVectorEntry_t is used to
* form the name of the first element in the vector and so * form the name of the first element in the vector and so
* on. The #_localKey is an insertion key. * on. The #_localKey is an insertion key.
*/ */
uint32_t _localKey; uint32_t _localKey;
@ -679,15 +679,15 @@ typedef struct _WeakReferenceIndexHeader {
/* /*
typedef struct _aafIndirect_t typedef struct _aafIndirect_t
{ {
int type; int type;
size_t size; size_t size;
aafByte_t *data; aafByte_t *data;
} aafIndirect_t; } aafIndirect_t;
typedef struct _AAF_TaggedValueClass typedef struct _AAF_TaggedValueClass
{ {
aafString_t Name; aafString_t Name;
aafIndirect_t Value; aafIndirect_t Value;
} AAF_ObjTaggedValue; } AAF_ObjTaggedValue;
*/ */

View File

@ -710,7 +710,7 @@ typedef struct CFB_Data {
*/ */
#define CFB_getNodeStreamLen(cfbd, node) \ #define CFB_getNodeStreamLen(cfbd, node) \
((cfbd->hdr->_uSectorShift > 9) ? (uint64_t) (((uint64_t) (node->_ulSizeHigh) << 32) | (node->_ulSizeLow)) : node->_ulSizeLow) ((cfbd->hdr->_uSectorShift > 9) ? (uint64_t)(((uint64_t)(node->_ulSizeHigh) << 32) | (node->_ulSizeLow)) : node->_ulSizeLow)
#define CFB_getStreamSectorShift(cfbd, node) \ #define CFB_getStreamSectorShift(cfbd, node) \
((CFB_getNodeStreamLen (cfbd, node) < cfbd->hdr->_ulMiniSectorCutoff) ? cfbd->hdr->_uMiniSectorShift : cfbd->hdr->_uSectorShift) ((CFB_getNodeStreamLen (cfbd, node) < cfbd->hdr->_ulMiniSectorCutoff) ? cfbd->hdr->_uMiniSectorShift : cfbd->hdr->_uSectorShift)

View File

@ -103,7 +103,7 @@ PACK (struct wavBextChunk {
unsigned char umid[64]; unsigned char umid[64];
/* since bext v2 (2011) /* since bext v2 (2011)
* *
* If any loudness parameter is not * If any loudness parameter is not
* being used, its value shall be * being used, its value shall be
* set to 0x7fff. Any value outside * set to 0x7fff. Any value outside
@ -118,11 +118,11 @@ PACK (struct wavBextChunk {
char reserved[180]; char reserved[180];
/* /*
Because it is variable size, we Because it is variable size, we
do not include coding history do not include coding history
in the bext structure. However, in the bext structure. However,
we know it starts at the end we know it starts at the end
of bext structure when parsing. of bext structure when parsing.
*/ */
}); });

View File

@ -1,2 +1,2 @@
#pragma once #pragma once
#define LIBAAF_VERSION "v1.0-10-g13f0b0a" #define LIBAAF_VERSION "v1.0-11-gb04c547"

View File

@ -263,7 +263,7 @@ laaf_util_build_path (const char* sep, const char* first, ...)
int written = snprintf (str + offset, len - offset, "%s%.*s", int written = snprintf (str + offset, len - offset, "%s%.*s",
((element_count == 0 && has_leading_sep) || (element_count > 0)) ? sep : "", ((element_count == 0 && has_leading_sep) || (element_count > 0)) ? sep : "",
(uint32_t) (arglen - argstart), (uint32_t)(arglen - argstart),
arg + argstart); arg + argstart);
if (written < 0 || (size_t)written >= (len - offset)) { if (written < 0 || (size_t)written >= (len - offset)) {