Mercurial > libavformat.hg
comparison movenc.c @ 2921:dab2aecebb97 libavformat
extract isom_write_avcc into a function
author | aurel |
---|---|
date | Fri, 11 Jan 2008 01:04:01 +0000 |
parents | 5f15ed0f5fdc |
children | dcd599833abc |
comparison
equal
deleted
inserted
replaced
2920:5f15ed0f5fdc | 2921:dab2aecebb97 |
---|---|
473 av_freep(buf); | 473 av_freep(buf); |
474 *size = url_close_dyn_buf(pb, buf); | 474 *size = url_close_dyn_buf(pb, buf); |
475 return 0; | 475 return 0; |
476 } | 476 } |
477 | 477 |
478 static int mov_write_avcc_tag(ByteIOContext *pb, MOVTrack *track) | 478 static int isom_write_avcc(ByteIOContext *pb, uint8_t *data, int len) |
479 { | 479 { |
480 offset_t pos = url_ftell(pb); | 480 if (len > 6) { |
481 | |
482 put_be32(pb, 0); | |
483 put_tag(pb, "avcC"); | |
484 if (track->vosLen > 6) { | |
485 /* check for h264 start code */ | 481 /* check for h264 start code */ |
486 if (AV_RB32(track->vosData) == 0x00000001) { | 482 if (AV_RB32(data) == 0x00000001) { |
487 uint8_t *buf, *end; | 483 uint8_t *buf=NULL, *end; |
488 uint32_t sps_size=0, pps_size=0; | 484 uint32_t sps_size=0, pps_size=0; |
489 uint8_t *sps=0, *pps=0; | 485 uint8_t *sps=0, *pps=0; |
490 | 486 |
491 int ret = avc_parse_nal_units(track->vosData, &track->vosData, &track->vosLen); | 487 int ret = avc_parse_nal_units(data, &buf, &len); |
492 if (ret < 0) | 488 if (ret < 0) |
493 return ret; | 489 return ret; |
494 buf = track->vosData; | 490 data = buf; |
495 end = track->vosData + track->vosLen; | 491 end = buf + len; |
496 | 492 |
497 /* look for sps and pps */ | 493 /* look for sps and pps */ |
498 while (buf < end) { | 494 while (buf < end) { |
499 unsigned int size; | 495 unsigned int size; |
500 uint8_t nal_type; | 496 uint8_t nal_type; |
522 put_be16(pb, sps_size); | 518 put_be16(pb, sps_size); |
523 put_buffer(pb, sps, sps_size); | 519 put_buffer(pb, sps, sps_size); |
524 put_byte(pb, 1); /* number of pps */ | 520 put_byte(pb, 1); /* number of pps */ |
525 put_be16(pb, pps_size); | 521 put_be16(pb, pps_size); |
526 put_buffer(pb, pps, pps_size); | 522 put_buffer(pb, pps, pps_size); |
523 av_free(data); | |
527 } else { | 524 } else { |
528 put_buffer(pb, track->vosData, track->vosLen); | 525 put_buffer(pb, data, len); |
529 } | 526 } |
530 } | 527 } |
528 return 0; | |
529 } | |
530 | |
531 static int mov_write_avcc_tag(ByteIOContext *pb, MOVTrack *track) | |
532 { | |
533 offset_t pos = url_ftell(pb); | |
534 | |
535 put_be32(pb, 0); | |
536 put_tag(pb, "avcC"); | |
537 isom_write_avcc(pb, track->vosData, track->vosLen); | |
531 return updateSize(pb, pos); | 538 return updateSize(pb, pos); |
532 } | 539 } |
533 | 540 |
534 /* also used by all avid codecs (dv, imx, meridien) and their variants */ | 541 /* also used by all avid codecs (dv, imx, meridien) and their variants */ |
535 static int mov_write_avid_tag(ByteIOContext *pb, MOVTrack *track) | 542 static int mov_write_avid_tag(ByteIOContext *pb, MOVTrack *track) |