|
@@ -208,6 +208,19 @@ static void build_flv_meta_data(obs_output_t *context, uint8_t **output,
|
|
|
*output = bmemdup(buf, *size);
|
|
|
}
|
|
|
|
|
|
+static inline void write_previous_tag_size_without_header(struct serializer *s,
|
|
|
+ uint32_t header_size)
|
|
|
+{
|
|
|
+ assert(serializer_get_pos(s) >= header_size);
|
|
|
+ /* write tag size (starting byte doesn't count) */
|
|
|
+ s_wb32(s, (uint32_t)serializer_get_pos(s) - header_size - 1);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void write_previous_tag_size(struct serializer *s)
|
|
|
+{
|
|
|
+ write_previous_tag_size_without_header(s, 0);
|
|
|
+}
|
|
|
+
|
|
|
void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
|
|
|
bool write_header)
|
|
|
{
|
|
@@ -238,7 +251,7 @@ void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
|
|
|
|
|
|
s_write(&s, meta_data, meta_data_size);
|
|
|
|
|
|
- s_wb32(&s, (uint32_t)serializer_get_pos(&s) - start_pos - 1);
|
|
|
+ write_previous_tag_size_without_header(&s, start_pos);
|
|
|
|
|
|
*output = data.bytes.array;
|
|
|
*size = data.bytes.num;
|
|
@@ -281,8 +294,7 @@ static void flv_video(struct serializer *s, int32_t dts_offset,
|
|
|
s_wb24(s, get_ms_time(packet, offset));
|
|
|
s_write(s, packet->data, packet->size);
|
|
|
|
|
|
- /* write tag size (starting byte doesn't count) */
|
|
|
- s_wb32(s, (uint32_t)serializer_get_pos(s) - 1);
|
|
|
+ write_previous_tag_size(s);
|
|
|
}
|
|
|
|
|
|
static void flv_audio(struct serializer *s, int32_t dts_offset,
|
|
@@ -314,8 +326,7 @@ static void flv_audio(struct serializer *s, int32_t dts_offset,
|
|
|
s_w8(s, is_header ? 0 : 1);
|
|
|
s_write(s, packet->data, packet->size);
|
|
|
|
|
|
- /* write tag size (starting byte doesn't count) */
|
|
|
- s_wb32(s, (uint32_t)serializer_get_pos(s) - 1);
|
|
|
+ write_previous_tag_size(s);
|
|
|
}
|
|
|
|
|
|
void flv_packet_mux(struct encoder_packet *packet, int32_t dts_offset,
|
|
@@ -376,7 +387,7 @@ void flv_packet_ex(struct encoder_packet *packet, enum video_id_t codec_id,
|
|
|
s_write(&s, packet->data, packet->size);
|
|
|
|
|
|
// packet tail
|
|
|
- s_wb32(&s, (uint32_t)serializer_get_pos(&s) - 1);
|
|
|
+ write_previous_tag_size(&s);
|
|
|
|
|
|
*output = data.bytes.array;
|
|
|
*size = data.bytes.num;
|
|
@@ -489,7 +500,7 @@ void flv_packet_metadata(enum video_id_t codec_id, uint8_t **output,
|
|
|
array_output_serializer_free(&metadata); // must be freed
|
|
|
|
|
|
// packet tail
|
|
|
- s_wb32(&s, (uint32_t)serializer_get_pos(&s) - 1);
|
|
|
+ write_previous_tag_size(&s);
|
|
|
|
|
|
*output = data.bytes.array;
|
|
|
*size = data.bytes.num;
|
|
@@ -621,7 +632,7 @@ void flv_additional_meta_data(obs_output_t *context, uint8_t **data,
|
|
|
s_write(&s, meta_data, meta_data_size);
|
|
|
bfree(meta_data);
|
|
|
|
|
|
- s_wb32(&s, (uint32_t)serializer_get_pos(&s) - 1);
|
|
|
+ write_previous_tag_size(&s);
|
|
|
|
|
|
*data = out.bytes.array;
|
|
|
*size = out.bytes.num;
|
|
@@ -720,7 +731,7 @@ static void flv_additional_audio(struct serializer *s, int32_t dts_offset,
|
|
|
serialize(s, data, size);
|
|
|
bfree(data);
|
|
|
|
|
|
- s_wb32(s, (uint32_t)serializer_get_pos(s) - 1);
|
|
|
+ write_previous_tag_size(s);
|
|
|
}
|
|
|
|
|
|
void flv_additional_packet_mux(struct encoder_packet *packet,
|