Recherche avancée

Médias (16)

Mot : - Tags -/mp3

Autres articles (76)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • XMP PHP

    13 mai 2011, par

    Dixit Wikipedia, XMP signifie :
    Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
    Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
    XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

Sur d’autres sites (5917)

  • Why does adding audio stream to ffmpeg's libavcodec output container cause a crash ?

    29 mars 2021, par Sniggerfardimungus

    As it stands, my project correctly uses libavcodec to decode a video, where each frame is manipulated (it doesn't matter how) and output to a new video. I've cobbled this together from examples found online, and it works. The result is a perfect .mp4 of the manipulated frames, minus the audio.

    


    My problem is, when I try to add an audio stream to the output container, I get a crash in mux.c that I can't explain. It's in static int compute_muxer_pkt_fields(AVFormatContext *s, AVStream *st, AVPacket *pkt). Where st->internal->priv_pts->val = pkt->dts; is attempted, priv_pts is nullptr.

    


    I don't recall the version number, but this is from a November 4, 2020 ffmpeg build from git.

    


    My MediaContentMgr is much bigger than what I have here. I'm stripping out everything to do with the frame manipulation, so if I'm missing anything, please let me know and I'll edit.

    


    The code that, when added, triggers the nullptr exception, is called out inline

    


    The .h :

    


    #ifndef _API_EXAMPLE_H&#xA;#define _API_EXAMPLE_H&#xA;&#xA;#include <glad></glad>glad.h>&#xA;#include <glfw></glfw>glfw3.h>&#xA;#include "glm/glm.hpp"&#xA;&#xA;extern "C" {&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libavutil></libavutil>avutil.h>&#xA;#include <libavutil></libavutil>opt.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;}&#xA;&#xA;#include "shader_s.h"&#xA;&#xA;class MediaContainerMgr {&#xA;public:&#xA;    MediaContainerMgr(const std::string&amp; infile, const std::string&amp; vert, const std::string&amp; frag, &#xA;                      const glm::vec3* extents);&#xA;    ~MediaContainerMgr();&#xA;    void render();&#xA;    bool recording() { return m_recording; }&#xA;&#xA;    // Major thanks to "shi-yan" who helped make this possible:&#xA;    // https://github.com/shi-yan/videosamples/blob/master/libavmp4encoding/main.cpp&#xA;    bool init_video_output(const std::string&amp; video_file_name, unsigned int width, unsigned int height);&#xA;    bool output_video_frame(uint8_t* buf);&#xA;    bool finalize_output();&#xA;&#xA;private:&#xA;    AVFormatContext*   m_format_context;&#xA;    AVCodec*           m_video_codec;&#xA;    AVCodec*           m_audio_codec;&#xA;    AVCodecParameters* m_video_codec_parameters;&#xA;    AVCodecParameters* m_audio_codec_parameters;&#xA;    AVCodecContext*    m_codec_context;&#xA;    AVFrame*           m_frame;&#xA;    AVPacket*          m_packet;&#xA;    uint32_t           m_video_stream_index;&#xA;    uint32_t           m_audio_stream_index;&#xA;    &#xA;    void init_rendering(const glm::vec3* extents);&#xA;    int decode_packet();&#xA;&#xA;    // For writing the output video:&#xA;    void free_output_assets();&#xA;    bool                   m_recording;&#xA;    AVOutputFormat*        m_output_format;&#xA;    AVFormatContext*       m_output_format_context;&#xA;    AVCodec*               m_output_video_codec;&#xA;    AVCodecContext*        m_output_video_codec_context;&#xA;    AVFrame*               m_output_video_frame;&#xA;    SwsContext*            m_output_scale_context;&#xA;    AVStream*              m_output_video_stream;&#xA;    &#xA;    AVCodec*               m_output_audio_codec;&#xA;    AVStream*              m_output_audio_stream;&#xA;    AVCodecContext*        m_output_audio_codec_context;&#xA;};&#xA;&#xA;#endif&#xA;

    &#xA;

    And, the hellish .cpp :

    &#xA;

    #include &#xA;#include &#xA;#include &#xA;#include &#xA;#include &#xA;&#xA;#include "media_container_manager.h"&#xA;&#xA;MediaContainerMgr::MediaContainerMgr(const std::string&amp; infile, const std::string&amp; vert, const std::string&amp; frag,&#xA;    const glm::vec3* extents) :&#xA;    m_video_stream_index(-1),&#xA;    m_audio_stream_index(-1),&#xA;    m_recording(false),&#xA;    m_output_format(nullptr),&#xA;    m_output_format_context(nullptr),&#xA;    m_output_video_codec(nullptr),&#xA;    m_output_video_codec_context(nullptr),&#xA;    m_output_video_frame(nullptr),&#xA;    m_output_scale_context(nullptr),&#xA;    m_output_video_stream(nullptr)&#xA;{&#xA;    // AVFormatContext holds header info from the format specified in the container:&#xA;    m_format_context = avformat_alloc_context();&#xA;    if (!m_format_context) {&#xA;        throw "ERROR could not allocate memory for Format Context";&#xA;    }&#xA;    &#xA;    // open the file and read its header. Codecs are not opened here.&#xA;    if (avformat_open_input(&amp;m_format_context, infile.c_str(), NULL, NULL) != 0) {&#xA;        throw "ERROR could not open input file for reading";&#xA;    }&#xA;&#xA;    printf("format %s, duration %lldus, bit_rate %lld\n", m_format_context->iformat->name, m_format_context->duration, m_format_context->bit_rate);&#xA;    //read avPackets (?) from the avFormat (?) to get stream info. This populates format_context->streams.&#xA;    if (avformat_find_stream_info(m_format_context, NULL) &lt; 0) {&#xA;        throw "ERROR could not get stream info";&#xA;    }&#xA;&#xA;    for (unsigned int i = 0; i &lt; m_format_context->nb_streams; i&#x2B;&#x2B;) {&#xA;        AVCodecParameters* local_codec_parameters = NULL;&#xA;        local_codec_parameters = m_format_context->streams[i]->codecpar;&#xA;        printf("AVStream->time base before open coded %d/%d\n", m_format_context->streams[i]->time_base.num, m_format_context->streams[i]->time_base.den);&#xA;        printf("AVStream->r_frame_rate before open coded %d/%d\n", m_format_context->streams[i]->r_frame_rate.num, m_format_context->streams[i]->r_frame_rate.den);&#xA;        printf("AVStream->start_time %" PRId64 "\n", m_format_context->streams[i]->start_time);&#xA;        printf("AVStream->duration %" PRId64 "\n", m_format_context->streams[i]->duration);&#xA;        printf("duration(s): %lf\n", (float)m_format_context->streams[i]->duration / m_format_context->streams[i]->time_base.den * m_format_context->streams[i]->time_base.num);&#xA;        AVCodec* local_codec = NULL;&#xA;        local_codec = avcodec_find_decoder(local_codec_parameters->codec_id);&#xA;        if (local_codec == NULL) {&#xA;            throw "ERROR unsupported codec!";&#xA;        }&#xA;&#xA;        if (local_codec_parameters->codec_type == AVMEDIA_TYPE_VIDEO) {&#xA;            if (m_video_stream_index == -1) {&#xA;                m_video_stream_index = i;&#xA;                m_video_codec = local_codec;&#xA;                m_video_codec_parameters = local_codec_parameters;&#xA;            }&#xA;            m_height = local_codec_parameters->height;&#xA;            m_width = local_codec_parameters->width;&#xA;            printf("Video Codec: resolution %dx%d\n", m_width, m_height);&#xA;        }&#xA;        else if (local_codec_parameters->codec_type == AVMEDIA_TYPE_AUDIO) {&#xA;            if (m_audio_stream_index == -1) {&#xA;                m_audio_stream_index = i;&#xA;                m_audio_codec = local_codec;&#xA;                m_audio_codec_parameters = local_codec_parameters;&#xA;            }&#xA;            printf("Audio Codec: %d channels, sample rate %d\n", local_codec_parameters->channels, local_codec_parameters->sample_rate);&#xA;        }&#xA;&#xA;        printf("\tCodec %s ID %d bit_rate %lld\n", local_codec->name, local_codec->id, local_codec_parameters->bit_rate);&#xA;    }&#xA;&#xA;    m_codec_context = avcodec_alloc_context3(m_video_codec);&#xA;    if (!m_codec_context) {&#xA;        throw "ERROR failed to allocate memory for AVCodecContext";&#xA;    }&#xA;&#xA;    if (avcodec_parameters_to_context(m_codec_context, m_video_codec_parameters) &lt; 0) {&#xA;        throw "ERROR failed to copy codec params to codec context";&#xA;    }&#xA;&#xA;    if (avcodec_open2(m_codec_context, m_video_codec, NULL) &lt; 0) {&#xA;        throw "ERROR avcodec_open2 failed to open codec";&#xA;    }&#xA;&#xA;    m_frame = av_frame_alloc();&#xA;    if (!m_frame) {&#xA;        throw "ERROR failed to allocate AVFrame memory";&#xA;    }&#xA;&#xA;    m_packet = av_packet_alloc();&#xA;    if (!m_packet) {&#xA;        throw "ERROR failed to allocate AVPacket memory";&#xA;    }&#xA;}&#xA;&#xA;MediaContainerMgr::~MediaContainerMgr() {&#xA;    avformat_close_input(&amp;m_format_context);&#xA;    av_packet_free(&amp;m_packet);&#xA;    av_frame_free(&amp;m_frame);&#xA;    avcodec_free_context(&amp;m_codec_context);&#xA;&#xA;&#xA;    glDeleteVertexArrays(1, &amp;m_VAO);&#xA;    glDeleteBuffers(1, &amp;m_VBO);&#xA;}&#xA;&#xA;&#xA;bool MediaContainerMgr::advance_frame() {&#xA;    while (true) {&#xA;        if (av_read_frame(m_format_context, m_packet) &lt; 0) {&#xA;            // Do we actually need to unref the packet if it failed?&#xA;            av_packet_unref(m_packet);&#xA;            continue;&#xA;            //return false;&#xA;        }&#xA;        else {&#xA;            if (m_packet->stream_index == m_video_stream_index) {&#xA;                //printf("AVPacket->pts %" PRId64 "\n", m_packet->pts);&#xA;                int response = decode_packet();&#xA;                av_packet_unref(m_packet);&#xA;                if (response != 0) {&#xA;                    continue;&#xA;                    //return false;&#xA;                }&#xA;                return true;&#xA;            }&#xA;            else {&#xA;                printf("m_packet->stream_index: %d\n", m_packet->stream_index);&#xA;                printf("  m_packet->pts: %lld\n", m_packet->pts);&#xA;                printf("  mpacket->size: %d\n", m_packet->size);&#xA;                if (m_recording) {&#xA;                    int err = 0;&#xA;                    //err = avcodec_send_packet(m_output_video_codec_context, m_packet);&#xA;                    printf("  encoding error: %d\n", err);&#xA;                }&#xA;            }&#xA;        }&#xA;&#xA;        // We&#x27;re done with the packet (it&#x27;s been unpacked to a frame), so deallocate &amp; reset to defaults:&#xA;/*&#xA;        if (m_frame == NULL)&#xA;            return false;&#xA;&#xA;        if (m_frame->data[0] == NULL || m_frame->data[1] == NULL || m_frame->data[2] == NULL) {&#xA;            printf("WARNING: null frame data");&#xA;            continue;&#xA;        }&#xA;*/&#xA;    }&#xA;}&#xA;&#xA;int MediaContainerMgr::decode_packet() {&#xA;    // Supply raw packet data as input to a decoder&#xA;    // https://ffmpeg.org/doxygen/trunk/group__lavc__decoding.html#ga58bc4bf1e0ac59e27362597e467efff3&#xA;    int response = avcodec_send_packet(m_codec_context, m_packet);&#xA;&#xA;    if (response &lt; 0) {&#xA;        char buf[256];&#xA;        av_strerror(response, buf, 256);&#xA;        printf("Error while receiving a frame from the decoder: %s\n", buf);&#xA;        return response;&#xA;    }&#xA;&#xA;    // Return decoded output data (into a frame) from a decoder&#xA;    // https://ffmpeg.org/doxygen/trunk/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c&#xA;    response = avcodec_receive_frame(m_codec_context, m_frame);&#xA;    if (response == AVERROR(EAGAIN) || response == AVERROR_EOF) {&#xA;        return response;&#xA;    } else if (response &lt; 0) {&#xA;        char buf[256];&#xA;        av_strerror(response, buf, 256);&#xA;        printf("Error while receiving a frame from the decoder: %s\n", buf);&#xA;        return response;&#xA;    } else {&#xA;        printf(&#xA;            "Frame %d (type=%c, size=%d bytes) pts %lld key_frame %d [DTS %d]\n",&#xA;            m_codec_context->frame_number,&#xA;            av_get_picture_type_char(m_frame->pict_type),&#xA;            m_frame->pkt_size,&#xA;            m_frame->pts,&#xA;            m_frame->key_frame,&#xA;            m_frame->coded_picture_number&#xA;        );&#xA;    }&#xA;    return 0;&#xA;}&#xA;&#xA;&#xA;bool MediaContainerMgr::init_video_output(const std::string&amp; video_file_name, unsigned int width, unsigned int height) {&#xA;    if (m_recording)&#xA;        return true;&#xA;    m_recording = true;&#xA;&#xA;    advance_to(0L); // I&#x27;ve deleted the implmentation. Just seeks to beginning of vid. Works fine.&#xA;&#xA;    if (!(m_output_format = av_guess_format(nullptr, video_file_name.c_str(), nullptr))) {&#xA;        printf("Cannot guess output format.\n");&#xA;        return false;&#xA;    }&#xA;&#xA;    int err = avformat_alloc_output_context2(&amp;m_output_format_context, m_output_format, nullptr, video_file_name.c_str());&#xA;    if (err &lt; 0) {&#xA;        printf("Failed to allocate output context.\n");&#xA;        return false;&#xA;    }&#xA;&#xA;    //TODO(P0): Break out the video and audio inits into their own methods.&#xA;    m_output_video_codec = avcodec_find_encoder(m_output_format->video_codec);&#xA;    if (!m_output_video_codec) {&#xA;        printf("Failed to create video codec.\n");&#xA;        return false;&#xA;    }&#xA;    m_output_video_stream = avformat_new_stream(m_output_format_context, m_output_video_codec);&#xA;    if (!m_output_video_stream) {&#xA;        printf("Failed to find video format.\n");&#xA;        return false;&#xA;    } &#xA;    m_output_video_codec_context = avcodec_alloc_context3(m_output_video_codec);&#xA;    if (!m_output_video_codec_context) {&#xA;        printf("Failed to create video codec context.\n");&#xA;        return(false);&#xA;    }&#xA;    m_output_video_stream->codecpar->codec_id = m_output_format->video_codec;&#xA;    m_output_video_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    m_output_video_stream->codecpar->width = width;&#xA;    m_output_video_stream->codecpar->height = height;&#xA;    m_output_video_stream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;    // Use the same bit rate as the input stream.&#xA;    m_output_video_stream->codecpar->bit_rate = m_format_context->streams[m_video_stream_index]->codecpar->bit_rate;&#xA;    m_output_video_stream->avg_frame_rate = m_format_context->streams[m_video_stream_index]->avg_frame_rate;&#xA;    avcodec_parameters_to_context(m_output_video_codec_context, m_output_video_stream->codecpar);&#xA;    m_output_video_codec_context->time_base = m_format_context->streams[m_video_stream_index]->time_base;&#xA;    &#xA;    //TODO(P1): Set these to match the input stream?&#xA;    m_output_video_codec_context->max_b_frames = 2;&#xA;    m_output_video_codec_context->gop_size = 12;&#xA;    m_output_video_codec_context->framerate = m_format_context->streams[m_video_stream_index]->r_frame_rate;&#xA;    //m_output_codec_context->refcounted_frames = 0;&#xA;    if (m_output_video_stream->codecpar->codec_id == AV_CODEC_ID_H264) {&#xA;        av_opt_set(m_output_video_codec_context, "preset", "ultrafast", 0);&#xA;    } else if (m_output_video_stream->codecpar->codec_id == AV_CODEC_ID_H265) {&#xA;        av_opt_set(m_output_video_codec_context, "preset", "ultrafast", 0);&#xA;    } else {&#xA;        av_opt_set_int(m_output_video_codec_context, "lossless", 1, 0);&#xA;    }&#xA;    avcodec_parameters_from_context(m_output_video_stream->codecpar, m_output_video_codec_context);&#xA;&#xA;    m_output_audio_codec = avcodec_find_encoder(m_output_format->audio_codec);&#xA;    if (!m_output_audio_codec) {&#xA;        printf("Failed to create audio codec.\n");&#xA;        return false;&#xA;    }&#xA;

    &#xA;

    I've commented out all of the audio stream init beyond this next line, because this is where&#xA;the trouble begins. Creating this output stream causes the null reference I mentioned. If I&#xA;uncomment everything below here, I still get the null deref. If I comment out this line, the&#xA;deref exception vanishes. (IOW, I commented out more and more code until I found that this&#xA;was the trigger that caused the problem.)

    &#xA;

    I assume that there's something I'm doing wrong in the rest of the commented out code, that,&#xA;when fixed, will fix the nullptr and give me a working audio stream.

    &#xA;

        m_output_audio_stream = avformat_new_stream(m_output_format_context, m_output_audio_codec);&#xA;    if (!m_output_audio_stream) {&#xA;        printf("Failed to find audio format.\n");&#xA;        return false;&#xA;    }&#xA;    /*&#xA;    m_output_audio_codec_context = avcodec_alloc_context3(m_output_audio_codec);&#xA;    if (!m_output_audio_codec_context) {&#xA;        printf("Failed to create audio codec context.\n");&#xA;        return(false);&#xA;    }&#xA;    m_output_audio_stream->codecpar->codec_id = m_output_format->audio_codec;&#xA;    m_output_audio_stream->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;&#xA;    m_output_audio_stream->codecpar->format = m_format_context->streams[m_audio_stream_index]->codecpar->format;&#xA;    m_output_audio_stream->codecpar->bit_rate = m_format_context->streams[m_audio_stream_index]->codecpar->bit_rate;&#xA;    m_output_audio_stream->avg_frame_rate = m_format_context->streams[m_audio_stream_index]->avg_frame_rate;&#xA;    avcodec_parameters_to_context(m_output_audio_codec_context, m_output_audio_stream->codecpar);&#xA;    m_output_audio_codec_context->time_base = m_format_context->streams[m_audio_stream_index]->time_base;&#xA;    */&#xA;&#xA;    //TODO(P2): Free assets that have been allocated.&#xA;    err = avcodec_open2(m_output_video_codec_context, m_output_video_codec, nullptr);&#xA;    if (err &lt; 0) {&#xA;        printf("Failed to open codec.\n");&#xA;        return false;&#xA;    }&#xA;&#xA;    if (!(m_output_format->flags &amp; AVFMT_NOFILE)) {&#xA;        err = avio_open(&amp;m_output_format_context->pb, video_file_name.c_str(), AVIO_FLAG_WRITE);&#xA;        if (err &lt; 0) {&#xA;            printf("Failed to open output file.");&#xA;            return false;&#xA;        }&#xA;    }&#xA;&#xA;    err = avformat_write_header(m_output_format_context, NULL);&#xA;    if (err &lt; 0) {&#xA;        printf("Failed to write header.\n");&#xA;        return false;&#xA;    }&#xA;&#xA;    av_dump_format(m_output_format_context, 0, video_file_name.c_str(), 1);&#xA;&#xA;    return true;&#xA;}&#xA;&#xA;&#xA;//TODO(P2): make this a member. (Thanks to https://emvlo.wordpress.com/2016/03/10/sws_scale/)&#xA;void PrepareFlipFrameJ420(AVFrame* pFrame) {&#xA;    for (int i = 0; i &lt; 4; i&#x2B;&#x2B;) {&#xA;        if (i)&#xA;            pFrame->data[i] &#x2B;= pFrame->linesize[i] * ((pFrame->height >> 1) - 1);&#xA;        else&#xA;            pFrame->data[i] &#x2B;= pFrame->linesize[i] * (pFrame->height - 1);&#xA;        pFrame->linesize[i] = -pFrame->linesize[i];&#xA;    }&#xA;}&#xA;

    &#xA;

    This is where we take an altered frame and write it to the output container. This works fine&#xA;as long as we haven't set up an audio stream in the output container.

    &#xA;

    bool MediaContainerMgr::output_video_frame(uint8_t* buf) {&#xA;    int err;&#xA;&#xA;    if (!m_output_video_frame) {&#xA;        m_output_video_frame = av_frame_alloc();&#xA;        m_output_video_frame->format = AV_PIX_FMT_YUV420P;&#xA;        m_output_video_frame->width = m_output_video_codec_context->width;&#xA;        m_output_video_frame->height = m_output_video_codec_context->height;&#xA;        err = av_frame_get_buffer(m_output_video_frame, 32);&#xA;        if (err &lt; 0) {&#xA;            printf("Failed to allocate output frame.\n");&#xA;            return false;&#xA;        }&#xA;    }&#xA;&#xA;    if (!m_output_scale_context) {&#xA;        m_output_scale_context = sws_getContext(m_output_video_codec_context->width, m_output_video_codec_context->height, &#xA;                                                AV_PIX_FMT_RGB24,&#xA;                                                m_output_video_codec_context->width, m_output_video_codec_context->height, &#xA;                                                AV_PIX_FMT_YUV420P, SWS_BICUBIC, nullptr, nullptr, nullptr);&#xA;    }&#xA;&#xA;    int inLinesize[1] = { 3 * m_output_video_codec_context->width };&#xA;    sws_scale(m_output_scale_context, (const uint8_t* const*)&amp;buf, inLinesize, 0, m_output_video_codec_context->height,&#xA;              m_output_video_frame->data, m_output_video_frame->linesize);&#xA;    PrepareFlipFrameJ420(m_output_video_frame);&#xA;    //TODO(P0): Switch m_frame to be m_input_video_frame so I don&#x27;t end up using the presentation timestamp from&#xA;    //          an audio frame if I threadify the frame reading.&#xA;    m_output_video_frame->pts = m_frame->pts;&#xA;    printf("Output PTS: %d, time_base: %d/%d\n", m_output_video_frame->pts,&#xA;        m_output_video_codec_context->time_base.num, m_output_video_codec_context->time_base.den);&#xA;    err = avcodec_send_frame(m_output_video_codec_context, m_output_video_frame);&#xA;    if (err &lt; 0) {&#xA;        printf("  ERROR sending new video frame output: ");&#xA;        switch (err) {&#xA;        case AVERROR(EAGAIN):&#xA;            printf("AVERROR(EAGAIN): %d\n", err);&#xA;            break;&#xA;        case AVERROR_EOF:&#xA;            printf("AVERROR_EOF: %d\n", err);&#xA;            break;&#xA;        case AVERROR(EINVAL):&#xA;            printf("AVERROR(EINVAL): %d\n", err);&#xA;            break;&#xA;        case AVERROR(ENOMEM):&#xA;            printf("AVERROR(ENOMEM): %d\n", err);&#xA;            break;&#xA;        }&#xA;&#xA;        return false;&#xA;    }&#xA;&#xA;    AVPacket pkt;&#xA;    av_init_packet(&amp;pkt);&#xA;    pkt.data = nullptr;&#xA;    pkt.size = 0;&#xA;    pkt.flags |= AV_PKT_FLAG_KEY;&#xA;    int ret = 0;&#xA;    if ((ret = avcodec_receive_packet(m_output_video_codec_context, &amp;pkt)) == 0) {&#xA;        static int counter = 0;&#xA;        printf("pkt.key: 0x%08x, pkt.size: %d, counter:\n", pkt.flags &amp; AV_PKT_FLAG_KEY, pkt.size, counter&#x2B;&#x2B;);&#xA;        uint8_t* size = ((uint8_t*)pkt.data);&#xA;        printf("sizes: %d %d %d %d %d %d %d %d %d\n", size[0], size[1], size[2], size[2], size[3], size[4], size[5], size[6], size[7]);&#xA;        av_interleaved_write_frame(m_output_format_context, &amp;pkt);&#xA;    }&#xA;    printf("push: %d\n", ret);&#xA;    av_packet_unref(&amp;pkt);&#xA;&#xA;    return true;&#xA;}&#xA;&#xA;bool MediaContainerMgr::finalize_output() {&#xA;    if (!m_recording)&#xA;        return true;&#xA;&#xA;    AVPacket pkt;&#xA;    av_init_packet(&amp;pkt);&#xA;    pkt.data = nullptr;&#xA;    pkt.size = 0;&#xA;&#xA;    for (;;) {&#xA;        avcodec_send_frame(m_output_video_codec_context, nullptr);&#xA;        if (avcodec_receive_packet(m_output_video_codec_context, &amp;pkt) == 0) {&#xA;            av_interleaved_write_frame(m_output_format_context, &amp;pkt);&#xA;            printf("final push:\n");&#xA;        } else {&#xA;            break;&#xA;        }&#xA;    }&#xA;&#xA;    av_packet_unref(&amp;pkt);&#xA;&#xA;    av_write_trailer(m_output_format_context);&#xA;    if (!(m_output_format->flags &amp; AVFMT_NOFILE)) {&#xA;        int err = avio_close(m_output_format_context->pb);&#xA;        if (err &lt; 0) {&#xA;            printf("Failed to close file. err: %d\n", err);&#xA;            return false;&#xA;        }&#xA;    }&#xA;&#xA;    return true;&#xA;}&#xA;

    &#xA;

    EDIT&#xA;The call stack on the crash (which I should have included in the original question) :

    &#xA;

    avformat-58.dll!compute_muxer_pkt_fields(AVFormatContext * s, AVStream * st, AVPacket * pkt) Line 630   C&#xA;avformat-58.dll!write_packet_common(AVFormatContext * s, AVStream * st, AVPacket * pkt, int interleaved) Line 1122  C&#xA;avformat-58.dll!write_packets_common(AVFormatContext * s, AVPacket * pkt, int interleaved) Line 1186    C&#xA;avformat-58.dll!av_interleaved_write_frame(AVFormatContext * s, AVPacket * pkt) Line 1241   C&#xA;CamBot.exe!MediaContainerMgr::output_video_frame(unsigned char * buf) Line 553  C&#x2B;&#x2B;&#xA;CamBot.exe!main() Line 240  C&#x2B;&#x2B;&#xA;

    &#xA;

    If I move the call to avformat_write_header so it's immediately before the audio stream initialization, I still get a crash, but in a different place. The crash happens on line 6459 of movenc.c, where we have :

    &#xA;

    /* Non-seekable output is ok if using fragmentation. If ism_lookahead&#xA; * is enabled, we don&#x27;t support non-seekable output at all. */&#xA;if (!(s->pb->seekable &amp; AVIO_SEEKABLE_NORMAL) &amp;&amp;  //  CRASH IS HERE&#xA;    (!(mov->flags &amp; FF_MOV_FLAG_FRAGMENT) || mov->ism_lookahead)) {&#xA;    av_log(s, AV_LOG_ERROR, "muxer does not support non seekable output\n");&#xA;    return AVERROR(EINVAL);&#xA;}&#xA;

    &#xA;

    The exception is a nullptr exception, where s->pb is NULL. The call stack is :

    &#xA;

    avformat-58.dll!mov_init(AVFormatContext * s) Line 6459 C&#xA;avformat-58.dll!init_muxer(AVFormatContext * s, AVDictionary * * options) Line 407  C&#xA;[Inline Frame] avformat-58.dll!avformat_init_output(AVFormatContext *) Line 489 C&#xA;avformat-58.dll!avformat_write_header(AVFormatContext * s, AVDictionary * * options) Line 512   C&#xA;CamBot.exe!MediaContainerMgr::init_video_output(const std::string &amp; video_file_name, unsigned int width, unsigned int height) Line 424  C&#x2B;&#x2B;&#xA;CamBot.exe!main() Line 183  C&#x2B;&#x2B;&#xA;

    &#xA;

  • Subtitling Sierra VMD Files

    1er juin 2016, par Multimedia Mike — Game Hacking

    I was contacted by a game translation hobbyist from Spain (henceforth known as The Translator). He had set his sights on Sierra’s 7-CD Phantasmagoria. This mammoth game was driven by a lot of FMV files and animations that have speech. These require language translation in the form of video subtitling. He’s lucky that he found possibly the one person on the whole internet who has just the right combination of skill, time, and interest to pull this off. And why would I care about helping ? I guess I share a certain camaraderie with game hackers. Don’t act so surprised. You know what kind of stuff I like to work on.

    The FMV format used in this game is VMD, which makes an appearance in numerous Sierra titles. FFmpeg already supports decoding this format. FFmpeg also supports subtitling video. So, ideally, all that’s necessary to support this goal is to add a muxer for the VMD format which can encode raw video and audio, which the format supports. Implement video compression as extra credit.

    The pipeline that I envisioned looks like this :


    VMD Subtitling Process

    VMD Subtitling Process


    “Trivial !” I surmised. I just never learn, do I ?

    The Plan
    So here’s my initial pitch, outlining the work I estimated that I would need to do towards the stated goal :

    1. Create a new file muxer that produces a syntactically valid VMD file with bogus video and audio data. Make sure it works with both FFmpeg’s playback system as well as the proper Phantasmagoria engine.
    2. Create a new video encoder that essentially operates in pass-through mode while correctly building a palette.
    3. Create a new basic encoder for the video frames.

    A big unknown for me was exactly how subtitle handling operates in FFmpeg. Thanks to this project, I now know. I was concerned because I was pretty sure that font rendering entails anti-aliasing which bodes poorly for keeping the palette count under 256 unique colors.

    Computer Science Puzzle
    When pondering how to process the palette, I was excited for the opportunity to exercise actual computer science. FFmpeg converts frames from paletted frames to full RGB frames. Then it needs to convert them back to paletted frames. I had a vague recollection of solving this problem once before when I was experimenting with a new paletted video codec. I seem to recall that I did the palette conversion in a very naive manner. I just used a static 256-element array and processed each RGB pixel of the frame, seeing if the value already occurred in the table (O(n) lookup) and adding it otherwise.

    There are more efficient algorithms, however, such as hash tables and trees. Somewhere along the line, FFmpeg helpfully acquired a rarely-used tree data structure, which was perfect for this project.

    So I was pretty pleased with this optimization. Too bad this wouldn’t survive to the end of the effort.

    Another palette-related challenge was the fact that a group of pictures would be accumulating a new palette but that palette needed to be recorded before the group. Thus, the muxer needed to have extra logic to rewind the file when the video encoder transmitted a palette change.

    Video Compression
    VMD has a few methods in its compression toolbox. It can use interframe differencing, it has some RLE, or it can code a frame raw. It can also use a custom LZ-like format on top of these. For early prototypes, I elected to leave each frame coded raw. After the concept was proved, I implemented the frame differencing.


    VMD frame #1

    VMD frame #2

    VMD frame difference
    Top frame compared with the middle frame yields the bottom frame : red pixels indicate changes

    Encoding only those red dots in between vast runs of unchanged pixels yielded a vast measurable improvement. The next step was to try wiring up FFmpeg’s existing LZ compression facilities to the encoder. This turned out to be implausible since VMD’s LZ variant has nothing to do with anything FFmpeg already provides. Fortunately, the LZ piece is not absolutely required and the frame differencing + RLE provides plenty of compression.

    Subtitling
    I’ve never done anything, multimedia programming-wise, concerning subtitles. I guess all the entertainment I care about has always been in my native tongue. What a good excuse to program outside of my comfort zone !

    First, I needed to know how to access FFmpeg’s subtitling facilities. Fortunately, The Translator did the legwork on this matter so I didn’t have to figure it out.

    However, I intuitively had misgivings about this phase. I had heard that the subtitling process performs anti-aliasing. That means that the image would need to be promoted to a higher colorspace for this phase and that the anti-aliasing process would likely push the color count way past 256. Some quick tests revealed this to be the case, as the running color count would leap by several hundred colors as soon as the palette accounting algorithm encountered a subtitle.

    So I dug into the subtitle subsystem. I discovered that the subtitle library operates by creating a linked list of subtitle bitmaps that the client app must render. The bitmaps are comprised of 8-bit alpha transparency values that must be composited onto the target frame (i.e., 0 = transparent, 255 = 100% opaque). For example, the letter ‘H’ :

                                      (with 00s removed)
    13 F8 41 00 00 00 00 68 E4  |  13 F8 41             68 E4    
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    14 FF DC D0 D0 D0 D0 E4 EC  |  14 FF DC D0 D0 D0 D0 E4 EC
    14 FF 7E 50 50 50 50 9A EC  |  14 FF 7E 50 50 50 50 9A EC
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    14 FF 44 00 00 00 00 6C EC  |  14 FF 44             6C EC
    11 E0 3B 00 00 00 00 5E CE  |  11 E0 3B             5E CE
    

    To get around the color explosion problem, I chose a threshold value and quantized values above and below to 255 and 0, respectively. Further, the process chooses an appropriate color from the existing palette rather than introducing any new colors.

    Muxing Matters
    In order to force VMD into a general purpose media framework, a lot of special information needs to be passed around. Like many paletted codecs, the palette needs to be transmitted from the file demuxer to the video decoder via some side channel. For re-encoding, this also implies that the palette needs to make the trip from the video encoder to the file muxer. As if this wasn’t enough, individual VMD frames have even more data that needs to be ferried between the muxer and codec levels, including frame change boundaries. FFmpeg provides methods to do these things, but I could not always rely on the systems to relay the data in all cases. I was probably doing something wrong ; I accept that. Instead, I just packed all the information at the front of an encoded frame and split it apart in the muxer.

    I could not quite figure out how to get the audio and video muxed correctly. As a result, neither FFmpeg nor the Phantasmagoria engine could replay the files correctly.

    Plan B
    Since I was having so much trouble creating an entirely new VMD file, likely due to numerous unknown bits of the file format, I thought of another angle : re-use the existing VMD file. For this approach, I kept the video encoder and file muxer that I created in the initial phase, but modified the file muxer to emit a special intermediate file. Then, I created a Python tool to repackage the original VMD file using compressed video data in the intermediate file.

    For this phase, I also implemented a command line switch for FFmpeg to disable subtitle blending, to make the feature feel like less of an unofficial hack, as though this nonsense would ever have a chance of being incorporated upstream.

    At this point, I was seeing some success with the complete, albeit roundabout, subtitling process. I constructed a subtitle file using “Spanish I Learned From Mexican Telenovelas” and the frames turned out fairly readable :


    Le puso los cuernos a él

    “she cheated on him”


    es un desgraciado

    “he’s a scumbag” … these random subtitles could fit surprisingly well !


    The few files that I tested appeared to work fine. But then I handed off my work to The Translator and he immediately found a bunch of problems. According to my notes, the problems mostly took the form of flashing, solid color frames. Further, I found tiny, mostly imperceptible flaws in my RLE compressor, usually only detectable by running strict comparison tools ; but I wasn’t satisfied.

    At this point, I think I attempted to just encode the entire palette at the front of each frame, as allowed by the format, but that did not seem to fix any problems. My notes are not completely clear on this matter (likely because I was still trying to figure out the exact problem), but I think it had to do with FFmpeg inserting extra video frames in order to even out gaps in the video framerate.

    Sigh, Plan C
    At this point, I was getting tired of trying to force FFmpeg to do this. So I decided to minimize its involvement using lessons learned up to this point.

    The next pitch :

    1. Create a new C program that can open an existing VMD file and output an identical VMD file. I know this sounds easy, but the specific method of copying entails interpreting individual parts of the file and writing those individual parts to the new file. This is in preparation for…
    2. Import the VMD video decoder functions directly into the program to decode the individual video frames and re-encode them, replacing the video frames as the file is rewritten.
    3. Wire up the subtitle system. During the adventure to disable subtitle blending, I accidentally learned enough about interfacing to the subtitle library to just invoke it directly.
    4. Rewrite the RLE method so that it is 100% correct.

    Off to work I went. That part about lifting the existing VMD decoder functions out of their libavcodec nest turned out to not be that straightforward. As an alternative, I modified the decoder to dump the raw frames to an intermediate file. In doing so, I think I was able to avoid the issue of the duplicated frames that plagued the previous efforts.

    Also, remember how I was really pleased with the palette conversion technique in which I was able to leverage computer science big-O theory ? By this stage, I had no reason to convert the paletted video to RGB in the first place ; all of the decoding, subtitling and re-encoding operates in the paletted colorspace.

    This approach seemed to work pretty well. The final program is subtitle-vmd.c. The process is still a little weird. The modifications in my own FFmpeg fork are necessary to create an intermediate file that the new C tool can operate with.

    Next Steps
    The Translator has found some assorted bugs and corner cases that still need to be ironed out. Further, for extra credit, I need find the change windows for each frame to improve compression just a little more. I don’t think I will be trying for LZ compression, though.

    However, almost as soon as I had this whole system working, The Translator informed me that there is another, different movie format in play in the Phantasmagoria engine called ROBOT, with an extension of RBT. Fortunately, enough of the algorithms have been reverse engineered and re-implemented in ScummVM that I was able to sort out enough details for another subtitling project. That will be the subject of a future post.

    See Also :

  • ffmpeg error when using non root user

    29 août 2014, par mkern

    I have installed ffmpeg and it works perfect if you are root or using sudo but it errors out when trying to use it as a non-root user. I have performed the same install on a test VPS and it installs without issue so it appears to be isolated to this cPanel server. I haven’t been able to identify why.

    Non-Root :

    > ffmpeg -v debug -i 1.mov 1.avi ffmpeg version N-65949-g0ddb051
    > Copyright (c) 2000-2014 the FFmpeg developers   built on Aug 28 2014
    > 11:39:47 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)  
    > configuration: --enable-gpl --enable-libmp3lame --enable-libvorbis
    > --enable-libvpx --enable-libx264   libavutil      54.  7.100 / 54.  7.100   libavcodec     56.  0.101 / 56.  0.101   libavformat    56.  3.100 / 56.  3.100   libavdevice    56.  0.100 / 56.  0.100   libavfilter     5.  0.103 /  5.  0.103   libswscale      3.  0.100 /
    > 3.  0.100   libswresample   1.  1.100 /  1.  1.100   libpostproc    53.  0.100 / 53.  0.100 Splitting the commandline. Reading option '-v' ... matched as option 'v' (set logging level) with argument 'debug'.
    > Reading option '-i' ... matched as input file with argument '1.mov'.
    > Reading option '1.avi' ... matched as output file. Finished splitting
    > the commandline. Parsing a group of options: global . Applying option
    > v (set logging level) with argument debug. Successfully parsed a group
    > of options. Parsing a group of options: input file 1.mov. Successfully
    > parsed a group of options. Opening an input file: 1.mov.
    > [mov,mp4,m4a,3gp,3g2,mj2 @ 0x348fc20] Format mov,mp4,m4a,3gp,3g2,mj2
    > probed with size=2048 and score=100 [mov,mp4,m4a,3gp,3g2,mj2 @
    > 0x348fc20] ISO: File Type Major Brand: qt   [mov,mp4,m4a,3gp,3g2,mj2 @
    > 0x348fc20] Before avformat_find_stream_info() pos: 698348 bytes
    > read:39602 seeks:1 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x348fc20] All info
    > found [mov,mp4,m4a,3gp,3g2,mj2 @ 0x348fc20] After
    > avformat_find_stream_info() pos: 169190 bytes read:2333362 seeks:67
    > frames:148 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mov':  
    > Metadata:
    >     major_brand     : qt  
    >     minor_version   : 0
    >     compatible_brands: qt  
    >     creation_time   : 2014-06-05 04:40:27
    >     model           : iPhone 5
    >     model-eng       : iPhone 5
    >     encoder         : 7.1.1
    >     encoder-eng     : 7.1.1
    >     date            : 2014-06-04T21:40:27-0700
    >     date-eng        : 2014-06-04T21:40:27-0700
    >     make            : Apple
    >     make-eng        : Apple   Duration: 00:00:07.15, start: 0.000023, bitrate: 781 kb/s
    >     Stream #0:0(und), 41, 1/600: Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 480x360, 1/1200, 710 kb/s, 29.09
    > fps, 600 tbr, 600 tbn, 1200 tbc (default)
    >     Metadata:
    >       rotate          : 90
    >       creation_time   : 2014-06-05 04:40:27
    >       handler_name    : Core Media Data Handler
    >       encoder         : H.264
    >     Side data:
    >       displaymatrix: rotation of -90.00 degrees
    >     Stream #0:1(und), 107, 1/44100: Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    >     Metadata:
    >       creation_time   : 2014-06-05 04:40:27
    >       handler_name    : Core Media Data Handler Successfully opened the file. Parsing a group of options: output file 1.avi. Successfully
    > parsed a group of options. Opening an output file: 1.avi. Successfully
    > opened the file. detected 24 logical cores [graph 0 input from stream
    > 0:0 @ 0x34aa3a0] Setting 'video_size' to value '480x360' [graph 0
    > input from stream 0:0 @ 0x34aa3a0] Setting 'pix_fmt' to value '0'
    > [graph 0 input from stream 0:0 @ 0x34aa3a0] Setting 'time_base' to
    > value '1/600' [graph 0 input from stream 0:0 @ 0x34aa3a0] Setting
    > 'pixel_aspect' to value '0/1' [graph 0 input from stream 0:0 @
    > 0x34aa3a0] Setting 'sws_param' to value 'flags=2' [graph 0 input from
    > stream 0:0 @ 0x34aa3a0] Setting 'frame_rate' to value '320/11' [graph
    > 0 input from stream 0:0 @ 0x34aa3a0] w:480 h:360 pixfmt:yuv420p
    > tb:1/600 fr:320/11 sar:0/1 sws_param:flags=2 [format @ 0x3496b00]
    > compat: called with args=[yuv420p] [format @ 0x3496b00] Setting
    > 'pix_fmts' to value 'yuv420p' [AVFilterGraph @ 0x348f320]
    > query_formats: 4 queried, 3 merged, 0 already done, 0 delayed
    > [AVFilterGraph @ 0x34bbe60] Error initializing threading.
    > [AVFilterGraph @ 0x34bbe60] Error creating filter 'anull' Error
    > opening filters! [AVIOContext @ 0x34967c0] Statistics: 0 seeks, 0
    > writeouts [AVIOContext @ 0x348f1e0] Statistics: 2333362 bytes read, 67
    > seeks

    [AVFilterGraph @ 0x34bbe60] Error initializing threading.
    [AVFilterGraph @ 0x34bbe60] Error creating filter ’anull’ Error
    opening filters !

    As ROOT :

    ffmpeg -v verbose -i 1.mov 1.avi
    ffmpeg version N-65949-g0ddb051 Copyright (c) 2000-2014 the FFmpeg developers
     built on Aug 28 2014 11:39:47 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
     configuration: --enable-gpl --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264
     libavutil      54.  7.100 / 54.  7.100
     libavcodec     56.  0.101 / 56.  0.101
     libavformat    56.  3.100 / 56.  3.100
     libavdevice    56.  0.100 / 56.  0.100
     libavfilter     5.  0.103 /  5.  0.103
     libswscale      3.  0.100 /  3.  0.100
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  0.100 / 53.  0.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mov':
     Metadata:
       major_brand     : qt  
       minor_version   : 0
       compatible_brands: qt  
       creation_time   : 2014-06-05 04:40:27
       model           : iPhone 5
       model-eng       : iPhone 5
       encoder         : 7.1.1
       encoder-eng     : 7.1.1
       date            : 2014-06-04T21:40:27-0700
       date-eng        : 2014-06-04T21:40:27-0700
       make            : Apple
       make-eng        : Apple
     Duration: 00:00:07.15, start: 0.000023, bitrate: 781 kb/s
       Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 480x360, 710 kb/s, 29.09 fps, 600 tbr, 600 tbn, 1200 tbc (default)
       Metadata:
         rotate          : 90
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
         encoder         : H.264
       Side data:
         displaymatrix: rotation of -90.00 degrees
       Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
       Metadata:
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
    [graph 0 input from stream 0:0 @ 0x27ed3a0] w:480 h:360 pixfmt:yuv420p tb:1/600 fr:320/11 sar:0/1 sws_param:flags=2
    [graph 1 input from stream 0:1 @ 0x2800700] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:0x4
    Output #0, avi, to '1.avi':
     Metadata:
       major_brand     : qt  
       minor_version   : 0
       compatible_brands: qt  
       make-eng        : Apple
       model           : iPhone 5
       model-eng       : iPhone 5
       make            : Apple
       ISFT            : Lavf56.3.100
       ICRD            : 2014-06-04T21:40:27-0700
       date-eng        : 2014-06-04T21:40:27-0700
       Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 480x360, q=2-31, 200 kb/s, 29.09 fps, 29.09 tbn, 29.09 tbc (default)
       Metadata:
         rotate          : 90
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
         encoder         : Lavc56.0.101 mpeg4
       Stream #0:1(und): Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, mono, fltp (default)
       Metadata:
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
         encoder         : Lavc56.0.101 libmp3lame
    Stream mapping:
     Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native))
     Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
    Press [q] to stop, [?] for help
    *** dropping frame 79 from stream 0 at ts 80
    *** dropping frame 113 from stream 0 at ts 114
    *** dropping frame 145 from stream 0 at ts 146
    *** dropping frame 177 from stream 0 at ts 178
    No more output streams to write to, finishing.
    frame=  204 fps=0.0 q=27.2 Lsize=     348kB time=00:00:07.15 bitrate= 398.4kbits/s dup=0 drop=4    
    video:271kB audio:56kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 6.560985%
    Input file #0 (1.mov):
     Input stream #0:0 (video): 208 packets read (634624 bytes); 208 frames decoded;
     Input stream #0:1 (audio): 308 packets read (56854 bytes); 308 frames decoded (315392 samples);
     Total: 516 packets (691478 bytes) demuxed
    Output file #0 (1.avi):
     Output stream #0:0 (video): 204 frames encoded; 204 packets muxed (276993 bytes);
     Output stream #0:1 (audio): 274 frames encoded (315392 samples); 275 packets muxed (57469 bytes);
     Total: 479 packets (334462 bytes) muxed

    strace and strace -e outputs :
    strace non root :

    579 clone(child_stack=0x7fd3bfd07ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fd3bfd089d0, tls=0x7fd3bfd08700, child_tidptr=0x7fd3bfd089d0) = 3        2637
       580 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fd3bed07000
       581 mprotect(0x7fd3bed07000, 4096, PROT_NONE) = 0
       582 clone(child_stack=0x7fd3bf506ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fd3bf5079d0, tls=0x7fd3bf507700, child_tidptr=0x7fd3bf5079d0) = -        1 EAGAIN (Resource temporarily unavailable)
       583 futex(0x253b420, FUTEX_WAKE_PRIVATE, 1) = 1
       584 futex(0x253b3f4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x253b420, 4) = 2
       585 futex(0x253b420, FUTEX_WAKE_PRIVATE, 1) = 1
       586 futex(0x7fd3c2d0e9d0, FUTEX_WAIT, 32631, NULL) = 0
       587 munmap(0x7fd3bed07000, 8392704)         = 0
       588 munmap(0x7fd3c250e000, 8392704)         = 0
       589 munmap(0x7fd3c1d0d000, 8392704)         = 0
       590 munmap(0x7fd3c150c000, 8392704)         = 0
       591 write(2, "\33[1;32m[AVFilterGraph @ 0x253b0a"..., 39[AVFilterGraph @ 0x253b0a0] ) = 39
       592 write(2, "\33[1;31mError initializing thread"..., 41Error initializing threading.
       593 ) = 41
       594 write(2, "\33[1;32m[AVFilterGraph @ 0x253b0a"..., 39[AVFilterGraph @ 0x253b0a0] ) = 39
       595 write(2, "\33[1;31mError creating filter 'an"..., 41Error creating filter 'anull'
       596 ) = 41
       597 write(2, "\33[4;31mError opening filters!\n\33["..., 34Error opening filters!
       598 ) = 34

    strace -e non root :

    strace -e open ffmpeg -i 1.mov 5.avi
    open("/etc/ld.so.cache", O_RDONLY)      = 3
    open("/lib64/libasound.so.2", O_RDONLY) = 3
    open("/usr/lib64/libSDL-1.2.so.0", O_RDONLY) = 3
    open("/lib64/libpthread.so.0", O_RDONLY) = 3
    open("/usr/lib64/libx264.so.142", O_RDONLY) = 3
    open("/usr/lib64/libvpx.so.0", O_RDONLY) = 3
    open("/usr/local/lib/libvorbisenc.so.2", O_RDONLY) = 3
    open("/usr/local/lib/libvorbis.so.0", O_RDONLY) = 3
    open("/usr/local/lib/libmp3lame.so.0", O_RDONLY) = 3
    open("/lib64/libm.so.6", O_RDONLY)      = 3
    open("/lib64/libbz2.so.1", O_RDONLY)    = 3
    open("/usr/local/lib/libz.so.1", O_RDONLY) = 3
    open("/lib64/librt.so.1", O_RDONLY)     = 3
    open("/lib64/libc.so.6", O_RDONLY)      = 3
    open("/lib64/libdl.so.2", O_RDONLY)     = 3
    open("/usr/local/lib/libogg.so.0", O_RDONLY) = 3
    ffmpeg version N-65949-g0ddb051 Copyright (c) 2000-2014 the FFmpeg developers
     built on Aug 28 2014 11:39:47 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
     configuration: --enable-gpl --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264
     libavutil      54.  7.100 / 54.  7.100
     libavcodec     56.  0.101 / 56.  0.101
     libavformat    56.  3.100 / 56.  3.100
     libavdevice    56.  0.100 / 56.  0.100
     libavfilter     5.  0.103 /  5.  0.103
     libswscale      3.  0.100 /  3.  0.100
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  0.100 / 53.  0.100
    open("1.mov", O_RDONLY|O_CLOEXEC)       = 3
    open("/etc/localtime", O_RDONLY)        = 4
    open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 4
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mov':
     Metadata:
       major_brand     : qt  
       minor_version   : 0
       compatible_brands: qt  
       creation_time   : 2014-06-05 04:40:27
       model           : iPhone 5
       model-eng       : iPhone 5
       encoder         : 7.1.1
       encoder-eng     : 7.1.1
       date            : 2014-06-04T21:40:27-0700
       date-eng        : 2014-06-04T21:40:27-0700
       make            : Apple
       make-eng        : Apple
     Duration: 00:00:07.15, start: 0.000023, bitrate: 781 kb/s
       Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 480x360, 710 kb/s, 29.09 fps, 600 tbr, 600 tbn, 1200 tbc (default)
       Metadata:
         rotate          : 90
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
         encoder         : H.264
       Side data:
         displaymatrix: rotation of -90.00 degrees
       Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
       Metadata:
         creation_time   : 2014-06-05 04:40:27
         handler_name    : Core Media Data Handler
    open("5.avi", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 4
    [AVFilterGraph @ 0x26ff4a0] Error initializing threading.
    [AVFilterGraph @ 0x26ff4a0] Error creating filter 'anull'
    Error opening filters!

    strace root :

    579 clone(child_stack=0x7f4eb7c34ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb7c359d0, tls=0x7f4eb7c35700, child_tidptr=0x7f4eb7c359d0) = 3        383
       580 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb6c34000
       581 mprotect(0x7f4eb6c34000, 4096, PROT_NONE) = 0
       582 clone(child_stack=0x7f4eb7433ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb74349d0, tls=0x7f4eb7434700, child_tidptr=0x7f4eb74349d0) = 3        384
       583 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb6433000
       584 mprotect(0x7f4eb6433000, 4096, PROT_NONE) = 0
       585 clone(child_stack=0x7f4eb6c32ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb6c339d0, tls=0x7f4eb6c33700, child_tidptr=0x7f4eb6c339d0) = 3        385
       586 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb5c32000
       587 mprotect(0x7f4eb5c32000, 4096, PROT_NONE) = 0
       588 clone(child_stack=0x7f4eb6431ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb64329d0, tls=0x7f4eb6432700, child_tidptr=0x7f4eb64329d0) = 3        386
       589 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb5431000
       590 mprotect(0x7f4eb5431000, 4096, PROT_NONE) = 0
       591 clone(child_stack=0x7f4eb5c30ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb5c319d0, tls=0x7f4eb5c31700, child_tidptr=0x7f4eb5c319d0) = 3        387
       592 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb4c30000
       593 mprotect(0x7f4eb4c30000, 4096, PROT_NONE) = 0
       594 clone(child_stack=0x7f4eb542fff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb54309d0, tls=0x7f4eb5430700, child_tidptr=0x7f4eb54309d0) = 3        388
       595 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb442f000
       596 mprotect(0x7f4eb442f000, 4096, PROT_NONE) = 0
       597 clone(child_stack=0x7f4eb4c2eff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|        CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4eb4c2f9d0, tls=0x7f4eb4c2f700, child_tidptr=0x7f4eb4c2f9d0) = 3        389
       598 mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f4eb3c2e000

    strace -e root :

       strace -e open ffmpeg -i 1.mov 5.avi
       open("/etc/ld.so.cache", O_RDONLY)      = 3
       open("/lib64/libasound.so.2", O_RDONLY) = 3
       open("/usr/lib64/libSDL-1.2.so.0", O_RDONLY) = 3
       open("/lib64/libpthread.so.0", O_RDONLY) = 3
       open("/usr/lib64/libx264.so.142", O_RDONLY) = 3
       open("/usr/lib64/libvpx.so.0", O_RDONLY) = 3
       open("/usr/local/lib/libvorbisenc.so.2", O_RDONLY) = 3
       open("/usr/local/lib/libvorbis.so.0", O_RDONLY) = 3
       open("/usr/local/lib/libmp3lame.so.0", O_RDONLY) = 3
       open("/lib64/libm.so.6", O_RDONLY)      = 3
       open("/lib64/libbz2.so.1", O_RDONLY)    = 3
       open("/usr/local/lib/libz.so.1", O_RDONLY) = 3
       open("/lib64/librt.so.1", O_RDONLY)     = 3
       open("/lib64/libc.so.6", O_RDONLY)      = 3
       open("/lib64/libdl.so.2", O_RDONLY)     = 3
       open("/usr/local/lib/libogg.so.0", O_RDONLY) = 3
       ffmpeg version N-65957-gc6a3b00 Copyright (c) 2000-2014 the FFmpeg developers
         built on Aug 28 2014 13:37:32 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
         configuration: --enable-gpl --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --prefix=/usr --libdir=/usr/lib64 --enable-gpl --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264
         libavutil      54.  7.100 / 54.  7.100
         libavcodec     56.  0.101 / 56.  0.101
         libavformat    56.  3.100 / 56.  3.100
         libavdevice    56.  0.100 / 56.  0.100
         libavfilter     5.  0.103 /  5.  0.103
         libswscale      3.  0.100 /  3.  0.100
         libswresample   1.  1.100 /  1.  1.100
         libpostproc    53.  0.100 / 53.  0.100
       open("1.mov", O_RDONLY|O_CLOEXEC)       = 3
       open("/etc/localtime", O_RDONLY)        = 4
       open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 4
       Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mov':
         Metadata:
           major_brand     : qt  
           minor_version   : 0
           compatible_brands: qt  
           creation_time   : 2014-06-05 04:40:27
           model           : iPhone 5
           model-eng       : iPhone 5
           encoder         : 7.1.1
           encoder-eng     : 7.1.1
           date            : 2014-06-04T21:40:27-0700
           date-eng        : 2014-06-04T21:40:27-0700
           make            : Apple
           make-eng        : Apple
         Duration: 00:00:07.15, start: 0.000023, bitrate: 781 kb/s
           Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m), 480x360, 710 kb/s, 29.09 fps, 600 tbr, 600 tbn, 1200 tbc (default)
           Metadata:
             rotate          : 90
             creation_time   : 2014-06-05 04:40:27
             handler_name    : Core Media Data Handler
             encoder         : H.264
           Side data:
             displaymatrix: rotation of -90.00 degrees
           Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
           Metadata:
             creation_time   : 2014-06-05 04:40:27
             handler_name    : Core Media Data Handler
       File '5.avi' already exists. Overwrite ? [y/N] y
       open("5.avi", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 4
       Output #0, avi, to '5.avi':
         Metadata:
           major_brand     : qt  
           minor_version   : 0
           compatible_brands: qt  
           make-eng        : Apple
           model           : iPhone 5
           model-eng       : iPhone 5
           make            : Apple
           ISFT            : Lavf56.3.100
           ICRD            : 2014-06-04T21:40:27-0700
           date-eng        : 2014-06-04T21:40:27-0700
           Stream #0:0(und): Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 480x360, q=2-31, 200 kb/s, 29.09 fps, 29.09 tbn, 29.09 tbc (default)
           Metadata:
             rotate          : 90
             creation_time   : 2014-06-05 04:40:27
             handler_name    : Core Media Data Handler
             encoder         : Lavc56.0.101 mpeg4
           Stream #0:1(und): Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, mono, fltp (default)
           Metadata:
             creation_time   : 2014-06-05 04:40:27
             handler_name    : Core Media Data Handler
             encoder         : Lavc56.0.101 libmp3lame
       Stream mapping:
         Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native))
         Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
       Press [q] to stop, [?] for help
       frame=  204 fps=0.0 q=27.2 Lsize=     348kB time=00:00:07.15 bitrate= 398.4kbits/s dup=0 drop=4    
       video:271kB audio:56kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 6.560985%