You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
8.6 KiB
239 lines
8.6 KiB
Index: vdr2jpeg-0.1.9/ffm.cpp
|
|
===================================================================
|
|
--- vdr2jpeg-0.1.9.orig/ffm.cpp
|
|
+++ vdr2jpeg-0.1.9/ffm.cpp
|
|
@@ -22,6 +22,7 @@
|
|
extern "C" {
|
|
#include <libavutil/avutil.h>
|
|
#include <libavutil/mathematics.h>
|
|
+#include <libavutil/pixdesc.h>
|
|
#include <libavcodec/avcodec.h>
|
|
#include <libavformat/avformat.h>
|
|
#include <libswscale/swscale.h>
|
|
@@ -55,14 +56,12 @@ static int video_qdiff = 3;
|
|
static const char *video_rc_eq="tex^qComp";
|
|
static int me_method = ME_EPZS;
|
|
|
|
-static int same_quality = 1;
|
|
|
|
static int top_field_first = -1;
|
|
|
|
|
|
|
|
|
|
-static float mux_preload= 0.5;
|
|
static float mux_max_delay= 0.7;
|
|
|
|
static int64_t input_ts_offset = 0;
|
|
@@ -150,7 +149,7 @@ static bool do_video_out(AVFormatContext
|
|
int *frame_size)
|
|
{
|
|
int nb_frames, i, ret;
|
|
- AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
|
|
+ AVFrame *final_picture, *formatted_picture, *resampling_dst;
|
|
AVFrame picture_crop_temp, picture_pad_temp;
|
|
AVCodecContext *enc, *dec;
|
|
|
|
@@ -195,11 +194,9 @@ static bool do_video_out(AVFormatContext
|
|
}
|
|
|
|
final_picture = formatted_picture;
|
|
- padding_src = formatted_picture;
|
|
resampling_dst = &ost->pict_tmp;
|
|
|
|
if (ost->video_resample) {
|
|
- padding_src = NULL;
|
|
final_picture = &ost->pict_tmp;
|
|
sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
|
|
0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
|
|
@@ -242,10 +239,7 @@ static bool do_video_out(AVFormatContext
|
|
|
|
/* handles sameq here. This is not correct because it may
|
|
not be a global option */
|
|
- if (same_quality) {
|
|
- big_picture.quality = (int)ist->st->quality;
|
|
- }else
|
|
- big_picture.quality = (int)ost->st->quality;
|
|
+ big_picture.quality = ist->st->codec->global_quality;
|
|
big_picture.pict_type = (AVPictureType) 0;
|
|
// big_picture.pts = AV_NOPTS_VALUE;
|
|
big_picture.pts= ost->sync_opts;
|
|
@@ -328,7 +322,7 @@ static int output_packet(AVInputStream *
|
|
|
|
ret = avcodec_decode_video2(ist->st->codec,
|
|
&picture, &got_picture, &pkt);
|
|
- ist->st->quality= picture.quality;
|
|
+ ist->st->codec->global_quality= picture.quality;
|
|
if (ret < 0)
|
|
goto fail_decode;
|
|
if (!got_picture) {
|
|
@@ -618,31 +612,6 @@ static bool av_encode(AVFormatContext **
|
|
codec = ost->st->codec;
|
|
icodec = ist->st->codec;
|
|
|
|
- if (ost->st->stream_copy) {
|
|
- /* if stream_copy is selected, no need to decode or encode */
|
|
- codec->codec_id = icodec->codec_id;
|
|
- codec->codec_type = icodec->codec_type;
|
|
- if(!codec->codec_tag) codec->codec_tag = icodec->codec_tag;
|
|
- codec->bit_rate = icodec->bit_rate;
|
|
- codec->extradata= icodec->extradata;
|
|
- codec->extradata_size= icodec->extradata_size;
|
|
- if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
|
|
- codec->time_base = icodec->time_base;
|
|
- else
|
|
- codec->time_base = ist->st->time_base;
|
|
- switch(codec->codec_type) {
|
|
- case AVMEDIA_TYPE_VIDEO:
|
|
- codec->pix_fmt = icodec->pix_fmt;
|
|
- codec->width = icodec->width;
|
|
- codec->height = icodec->height;
|
|
- codec->has_b_frames = icodec->has_b_frames;
|
|
- break;
|
|
- case AVMEDIA_TYPE_SUBTITLE:
|
|
- break;
|
|
- default:
|
|
- return false;
|
|
- }
|
|
- } else {
|
|
switch(codec->codec_type) {
|
|
case AVMEDIA_TYPE_VIDEO:
|
|
ost->video_resample = ((codec->width != icodec->width) ||
|
|
@@ -675,7 +644,6 @@ static bool av_encode(AVFormatContext **
|
|
default:
|
|
return false;
|
|
}
|
|
- }
|
|
if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
|
|
int size= codec->width * codec->height;
|
|
bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
|
|
@@ -690,7 +658,7 @@ static bool av_encode(AVFormatContext **
|
|
/* dump the file output parameters - cannot be done before in case
|
|
of stream copy */
|
|
for(i=0;i<nb_output_files;i++) {
|
|
- dump_format(output_files[i], i, output_files[i]->filename, 1);
|
|
+ av_dump_format(output_files[i], i, output_files[i]->filename, 1);
|
|
}
|
|
|
|
/* open each encoder */
|
|
@@ -749,7 +717,7 @@ static bool av_encode(AVFormatContext **
|
|
/* open files and write file headers */
|
|
for(i=0;i<nb_output_files;i++) {
|
|
os = output_files[i];
|
|
- if (av_write_header(os) < 0) {
|
|
+ if (avformat_write_header(os,NULL) < 0) {
|
|
fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
|
|
ret = false; //AVERROR(EINVAL);
|
|
goto fail;
|
|
@@ -941,36 +909,32 @@ void print_error(const char *filename, i
|
|
static bool opt_input_file(const char *filename)
|
|
{
|
|
AVFormatContext *ic;
|
|
- AVFormatParameters params, *ap = ¶ms;
|
|
int err, ret, rfps, rfps_base;
|
|
unsigned int i;
|
|
int64_t timestamp;
|
|
+ AVDictionary *opts = NULL;
|
|
+ char buf[1024];
|
|
|
|
/* get default parameters from command line */
|
|
ic = avformat_alloc_context();
|
|
|
|
- memset(ap, 0, sizeof(*ap));
|
|
- ap->prealloced_context = 1;
|
|
- ap->time_base.den = frame_rate;
|
|
- ap->time_base.num = frame_rate_base;
|
|
- ap->width = frame_width + 0 + 0;
|
|
- ap->height = frame_height + 0 + 0;
|
|
- ap->pix_fmt = frame_pix_fmt;
|
|
- ap->channel = 0;
|
|
- ap->standard = 0;
|
|
+ snprintf(buf, sizeof(buf), "%d/%d", frame_rate, frame_rate_base);
|
|
+ av_dict_set(&opts, "framerate", buf, 0);
|
|
+ snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
|
|
+ av_dict_set(&opts, "video_size", buf, 0);
|
|
+ av_dict_set(&opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
|
|
+
|
|
ic->video_codec_id = CODEC_ID_NONE;
|
|
if(pgmyuv_compatibility_hack)
|
|
ic->video_codec_id= CODEC_ID_PGMYUV;
|
|
|
|
/* open the input file with generic libav function */
|
|
- err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
|
|
+ err = avformat_open_input(&ic, filename, file_iformat, &opts);
|
|
if (err < 0) {
|
|
print_error(filename, err);
|
|
return 0;
|
|
}
|
|
|
|
- ic->loop_input = 0;
|
|
-
|
|
/* If not enough info to get the stream parameters, we decode the
|
|
first frames to get it. (used in mpeg case for example) */
|
|
ret = av_find_stream_info(ic);
|
|
@@ -1027,7 +991,7 @@ static bool opt_input_file(const char *f
|
|
input_files_ts_offset[nb_input_files] = input_ts_offset - timestamp;
|
|
/* dump the file content */
|
|
if (verbose >= 0)
|
|
- dump_format(ic, nb_input_files, filename, 0);
|
|
+ av_dump_format(ic, nb_input_files, filename, 0);
|
|
|
|
nb_input_files++;
|
|
file_iformat = NULL;
|
|
@@ -1133,11 +1097,8 @@ static bool new_video_stream(AVFormatCon
|
|
|
|
/* if (intra_only)
|
|
video_enc->gop_size = 0;*/
|
|
- if (same_quality) {
|
|
video_enc->flags |= CODEC_FLAG_QSCALE;
|
|
- st->quality = FF_QP2LAMBDA;
|
|
- video_enc->global_quality= (int)st->quality;
|
|
- }
|
|
+ video_enc->global_quality= FF_QP2LAMBDA;
|
|
|
|
video_enc->max_qdiff = video_qdiff;
|
|
video_enc->rc_eq = video_rc_eq;
|
|
@@ -1187,7 +1148,6 @@ static bool opt_output_file(const char *
|
|
{
|
|
AVFormatContext *oc;
|
|
int use_video, input_has_video = 0;
|
|
- AVFormatParameters params, *ap = ¶ms;
|
|
|
|
oc = avformat_alloc_context();
|
|
|
|
@@ -1219,8 +1179,6 @@ static bool opt_output_file(const char *
|
|
return false;
|
|
}
|
|
|
|
- oc->timestamp = 0;
|
|
-
|
|
}
|
|
|
|
output_files[nb_output_files++] = oc;
|
|
@@ -1233,16 +1191,7 @@ static bool opt_output_file(const char *
|
|
}
|
|
}
|
|
|
|
- memset(ap, 0, sizeof(*ap));
|
|
- if (av_set_parameters(oc, ap) < 0) {
|
|
- fprintf(stderr, "%s: Invalid encoding parameters\n",
|
|
- oc->filename);
|
|
- return false;
|
|
- }
|
|
-
|
|
- oc->preload= (int)(mux_preload*AV_TIME_BASE);
|
|
oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
|
|
- oc->loop_output = AVFMT_NOOUTPUTLOOP;
|
|
|
|
/* reset some options */
|
|
file_oformat = NULL;
|
|
@@ -1323,7 +1272,7 @@ bool decode (const char* szMPVfile, /* c
|
|
AVFormatContext *s = output_files[i];
|
|
|
|
if (!(s->oformat->flags & AVFMT_NOFILE))
|
|
- url_fclose(s->pb);
|
|
+ avio_close(s->pb);
|
|
for(j=0;j<s->nb_streams;j++)
|
|
av_free(s->streams[j]);
|
|
av_free(s);
|