[PATCH 7/7] Clip wrapped code
Maksym Veremeyenko
verem
Tue Jan 25 12:28:51 CET 2011
---
libavformat/mxfdec.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 56 insertions(+), 1 deletions(-)
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index ce86525..13f6a35 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -145,6 +145,9 @@ typedef struct {
struct AVAES *aesc;
uint8_t *local_tags;
int local_tags_count;
+ KLVPacket current_klv_data;
+ int current_klv_index;
+ int current_klv_bsize;
} MXFContext;
typedef int MXFMetadataReadFunc(void *arg, ByteIOContext *pb, int tag, int size, UID uid);
@@ -318,8 +321,26 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv
static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
{
KLVPacket klv;
+ int index;
+ MXFContext* mxf = s->priv_data;
while (!url_feof(s->pb)) {
+ if (mxf->current_klv_data.length) {
+ /* store */
+ klv = mxf->current_klv_data;
+ index = mxf->current_klv_index;
+
+ /* setup length */
+ klv.length = FFMIN(mxf->current_klv_bsize, mxf->current_klv_data.length);
+
+ /* modify size, length */
+ mxf->current_klv_data.offset += klv.length;
+ mxf->current_klv_data.length -= klv.length;
+
+ /* read packet */
+ goto read_data;
+ };
+
if (klv_read_packet(&klv, s->pb) < 0)
return -1;
PRINT_KEY(s, "read packet", klv.key);
@@ -333,13 +354,47 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
return 0;
}
if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
- int index = mxf_get_stream_index(s, &klv);
+ index = mxf_get_stream_index(s, &klv);
if (index < 0) {
av_log(s, AV_LOG_ERROR, "error getting stream index %d\n", AV_RB32(klv.key+12));
goto skip;
}
if (s->streams[index]->discard == AVDISCARD_ALL)
goto skip;
+
+ /* check for clip wrapped */
+ if (((MXFTrack*)s->streams[index]->priv_data)->wrapping == Clip) {
+ int k;
+
+ /* store current klv information */
+ mxf->current_klv_data = klv;
+ mxf->current_klv_index = index;
+ mxf->current_klv_bsize = 0;
+
+ /* find block size */
+ for (k = 0; k < mxf->metadata_sets_count; k++) {
+ MXFMetadataSet *metadata = mxf->metadata_sets[k];
+ if (IndexTableSegment == metadata->type) {
+ mxf->current_klv_bsize = ((MXFIndexTableSegment *)metadata)->edit_unit_byte_count;
+ break;
+ }
+ }
+
+ /* check small EditUnitByteCount for audio */
+ if (!mxf->current_klv_bsize | mxf->current_klv_bsize == 1)
+ mxf->current_klv_bsize = 1024 * 64;
+ else if (mxf->current_klv_bsize < 32)
+ mxf->current_klv_bsize *= 1024;
+
+ av_dlog(s, "Clip-wrapped reading. mxf->current_klv_bsize=%d, klv.length=%"PRId64"\n",
+ mxf->current_klv_bsize, klv.length);
+
+ return mxf_read_packet(s, pkt);
+ }
+read_data:
+ PRINT_KEY(s, "read packet data", klv.key);
+ av_dlog(s, "data size %lld offset %#llx\n", klv.length, klv.offset);
+
/* check for 8 channels AES3 element */
if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
if (mxf_get_d10_aes3_packet(s->pb, s->streams[index], pkt, klv.length) < 0) {
--
1.7.3.5
--------------070004040403090401070800--
More information about the ffmpeg-devel
mailing list