|
|
|
@ -240,6 +240,11 @@ static int encode_init(AVCodecContext *avctx) |
|
|
|
|
if(avctx->level == FF_LEVEL_UNKNOWN) |
|
|
|
|
avctx->level = s->chroma_format == CHROMA_420 ? 8 : 5; |
|
|
|
|
|
|
|
|
|
if((avctx->flags2 & CODEC_FLAG2_DROP_FRAME_TIMECODE) && s->frame_rate_index != 4){ |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Drop frame time code only allowed with 1001/30000 fps\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -346,13 +351,20 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
put_header(s, GOP_START_CODE); |
|
|
|
|
put_bits(&s->pb, 1, 0); /* do drop frame */ |
|
|
|
|
put_bits(&s->pb, 1, !!(s->avctx->flags & CODEC_FLAG2_DROP_FRAME_TIMECODE)); /* drop frame flag */ |
|
|
|
|
/* time code : we must convert from the real frame rate to a
|
|
|
|
|
fake mpeg frame rate in case of low frame rate */ |
|
|
|
|
fps = (framerate.num + framerate.den/2)/ framerate.den; |
|
|
|
|
time_code = s->current_picture_ptr->coded_picture_number; |
|
|
|
|
time_code = s->current_picture_ptr->coded_picture_number + s->avctx->timecode_frame_start; |
|
|
|
|
|
|
|
|
|
s->gop_picture_number = time_code; |
|
|
|
|
s->gop_picture_number = s->current_picture_ptr->coded_picture_number; |
|
|
|
|
if (s->avctx->flags2 & CODEC_FLAG2_DROP_FRAME_TIMECODE) { |
|
|
|
|
/* only works for NTSC 29.97 */ |
|
|
|
|
int d = time_code / 17982; |
|
|
|
|
int m = time_code % 17982; |
|
|
|
|
//if (m < 2) m += 2; /* not needed since -2,-1 / 2 in C returns 0 */
|
|
|
|
|
time_code += 18 * d + 2 * ((m - 2) / 1798); |
|
|
|
|
} |
|
|
|
|
put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); |
|
|
|
|
put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); |
|
|
|
|
put_bits(&s->pb, 1, 1); |
|
|
|
|