Mercurial > libavformat.hg
comparison movenc.c @ 1000:508ab1067ed9 libavformat
correct computing of DV fourcc in mov muxer
Patch by Baptiste COUDURIER, baptiste <<dot>> coudurier <<at>> smartjog <<dot>> com
author | corey |
---|---|
date | Wed, 08 Mar 2006 00:39:23 +0000 |
parents | f7394f02e95a |
children | 15bfc3c063dc |
comparison
equal
deleted
inserted
replaced
999:76287fba65ff | 1000:508ab1067ed9 |
---|---|
266 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, | 266 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, |
267 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, | 267 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, |
268 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, | 268 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, |
269 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, | 269 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, |
270 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, | 270 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, |
271 { 0, 0 }, | 271 { CODEC_ID_NONE, 0 }, |
272 }; | 272 }; |
273 | 273 |
274 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track) | 274 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track) |
275 { | 275 { |
276 offset_t pos = url_ftell(pb); | 276 offset_t pos = url_ftell(pb); |
469 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, | 469 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, |
470 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, | 470 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, |
471 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, | 471 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, |
472 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, | 472 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, |
473 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, | 473 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, |
474 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, | 474 /* special handling in mov_find_video_codec_tag */ |
475 { 0, 0 }, | 475 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */ |
476 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */ | |
477 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL */ | |
478 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC */ | |
479 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL */ | |
480 { CODEC_ID_NONE, 0 }, | |
476 }; | 481 }; |
477 | 482 |
478 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) | 483 static int mov_find_video_codec_tag(MOVTrack* track) |
479 { | 484 { |
480 offset_t pos = url_ftell(pb); | |
481 char compressor_name[32]; | |
482 int tag; | 485 int tag; |
483 | 486 |
484 put_be32(pb, 0); /* size */ | |
485 | |
486 tag = track->enc->codec_tag; | 487 tag = track->enc->codec_tag; |
487 if (!tag) | 488 if (!tag) { |
488 tag = codec_get_tag(codec_movvideo_tags, track->enc->codec_id); | 489 if (track->enc->codec_id == CODEC_ID_DVVIDEO) { |
490 if (track->enc->height == 480) { /* NTSC */ | |
491 if (track->enc->pix_fmt == PIX_FMT_YUV422P) | |
492 tag = MKTAG('d', 'v', '5', 'n'); | |
493 else | |
494 tag = MKTAG('d', 'v', 'c', ' '); | |
495 } else { /* assume PAL */ | |
496 if (track->enc->pix_fmt == PIX_FMT_YUV422P) | |
497 tag = MKTAG('d', 'v', '5', 'p'); | |
498 else if (track->enc->pix_fmt == PIX_FMT_YUV420P) | |
499 tag = MKTAG('d', 'v', 'p', 'p'); | |
500 else | |
501 tag = MKTAG('d', 'v', 'c', 'p'); | |
502 } | |
503 } else { | |
504 tag = codec_get_tag(codec_movvideo_tags, track->enc->codec_id); | |
505 } | |
506 } | |
489 // if no mac fcc found, try with Microsoft tags | 507 // if no mac fcc found, try with Microsoft tags |
490 if (!tag) | 508 if (!tag) |
491 tag = codec_get_tag(codec_bmp_tags, track->enc->codec_id); | 509 tag = codec_get_tag(codec_bmp_tags, track->enc->codec_id); |
510 assert(tag); | |
511 return tag; | |
512 } | |
513 | |
514 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) | |
515 { | |
516 offset_t pos = url_ftell(pb); | |
517 char compressor_name[32]; | |
518 int tag; | |
519 | |
520 put_be32(pb, 0); /* size */ | |
521 | |
522 tag = mov_find_video_codec_tag(track); | |
492 put_le32(pb, tag); // store it byteswapped | 523 put_le32(pb, tag); // store it byteswapped |
493 | 524 |
494 put_be32(pb, 0); /* Reserved */ | 525 put_be32(pb, 0); /* Reserved */ |
495 put_be16(pb, 0); /* Reserved */ | 526 put_be16(pb, 0); /* Reserved */ |
496 put_be16(pb, 1); /* Data-reference index */ | 527 put_be16(pb, 1); /* Data-reference index */ |