Hi everyone,
Let me first congrats all of you for this great project. Working on
multimedia data is really challenging (math complexity, time
constraints, broken formats) and you did it so you deserve many many
thanks for that.
I'm currently developing an application that transcodes to several
fomats depending on what the user sends to me.
I faced several small but really annoying issues so I wanted to share my
journey.
I know the developer time is rather limited so maybe this is a perfect
candidate for a GSoC cleanup project.
I apologize in advance for my long message.
My first issue was compiling examples (in doc/examples folder) because
some of them are still using old and deprecated API.
For instance, transcoding.c still calls deprecated avcodec_encode_video2
and avcodec_encode_audio2 functions.
For test purpose, I:
- generated a sample video using "ffmpeg -f lavfi -i
testsrc=duration=5:size=1280x720:rate=2 testsrc.mp4"
- called "ffmpeg -loglevel debug -fdebug ts -i testsrc.mp4 testsrc.mkv"
and debugged it in Eclipse until my own source code did the same.
I was surprised to find the first step was not creating the same file
when called multiple times but I guess it's fine as long as the output
is visually/timely the same.
Since my input data was in memory, I used avio_alloc_context with my own
callbacks.
The function callback documentation is really poor and found out about
AVSEEK_SIZE only after grepping the source code for its value.
I found using an int64_t offset a bit awkard since "size_t is a type
guaranteed to hold any array index" but it's just a personal preference.
When opening the input, ffmpeg does use the "scan_all_pmts" option which
is never specified in examples.
Turning it on by default may be a good idea but if it's a performance
concern, that's ok.
Once opened, I count the number of video stream to ensure there is at
least one.
I'm wondering if it's possible to have a container without any stream
(for test-only purpose).
Note that when I open a picture file, the input AVStream
"avg_frame_rate" is 0/0, not 0/1.
Configuring decoder and encoder parameters (framerate, pkt_timebase,
sample_aspect_ratio, duration, side data) is a real pain and error-prone.
It would really be nice to have an helper to create an AVCodecContext
from an AVStream.
I also discovered the output stream time_base is updated when calling
avformat_write_header so calling it only when the encoder gives us the
first frame is not a good idea.
I don't know if it's wanted but ffmpeg.c stores a muxer timebase
(ost->mux_timebase) setting it to enc_ctx->time_base then "tr[ries] to
improve muxing time_base" overwriting it to ost->st->time_base which
only works because avformat_write_header has been called before. That
seems very fragile to me.
ffmpeg.c does funky things like recomputing the output frame PTS using a
float calculus (float_pts), resets pict_type to 0 (AV_PICTURE_TYPE_NONE)
and even try to predict the final packet DTS using a complex approach
using last packet duration, ticks, framerate and setting back and forth
several variables pts, dts, next_pts, next_dts and last_ts.
I know this is used for statistics and the like but it's a real
nightmare to follow.
After two weeks, I finally got a working video file but its duration was
wrong by 0.5s (one frame).
I found the issue was in ff_compute_frame_duration because it uses the
(deprecated) codec timebase.
It is filled in by ffmpeg.c which calls
avcodec_copy_context(ost->st->codec, ost->enc_ctx) in init_output_stream
function.
I tried replacing it with
avcodec_parameters_from_context/avcodec_parameters_to_context as
suggested by the avcodec.h avcodec_copy_context comment but the
ost->st->codec->time_base is not updated so this is not equivalent.
I ended up copying the time_base field at hand but my code is now
generating a deprecated warning.
I will try to submit a patch or two when I'll have time.
Anyway, thanks for reading me!
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".