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 */