|
|
|
@@ -53,6 +53,42 @@ typedef struct AVIOInterruptCB { |
|
|
|
void *opaque; |
|
|
|
} AVIOInterruptCB; |
|
|
|
|
|
|
|
/** |
|
|
|
* Different data types that can be returned via the AVIO |
|
|
|
* write_data_type callback. |
|
|
|
*/ |
|
|
|
enum AVIODataMarkerType { |
|
|
|
/** |
|
|
|
* Header data; this needs to be present for the stream to be decodeable. |
|
|
|
*/ |
|
|
|
AVIO_DATA_MARKER_HEADER, |
|
|
|
/** |
|
|
|
* A point in the output bytestream where a decoder can start decoding |
|
|
|
* (i.e. a keyframe). A demuxer/decoder given the data flagged with |
|
|
|
* AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT, |
|
|
|
* should give decodeable results. |
|
|
|
*/ |
|
|
|
AVIO_DATA_MARKER_SYNC_POINT, |
|
|
|
/** |
|
|
|
* A point in the output bytestream where a demuxer can start parsing |
|
|
|
* (for non self synchronizing bytestream formats). That is, any |
|
|
|
* non-keyframe packet start point. |
|
|
|
*/ |
|
|
|
AVIO_DATA_MARKER_BOUNDARY_POINT, |
|
|
|
/** |
|
|
|
* This is any, unlabelled data. It can either be a muxer not marking |
|
|
|
* any positions at all, it can be an actual boundary/sync point |
|
|
|
* that the muxer chooses not to mark, or a later part of a packet/fragment |
|
|
|
* that is cut into multiple write callbacks due to limited IO buffer size. |
|
|
|
*/ |
|
|
|
AVIO_DATA_MARKER_UNKNOWN, |
|
|
|
/** |
|
|
|
* Trailer data, which doesn't contain actual content, but only for |
|
|
|
* finalizing the output file. |
|
|
|
*/ |
|
|
|
AVIO_DATA_MARKER_TRAILER |
|
|
|
}; |
|
|
|
|
|
|
|
/** |
|
|
|
* Bytestream IO Context. |
|
|
|
* New fields can be added to the end with minor version bumps. |
|
|
|
@@ -115,6 +151,24 @@ typedef struct AVIOContext { |
|
|
|
* A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable. |
|
|
|
*/ |
|
|
|
int seekable; |
|
|
|
|
|
|
|
/** |
|
|
|
* A callback that is used instead of write_packet. |
|
|
|
*/ |
|
|
|
int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, |
|
|
|
enum AVIODataMarkerType type, int64_t time); |
|
|
|
/** |
|
|
|
* If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, |
|
|
|
* but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly |
|
|
|
* small chunks of data returned from the callback). |
|
|
|
*/ |
|
|
|
int ignore_boundary_point; |
|
|
|
|
|
|
|
/** |
|
|
|
* Internal, not meant to be used from outside of AVIOContext. |
|
|
|
*/ |
|
|
|
enum AVIODataMarkerType current_type; |
|
|
|
int64_t last_time; |
|
|
|
} AVIOContext; |
|
|
|
|
|
|
|
/** |
|
|
|
@@ -192,6 +246,18 @@ int avio_put_str16le(AVIOContext *s, const char *str); |
|
|
|
*/ |
|
|
|
int avio_put_str16be(AVIOContext *s, const char *str); |
|
|
|
|
|
|
|
/** |
|
|
|
* Mark the written bytestream as a specific type. |
|
|
|
* |
|
|
|
* Zero-length ranges are omitted from the output. |
|
|
|
* |
|
|
|
* @param time the stream time the current bytestream pos corresponds to |
|
|
|
* (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not |
|
|
|
* applicable |
|
|
|
* @param type the kind of data written starting at the current pos |
|
|
|
*/ |
|
|
|
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type); |
|
|
|
|
|
|
|
/** |
|
|
|
* ORing this as the "whence" parameter to a seek function causes it to |
|
|
|
* return the filesize without seeking anywhere. Supporting this is optional. |
|
|
|
|