static float video_qscale = 0;
static uint16_t *intra_matrix = NULL;
static uint16_t *inter_matrix = NULL;
-#if 0 //experimental, (can be removed)
-static float video_rc_qsquish=1.0;
-static float video_rc_qmod_amp=0;
-static int video_rc_qmod_freq=0;
-#endif
static const char *video_rc_override_string=NULL;
static int video_disable = 0;
static int video_discard = 0;
#endif
}
-static volatile sig_atomic_t received_sigterm = 0;
+static volatile int received_sigterm = 0;
static void
sigterm_handler(int sig)
st = av_mallocz(sizeof(AVStream));
memcpy(st, ic->streams[i], sizeof(AVStream));
st->codec = avcodec_alloc_context();
+ if (!st->codec) {
+ print_error(filename, AVERROR(ENOMEM));
+ av_exit(1);
+ }
memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
s->streams[i] = st;
int64_t pts)
{
static uint8_t *subtitle_out = NULL;
- int subtitle_out_max_size = 65536;
+ int subtitle_out_max_size = 1024 * 1024;
int subtitle_out_size, nb, i;
AVCodecContext *enc;
AVPacket pkt;
for(i = 0; i < nb; i++) {
sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
+ // start_display_time is required to be 0
+ sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
+ sub->end_display_time -= sub->start_display_time;
+ sub->start_display_time = 0;
subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
subtitle_out_max_size, sub);
+ if (subtitle_out_size < 0) {
+ fprintf(stderr, "Subtitle encoding failed\n");
+ av_exit(1);
+ }
av_init_packet(&pkt);
pkt.stream_index = ost->index;
pkt.data = subtitle_out;
pkt.size = subtitle_out_size;
- pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
+ pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
/* XXX: the pts correction is handled here. Maybe handling
it in the codec would be better */
AVSubtitle subtitle, *subtitle_to_free;
int got_subtitle;
AVPacket avpkt;
+ int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
if(ist->next_pts == AV_NOPTS_VALUE)
ist->next_pts= ist->pts;
handle_eof:
ist->pts= ist->next_pts;
- if(avpkt.size && avpkt.size != pkt->size && verbose>0)
+ if(avpkt.size && avpkt.size != pkt->size &&
+ !(ist->st->codec->codec->capabilities & CODEC_CAP_SUBFRAMES) && verbose>0)
fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
/* decode the packet if needed */
continue;
}
data_buf = (uint8_t *)samples;
- ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
+ ist->next_pts += ((int64_t)AV_TIME_BASE/bps * data_size) /
(ist->st->codec->sample_rate * ist->st->codec->channels);
break;}
case CODEC_TYPE_VIDEO:
if (ost->source_index == ist_index) {
os = output_files[ost->file_index];
-#if 0
- printf("%d: got pts=%0.3f %0.3f\n", i,
- (double)pkt->pts / AV_TIME_BASE,
- ((double)ist->pts / AV_TIME_BASE) -
- ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
-#endif
/* set the input output pts pairs */
//ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
return ret;
}
-#if 0
-int file_read(const char *filename)
-{
- URLContext *h;
- unsigned char buffer[1024];
- int len, i;
-
- if (url_open(&h, filename, O_RDONLY) < 0) {
- printf("could not open '%s'\n", filename);
- return -1;
- }
- for(;;) {
- len = url_read(h, buffer, sizeof(buffer));
- if (len <= 0)
- break;
- for(i=0;i<len;i++) putchar(buffer[i]);
- }
- url_close(h);
- return 0;
-}
-#endif
-
static void opt_format(const char *arg)
{
/* compatibility stuff for pgmyuv */
/* get default parameters from command line */
ic = avformat_alloc_context();
+ if (!ic) {
+ print_error(filename, AVERROR(ENOMEM));
+ av_exit(1);
+ }
memset(ap, 0, sizeof(*ap));
ap->prealloced_context = 1;
{
AVStream *st;
AVCodecContext *video_enc;
- int codec_id;
+ enum CodecID codec_id;
st = av_new_stream(oc, oc->nb_streams);
if (!st) {
{
AVStream *st;
AVCodecContext *audio_enc;
- int codec_id;
+ enum CodecID codec_id;
st = av_new_stream(oc, oc->nb_streams);
if (!st) {
filename = "pipe:";
oc = avformat_alloc_context();
+ if (!oc) {
+ print_error(filename, AVERROR(ENOMEM));
+ av_exit(1);
+ }
if (!file_oformat) {
file_oformat = guess_format(NULL, filename, NULL);
opt_frame_size(norm ? "352x240" : "352x288");
opt_frame_rate(NULL, frame_rates[norm]);
- opt_default("gop", norm ? "18" : "15");
+ opt_default("g", norm ? "18" : "15");
opt_default("b", "1150000");
opt_default("maxrate", "1150000");
opt_frame_size(norm ? "480x480" : "480x576");
opt_frame_rate(NULL, frame_rates[norm]);
- opt_default("gop", norm ? "18" : "15");
+ opt_default("g", norm ? "18" : "15");
opt_default("b", "2040000");
opt_default("maxrate", "2516000");
opt_frame_size(norm ? "720x480" : "720x576");
opt_frame_rate(NULL, frame_rates[norm]);
- opt_default("gop", norm ? "18" : "15");
+ opt_default("g", norm ? "18" : "15");
opt_default("b", "6000000");
opt_default("maxrate", "9000000");
avdevice_register_all();
av_register_all();
+#if HAVE_ISATTY
if(isatty(STDIN_FILENO))
url_set_interrupt_cb(decode_interrupt_cb);
+#endif
for(i=0; i<CODEC_TYPE_NB; i++){
avcodec_opts[i]= avcodec_alloc_context2(i);