To add all dependencies for a package in your module, run a command like the one below ("." refers to the package in the current directory):

$ go get .
To add a specific dependency, specify its module path as an argument to the command.

$ go get example.com/theirmodule

I managed to solve my issue. Turns out I needed a lot more code. I'm going to post my solution in case someone else runs into this similar issue since there doesn't seem to be many resources out there for Dynamo. Please note my read and write capacities are very low because this is for a dev environment. You might want to consider upping yours depending on your needs


var request = new UpdateTableRequest
        {
            TableName = "EmailMessage",
            AttributeDefinitions = new List<AttributeDefinition>
            {
                new AttributeDefinition
                {
                    AttributeName = "Status",
                    AttributeType = ScalarAttributeType.S
                }
            },
            GlobalSecondaryIndexUpdates = new List<GlobalSecondaryIndexUpdate>
            {
                new GlobalSecondaryIndexUpdate
                {
                    Create = new CreateGlobalSecondaryIndexAction
                    {
                        IndexName = "GSI_EmailMessage_Status",
                        KeySchema = new List<KeySchemaElement>
                        {
                            new KeySchemaElement("Status", KeyType.HASH)
                        },
                        Projection = new Projection
                        {
                            ProjectionType = ProjectionType.ALL
                        },
                        ProvisionedThroughput = new ProvisionedThroughput
                        {
                            ReadCapacityUnits = 4,
                            WriteCapacityUnits = 1,
                        }
                    }
                }
            }
        };

        var client = DynamoDBManager.DBFactory.GetClient();

        client.UpdateTable(request);

I finally managed to split my dependnecies step using this Dockerfile and by adding go-offline-maven-plugin.


FROM maven:3.6.1-jdk-12
WORKDIR /app

COPY pom.xml pom.xml
RUN mvn de.qaware.maven:go-offline-maven-plugin:resolve-dependencies

RUN find /root/.m2 -type f -name '_*.repositories' -delete

COPY . .
RUN mvn -o package spring-boot:repackage

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","target/my-service-1.0.1.jar"]

then, here is basically how apple does in a viewController (copied from link above) :


/*
Copyright (C) 2014 Apple Inc. All Rights Reserved.
See LICENSE.txt for this sample’s licensing information

*/

#import "GetLocationViewController.h"
#import "LocationDetailViewController.h"
#import "SetupViewController.h"
#import "CLLocation+Strings.h"

@interface GetLocationViewController () <SetupViewControllerDelegate, CLLocationManagerDelegate>

@property (nonatomic, weak) IBOutlet UIButton *startButton;
@property (nonatomic, weak) IBOutlet UILabel *descriptionLabel;
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, strong) SetupViewController* setupViewController;
@property (nonatomic, copy) NSString *stateString;

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@property (nonatomic, strong) NSMutableArray *locationMeasurements;
@property (nonatomic, strong) CLLocation *bestEffortAtLocation;

@end


#pragma mark -

@implementation GetLocationViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _locationMeasurements = [NSMutableArray array];
}

- (NSDateFormatter *)dateFormatter {
    if (_dateFormatter == nil) {
        _dateFormatter = [[NSDateFormatter alloc] init];
        [_dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        [_dateFormatter setTimeStyle:NSDateFormatterLongStyle];
    }
    return _dateFormatter;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UINavigationController *nv = segue.destinationViewController;
    _setupViewController = nv.viewControllers[0];
    self.setupViewController.delegate = self;
}


#pragma mark - Actions

// The reset method allows the user to repeatedly test the location functionality.
// In addition to discarding all of the location measurements from the previous "run",
// it animates a transition in the user interface between the table which displays location
// data and the start button and description label presented at launch.
//
- (void)reset {
    _bestEffortAtLocation = nil;
    [self.locationMeasurements removeAllObjects];

    // fade in the rest of the UI and fade out the table view
    [UIView animateWithDuration:0.6f animations:^(void) {
        self.startButton.alpha = 1.0;
        self.descriptionLabel.alpha = 1.0;
        self.tableView.alpha = 0.0;
        [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    } completion:^(BOOL finished) {
        if (finished) {
            //..
        }
    }];
}


#pragma mark - Location Manager Interactions

// This method is invoked when the user hits "Done" in the setup view controller.
// The options chosen by the user are passed in as a dictionary. The keys for this dictionary
// are declared in SetupViewController.h.
//
- (void)setupViewController:(SetupViewController *)controller didFinishSetupWithInfo:(NSDictionary *)setupInfo {
    self.startButton.alpha = 0.0;
    self.descriptionLabel.alpha = 0.0;
    self.tableView.alpha = 1.0;

    // Create the core location manager object
    _locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    // This is the most important property to set for the manager. It ultimately determines how the manager will
    // attempt to acquire location and thus, the amount of power that will be consumed.
    self.locationManager.desiredAccuracy = [setupInfo[kSetupInfoKeyAccuracy] doubleValue];

    // Once configured, the location manager must be "started"
    //
    // for iOS 8, specific user level permission is required,
    // "when-in-use" authorization grants access to the user's location
    //
    // important: be sure to include NSLocationWhenInUseUsageDescription along with its
    // explanation string in your Info.plist or startUpdatingLocation will not work.
    //
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [self.locationManager requestWhenInUseAuthorization];
    }
    [self.locationManager startUpdatingLocation];

    [self performSelector:@selector(stopUpdatingLocationWithMessage:)
               withObject:@"Timed Out"
               afterDelay:[setupInfo[kSetupInfoKeyTimeout] doubleValue]];
    self.stateString = NSLocalizedString(@"Updating", @"Updating");

    [self.tableView reloadData];
}

// We want to get and store a location measurement that meets the desired accuracy.
// For this example, we are going to use horizontal accuracy as the deciding factor.
// In other cases, you may wish to use vertical accuracy, or both together.
//
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    // store all of the measurements, just so we can see what kind of data we might receive
    [self.locationMeasurements addObject:newLocation];

    // test the age of the location measurement to determine if the measurement is cached
    // in most cases you will not want to rely on cached measurements
    //
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) {
        return;
    }

    // test that the horizontal accuracy does not indicate an invalid measurement
    if (newLocation.horizontalAccuracy < 0) {
        return;
    }

    // test the measurement to see if it is more accurate than the previous measurement
    if (self.bestEffortAtLocation == nil || self.bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) {
        // store the location as the "best effort"
        _bestEffortAtLocation = newLocation;

        // test the measurement to see if it meets the desired accuracy
        //
        // IMPORTANT!!! kCLLocationAccuracyBest should not be used for comparison with location coordinate or altitidue 
        // accuracy because it is a negative value. Instead, compare against some predetermined "real" measure of 
        // acceptable accuracy, or depend on the timeout to stop updating. This sample depends on the timeout.
        //
        if (newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy) {
            // we have a measurement that meets our requirements, so we can stop updating the location
            // 
            // IMPORTANT!!! Minimize power usage by stopping the location manager as soon as possible.
            //
            [self stopUpdatingLocationWithMessage:NSLocalizedString(@"Acquired Location", @"Acquired Location")];
            // we can also cancel our previous performSelector:withObject:afterDelay: - it's no longer necessary
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocationWithMessage:) object:nil];
        }
    }

    // update the display with the new location data
    [self.tableView reloadData];    
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    // The location "unknown" error simply means the manager is currently unable to get the location.
    // We can ignore this error for the scenario of getting a single location fix, because we already have a 
    // timeout that will stop the location manager to save power.
    //
    if ([error code] != kCLErrorLocationUnknown) {
        [self stopUpdatingLocationWithMessage:NSLocalizedString(@"Error", @"Error")];
    }
}

- (void)stopUpdatingLocationWithMessage:(NSString *)state {
    self.stateString = state;
    [self.tableView reloadData];
    [self.locationManager stopUpdatingLocation];
    self.locationManager.delegate = nil;

    UIBarButtonItem *resetItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Reset", @"Reset")
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 action:@selector(reset)];
    [self.navigationItem setLeftBarButtonItem:resetItem animated:YES];
}


#pragma mark - UITableViewDataSource

// The table view has three sections. The first has 1 row which displays status information.
// The second has 1 row which displays the most accurate valid location measurement received.
// The third has a row for each valid location object received
// (including the one displayed in the second section) from the location manager.
//
- (NSInteger)numberOfSectionsInTableView:(UITableView *)table {
    return (self.bestEffortAtLocation != nil) ? 3 : 1;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *headerTitle = nil;
    switch (section) {
        case 0: {
            headerTitle = NSLocalizedString(@"Status", @"Status");
            break;
        }
        case 1: {
            headerTitle = NSLocalizedString(@"Best Measurement", @"Best Measurement");
            break;
        }
        default: {
            headerTitle = NSLocalizedString(@"All Measurements", @"All Measurements");
            break;
        }
    }
    return headerTitle;
}

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
    NSInteger numRows = 0;
    switch (section) {
        case 0: {
            numRows = 1;
            break;
        }
        case 1: {
            numRows = 1;
            break;
        }
        default: {
            numRows = self.locationMeasurements.count;
            break;
        }
    }
    return numRows;
}

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;

    switch (indexPath.section) {
        case 0: {
            // The cell for the status row uses the cell style "UITableViewCellStyleValue1", which has a label on the left side of the cell with left-aligned and black text; on the right side is a label that has smaller blue text and is right-aligned. An activity indicator has been added to the cell and is animated while the location manager is updating. The cell's text label displays the current state of the manager.
            static NSString * const kStatusCellID = @"StatusCellID";
            static NSInteger const kStatusCellActivityIndicatorTag = 2;
            UIActivityIndicatorView *activityIndicator = nil;

            cell = [table dequeueReusableCellWithIdentifier:kStatusCellID];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kStatusCellID];
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
                activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
                CGRect frame = activityIndicator.frame;
                frame.origin = CGPointMake(290.0, 12.0);
                activityIndicator.frame = frame;
                activityIndicator.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
                activityIndicator.tag = kStatusCellActivityIndicatorTag;
                [cell.contentView addSubview:activityIndicator];
            } else {
                activityIndicator = (UIActivityIndicatorView *)[cell.contentView viewWithTag:kStatusCellActivityIndicatorTag];
            }

            cell.textLabel.text = self.stateString;
            if ([self.stateString isEqualToString:NSLocalizedString(@"Updating", @"Updating")]) {
                if (activityIndicator.isAnimating == NO) {
                    [activityIndicator startAnimating];
                }
            } else {
                if (activityIndicator.isAnimating) {
                    [activityIndicator stopAnimating];
                }
            }
            break;
        }

        case 1: {
            // The cells for the location rows use the cell style "UITableViewCellStyleSubtitle", which has a left-aligned label across the top and a left-aligned label below it in smaller gray text. The text label shows the coordinates for the location and the detail text label shows its timestamp.
            static NSString * const kBestMeasurementCellID = @"BestMeasurementCellID";
            cell = [table dequeueReusableCellWithIdentifier:kBestMeasurementCellID];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kBestMeasurementCellID];
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            }
            cell.textLabel.text = self.bestEffortAtLocation.localizedCoordinateString;
            cell.detailTextLabel.text = [self.dateFormatter stringFromDate:self.bestEffortAtLocation.timestamp];
            break;
        }

        default: {
            // The cells for the location rows use the cell style "UITableViewCellStyleSubtitle", which has a left-aligned label across the top and a left-aligned label below it in smaller gray text. The text label shows the coordinates for the location and the detail text label shows its timestamp.
            static NSString * const kOtherMeasurementsCellID = @"OtherMeasurementsCellID";
            cell = [table dequeueReusableCellWithIdentifier:kOtherMeasurementsCellID];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kOtherMeasurementsCellID];
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            }
            CLLocation *location = self.locationMeasurements[indexPath.row];
            cell.textLabel.text = location.localizedCoordinateString;
            cell.detailTextLabel.text = [self.dateFormatter stringFromDate:location.timestamp];
            break;
        }
    }

    return cell;
}


#pragma mark - UITableViewDelegate

// Delegate method invoked before the user selects a row.
// In this sample, we use it to prevent selection in the first section of the table view.
//
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return (indexPath.section == 0) ? nil : indexPath;
}

// Delegate method invoked after the user selects a row. Selecting a row containing a location object
// will navigate to a new view controller displaying details about that location.
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    CLLocation *location = self.locationMeasurements[indexPath.row];
    LocationDetailViewController *detailVC = [[LocationDetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    detailVC.location = location;
    [self.navigationController pushViewController:detailVC animated:YES];
}

@end

This is my 'completed' version of the solution provided by @rykker. I have successfully managed to get both players going in the right direction (left-to-right instead of top-to-bottom), set up the in-game barriers, and create an end game condition that stops the game, which admittedly was not that challenging. I'm planning on updating this answer come Thursday.


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <time.h>

//Improves code readability
#define POSITIONS (100 - 1) //assign 99 positions from 0-99
#define PLYR_ICON_1 219
#define PLYR_ICON_2 176
#define SNAKE 245
#define SNAKE_BEGIN 49
#define LADDER 186
#define LADDER_END 73
#define DOT 46
#define ROWS 10
#define COLS 10
#define START_END 175
#define ZERO 48
#define ONE 49
#define TWO 50

//Creates a global enumeration PLAYER - Improves code readability
enum {
    PLAYER1,    //Enumerator; state=0
    PLAYER2,    //Enumerator; state=1
    MAX_PLAYERS //Enumerator; state=2
}PLAYER;        //enum variable

//Creates a global struct POS containing an integer member position
typedef struct {
    int position;
}POS;

//Initializes function container that can pass position values for all players
void printBoard(POS *ptr);

int main(void){

    //local position initialized at 0
    int pos1=0;//local player1 position
    int pos2=0;//local player2 position

    //bounds check variable initialized at 0
    int check_position = 0;

    //turn counter initialized at 0
    int rollA=0;
    int rollB=0;

    POS *pos_global = calloc(MAX_PLAYERS, sizeof(*pos_global)); //creates a new pointer instance of the struct with enough space for MAX_PLAYERS(or 2) elements, 4bytes (the size of a pointer) each
    //used to pass information via function argument
    //free(pos_global) when done

    char input[10]={0}; //initializing array for user input for player turn
    int rRoll;          //random roll
    bool gameOn=true;   //bool utilized in while loop
    srand(time(0));     //pseudo-random seed generator for rand() depending on time(0);


    printf("Starting Position:\n");
    //Sets both positions to 0
    pos_global[PLAYER1].position = 0;   //equivalent to pos_global[0].position = 0
    pos_global[PLAYER2].position = 0;   //equivalent to pos_global[1].position = 0
    printBoard(pos_global);             //calls printBoard function passing pos_global for both players as 0, enabling the function to set both player tags in the starting position


    while(gameOn==true) //main game loop
    {
        printf("Enter player number to roll dice\n");
        fgets(input, sizeof(input), stdin); //stores user input as characters in the array input[]
        if((isdigit(input[0]))==0){         //checks if digit is entered; isdigit returns 0 if the 1st element of the array storing the user input isn't a digit, providing some input boundaries
            printf("Incorrect input please enter digits 0, 1 or 2 \n");
        }
        else{//code to be executed if a digit is entered for the first character

        rRoll=(rand() % 6) + 1; //random dice roll: any numbers remainder when divided by 6 will be between 0-5, adding one give 1-6 random dice roll

        if(input[0]==ONE){      //code to be executed if 1 is entered: PLAYER1's TURN
            pos1=pos1+rRoll;    //new position=old position+dice roll
            rollA++;            //adds one to the turn counter
            printf("You rolled a %d \n",rRoll);

            if (pos1>POSITIONS) //winning end-game condition (if new position is bigger than 99 (last position/end of board), end the game)
            {
                printf(" *** Game over. Player 1 wins! *** \n");
                free(pos_global); //deallocates the earlier allocated memory by calloc();
            }

            check_position = POSITIONS - pos1;
            if(check_position < 0) pos1 = pos1 - POSITIONS; //if pos>99, subtract the difference to pos, providing some bounds

            //Switch used to make ladder/snake functional
            switch (pos1)
                {
                case 23:
                case 33:
                case 43:
                case 53:
                case 63:
                    pos1=LADDER_END; //whenever PLAYER1 lands on any of the ladder positions, set his position at the LADDER_END (73th position)
                    break;

                case 85:
                case 76:
                case 67:
                case 58:
                case 69:
                    pos1=SNAKE_BEGIN; //whenever PLAYER1 lands on any of the snake positions, set his position at the SNAKE_BEGIN (49th position)
                    break;
                }

                pos_global[PLAYER1].position = pos1;    //updates the pointer instance with the new position for PLAYER1
                printBoard(pos_global);                 //prints the board with newly updated pointer
                printf("Player 1: %d times   Player 2: %d times\n",rollA, rollB);
        }
        else if(input[0]==TWO)  //code to be executed if 1 is entered: PLAYER1's TURN
        {
            pos2=pos2+rRoll;    //new position=old position+dice roll
            rollB++;            //adds one to the turn counter
            printf("You rolled a %d \n",rRoll);

            if (pos2>POSITIONS)
            {
                printf(" *** Game over. Player 2 wins! *** \n");
                free(pos_global); //deallocates the earlier allocated memory by calloc();
            }

            check_position = POSITIONS - pos2;
            if(check_position < 0) pos2 = pos2 - POSITIONS; //if pos>99, subtract the difference to pos, providing some bounds

            //Switch used to make ladder/snake functional
            switch (pos2){
                case 23:
                case 33:
                case 43:
                case 53:
                case 63:
                    pos2=LADDER_END;   //whenever PLAYER2 lands on any of the ladder positions, set his position at the LADDER_END (73th position)
                    break;

                case 85:
                case 76:
                case 67:
                case 58:
                case 69:
                    pos2=SNAKE_BEGIN;  //whenever PLAYER2 lands on any of the ladder positions, set his position at the LADDER_END (49th position)
                    break;
                }

            pos_global[PLAYER2].position = pos2;    //updates the pointer instance with the new position for PLAYER2
            printBoard(pos_global);                 //prints the board with newly updated pointer
            printf("Player 1: %d times   Player 2: %d times\n",rollA, rollB);

        }
            else if(input[0]==ZERO)//exit program if 0 is entered
            {
                free(pos_global); //deallocates the earlier allocated memory by calloc();
                break;
            }
            else{
                printf("Please choose a valid Player\n");
            }

        }
    }
    free(pos_global); //deallocates the earlier allocated memory by calloc() effectively terminating the program;
    return 0;
}

void printBoard(POS *ptr)
{
    //Counters
    int i,k,p;
    //position stored by digit 64; x=6 y=4;
    int x=0,y=0;
    char table[ROWS][COLS] = {0};   //initialize array table[10][10] before use
    for(i=0; i<ROWS; i++){          //for loop #1 executing 10 times from i=0 to i=9
        for(k=0; k<COLS; k++){      //for loop #2 executing 10 times from j=0 to j=9, nested within #1 to allow the whole 2d array to be
            table[i][k]=DOT;        //filled with dots (ascii 46)
                for(p=2;p<8;p++){   //fills table[][] with LADDERs
                    table[p][3]=LADDER;
                }
            table[4][9]=SNAKE;      //fills the SNAKE on the board
            table[5][8]=SNAKE;
            table[6][7]=SNAKE;
            table[7][6]=SNAKE;
            table[8][5]=SNAKE;
            table[0][0]=START_END;  //characters used in the beginning and ending of game
            table[9][9]=START_END;
           //position digit breakdown PLAYER1
           y = ptr[PLAYER1].position%COLS; //stores the 2nd digit of the position computed by applying a modulo argument to ptr[0].position (64%10=4)
           x = ptr[PLAYER1].position/COLS; //stores the 1st digit of position computed by dividing ptr[0].position by 10
           table[x][y]=PLYR_ICON_1;        //assigns PLAYER1 icon to it's new position
           //position digit breakdown PLAYER2
           y = ptr[PLAYER2].position%COLS; //equivalent to y = ptr[1].position%10
           x = ptr[PLAYER2].position/COLS; //equivalent to x = ptr[1].position/10
           table[x][y]=PLYR_ICON_2;

            printf("%c",table[i][k]);      //prints every character stored in all the array space
        }
        printf("\n");                      //inserts a new line after every row of 10 spaces
    }
}
This FFmeeting was hosted on ​irc://irc.freenode.net/ffmpeg-meeting on January 11, 2014, at 16 UTC.

**** BEGIN LOGGING AT Sat Jan 11 14:53:47 2014

Jan 11 14:53:47 *	Now talking on #ffmpeg-meeting
Jan 11 14:53:48 *	cameron.freenode.net sets mode +n #ffmpeg-meeting
Jan 11 14:53:48 *	cameron.freenode.net sets mode +s #ffmpeg-meeting
Jan 11 14:55:26 *	BBB (~rbultje <at> abraxo.bluebottle.net.au) has joined #ffmpeg-meeting
Jan 11 14:58:54 *	Compn (~notabot <at> 97.69.215.70) has joined #ffmpeg-meeting
Jan 11 14:59:02 <Compn>	how many hours til it starts again ?
Jan 11 15:01:32 *	ubitux (~ux <at> did75-21-88-189-231-41.fbx.proxad.net) has joined #ffmpeg-meeting
Jan 11 15:08:22 *	michaelni (~michael <at> chello084114129144.4.15.vie.surfer.at) has joined #ffmpeg-meeting
Jan 11 15:12:26 <michaelni>	saste, do we have some list of topics for the meeting today ? if so maybe link to it in the /topic
Jan 11 15:31:31 *	easyfab (~chatzilla <at> 213-245-142-93.rev.numericable.fr) has joined #ffmpeg-meeting
Jan 11 15:31:39 *	easyfab (~chatzilla <at> 213-245-142-93.rev.numericable.fr) has left #ffmpeg-meeting
Jan 11 15:34:24 *	easyfab (~chatzilla <at> 213-245-142-93.rev.numericable.fr) has joined #ffmpeg-meeting
Jan 11 15:35:36 *	kriegerod (~krieger <at> vpk-vityaz.od.ua) has joined #ffmpeg-meeting
Jan 11 15:35:41 *	beastd (~Akero7 <at> p5B06F187.dip0.t-ipconnect.de) has joined #ffmpeg-meeting
Jan 11 15:36:08 <beastd>	hi all. sorry i misremembered the time to be an hour later :(
Jan 11 15:40:09 *	wm4 (~wm4 <at> ip-static-94-242-209-206.as5577.net) has joined #ffmpeg-meeting
Jan 11 15:42:12 *	nevcairiel (quassel <at> WoWUIDev/WoWAce/Ace3/nevcairiel) has joined #ffmpeg-meeting
Jan 11 15:42:31 <michaelni>	saste, please add "this channel is publically logged in the topic" to the topic, i think IIRC thats supposed to be there for such channels
Jan 11 15:42:52 <michaelni>	s/ in the topic//
Jan 11 15:43:14 *	kurosu_ (5545746f <at> gateway/web/freenode/ip.85.69.116.111) has joined #ffmpeg-meeting
Jan 11 15:49:43 *	cbsrobot_ (~cbsrobot <at> 147.88.200.144) has joined #ffmpeg-meeting
Jan 11 15:49:49 *	cbsrobot_ has quit (Client Quit)
Jan 11 15:50:11 *	cbsrobot_ (~cbsrobot <at> 147.88.200.144) has joined #ffmpeg-meeting
Jan 11 16:07:41 *	saste has changed the topic to: The meeting will begin at 16 UTC - this channel is publically logged
Jan 11 16:07:59 <saste>	michaelni, done
Jan 11 16:08:26 <michaelni>	thx
Jan 11 16:17:08 *	Topic for #ffmpeg-meeting is: The meeting will begin at 16 UTC - this channel is publically logged
Jan 11 16:17:08 *	Topic for #ffmpeg-meeting set by saste!~saste___ <at> dynamic-adsl-78-15-163-248.clienti.tiscali.it at Sat Jan 11 16:07:41 2014
Jan 11 16:17:17 *	smarter (~smarter <at> ubuntu/member/smarter) has joined #ffmpeg-meeting
Jan 11 16:18:14 *	saste has changed the topic to: The meeting will begin at 16 UTC - Topics: http://paste.org/69739 - This channel is publically logged, the log will be published on ffmpeg-devel
Jan 11 16:31:08 *	kurosu_ has quit (Quit: Page closed)
Jan 11 16:49:23 *	Cigaes (cigaes <at> ssecem.salle-s.org) has joined #ffmpeg-meeting
Jan 11 16:50:12 *	Timothy_Gu (~Timothy_G <at> ip70-187-186-217.oc.oc.cox.net) has joined #ffmpeg-meeting
Jan 11 16:53:08 *	Eventh- (5f22de4b <at> gateway/web/freenode/ip.95.34.222.75) has joined #ffmpeg-meeting
Jan 11 16:54:31 <saste>	5 minutes to go
Jan 11 16:58:26 *	rmklp (~krueger <at> ip-178-200-241-251.unitymediagroup.de) has joined #ffmpeg-meeting
Jan 11 16:59:43 *	pross-au (~xbmc <at> c114-76-138-51.sunsh2.vic.optusnet.com.au) has joined #ffmpeg-meeting
Jan 11 17:00:53 *	j-b (~jb <at> videolan/developer/j-b) has joined #ffmpeg-meeting
Jan 11 17:02:17 <saste>	hi all, thanks for joining
Jan 11 17:02:25 <saste>	i think it is time to start
Jan 11 17:02:52 <saste>	you can find the list of topics here:  http://paste.org/69739
Jan 11 17:03:16 <saste>	first topic: 1. technical issues, TODOs, long term projects
Jan 11 17:03:30 <saste>	who wants to start?
Jan 11 17:05:18 <kriegerod>	maybe the one who added this item to list?
Jan 11 17:05:51 <saste>	i have a list of topics left from the previous meeting, nothing specifically i want to discuss
Jan 11 17:06:12 <kriegerod>	seems others are idle, too
Jan 11 17:06:14 <pross-au>	re long term stuff. are there any such projects active atm?
Jan 11 17:06:17 <saste>	there were some devs who wanted to talk about some technical issues, but i think they are missing
Jan 11 17:06:31 <michaelni>	i wanted to ask beastd& lou about the status of backups (i think thats technical
Jan 11 17:06:36 <michaelni>	but lou isnt here
Jan 11 17:06:36 <saste>	from the list in the previous meeting:
Jan 11 17:06:40 <saste>	1. mpegts/H.264 muxing/timestamp issues
Jan 11 17:06:54 <saste>	2.  playlist design issues and issues related to chained muxers option passing
Jan 11 17:07:04 <saste>	3.  ffserver generic issues
Jan 11 17:07:17 <saste>	4. ffserver RTMP/HLS missing output support
Jan 11 17:07:26 <saste>	btw anyone interested in working with ffserver?
Jan 11 17:07:52 <wm4>	I thought everyone hated ffserver and wanted to remove it
Jan 11 17:08:13 <michaelni>	i like ffserver but my todo is too long to really work on it
Jan 11 17:08:20 <saste>	i did some documentation/cleanup work on ffserver, it's not as bad as I thought
Jan 11 17:08:24 <Cigaes>	ffserver is useful. Removing something useful just because nobody wants to maintain it is not something to do.
Jan 11 17:08:36 <saste>	most open tickets can be easily reproduced
Jan 11 17:08:42 <wm4>	then it'll have to continue sucking, I guess
Jan 11 17:08:46 <kriegerod>	i could, but cannot afford doing anything such unpaid
Jan 11 17:09:10 <saste>	the network problem I talkled about on list, I couldn't still resolve it
Jan 11 17:09:28 <ubitux>	i'd like to know what's going on with fate btw
Jan 11 17:09:38 <ubitux>	didn't someone planed some stuff about it?
Jan 11 17:09:40 <saste>	ffserver could be the object of some crowdfunding campaign, we can talk about it later
Jan 11 17:09:52 <saste>	ubitux, what's the problem with fate?
Jan 11 17:10:20 <ubitux>	i remember michaelni wanting someone to maintain it/upgrade our fate
Jan 11 17:10:32 <ubitux>	maybe related to recent security issues
Jan 11 17:10:39 <saste>	is baptiste still maintaining fate?
Jan 11 17:10:58 *	saste knows nothing about the recent security issues
Jan 11 17:11:17 <michaelni>	cross site scripting, no real issue AFAIK
Jan 11 17:11:24 <saste>	any news about the re-styling burek was working on?
Jan 11 17:12:19 <michaelni>	but even if its not a real issue a volunteer to maintain the fateserver code would be great to have
Jan 11 17:12:31 <saste>	michaelni, what needs to be done?
Jan 11 17:12:45 <saste>	in other words, what the volunteer is supposed to do specifically?
Jan 11 17:13:05 <michaelni>	update it to the latest of mans code and have time to fix&debug any thing that goes wrong
Jan 11 17:13:22 <saste>	any taker?
Jan 11 17:13:23 <michaelni>	and then if the cross site scripting issue is still there, fix it
Jan 11 17:15:38 <michaelni>	"fix&debug any thing that goes wrong" == "anything that goes wrong because of the update"
Jan 11 17:16:08 <saste>	michaelni, where the fate source code can be found?
Jan 11 17:16:27 <saste>	should we advertise it on the website/download page?
Jan 11 17:16:59 <michaelni>	ours at https://github.com/ffmpeg/fateserver / git://git.ffmpeg.org/fateserver
Jan 11 17:17:17 <saste>	is it listed on the download page?
Jan 11 17:17:17 <Compn>	ask mans if you link to mans' repo of course
Jan 11 17:18:11 <michaelni>	saste, seems not listed
Jan 11 17:18:17 <Compn>	it would also be neat if we added the ffmpeg header page to fate page, if possible
Jan 11 17:18:26 <Compn>	so people can get back to ffmpeg homepage? maybe?
Jan 11 17:18:30 <saste>	nor could i find the link in doc/fate.texi
Jan 11 17:18:49 <saste>	Compn, yes
Jan 11 17:18:51 <michaelni>	does someone take notes of these todo things ?
Jan 11 17:19:12 <saste>	currently the FATE interface is rather "spartan"
Jan 11 17:19:30 <saste>	michaelni, we have a TODO file and trac
Jan 11 17:19:48 <saste>	no TODO was killed IIRC
Jan 11 17:20:17 <michaelni>	i meant someone should make a list of todo items from this meeting, maybe open trac tickets for each
Jan 11 17:21:29 <saste>	michaelni, i can send a patch to add FATE source repo to the download page
Jan 11 17:21:54 <saste>	anyway, so far for point 1.  technical issues, TODOs, long term projects
Jan 11 17:22:10 <beastd>	TODO file inside source repo is often not useful in my experience. tracking things in one or more tickets usually works better.
Jan 11 17:22:13 <michaelni>	saste, ok for patch
Jan 11 17:22:28 <saste>	anyone wants to discuss his TODO/long term projects?
Jan 11 17:22:47 <saste>	beastd, TODO was removed for that reason indeed
Jan 11 17:23:01 <Cigaes>	beastd: I agree, but there should be a link to "all open TODO tickets" easily accessible, for anyone wanting to work on something.
Jan 11 17:23:26 <saste>	Cigaes, TODO list = enhancements?
Jan 11 17:23:28 <beastd>	Cigaes: that should be done with a report
Jan 11 17:23:49 <saste>	BTW there is a reason for the "wish" priority on trac?
Jan 11 17:24:18 <saste>	I don't think "wish" is a priority", anyway that's not a very important issue and should probably not discussed here
Jan 11 17:24:48 <Cigaes>	saste: yes, something like that. But possibly only enhancements deemed worthy enough by... enough competent people.
Jan 11 17:25:13 <saste>	anyway i'd prefer to remove that priority level (indeed an enhancement can have several priority levels)
Jan 11 17:25:42 <michaelni>	we could add a todo keyword for these and a report for tickets with that keyword could be linke dto
Jan 11 17:26:08 <saste>	Cigaes, enhancements tickets can be reviewed and edited by competent developers
Jan 11 17:26:11 <Compn>	michaelni : after the meeting we will collect ideas and make bug reports, yes
Jan 11 17:26:17 <kriegerod>	a list of all unresolved tickets can be considered a TODO
Jan 11 17:26:29 *	Compn backlogged
Jan 11 17:26:45 <kriegerod>	what's strict criteria for inclusion of ticket to TODO category?
Jan 11 17:27:00 <saste>	any ticket is a TODO
Jan 11 17:27:04 <kriegerod>	project infracstructure related?
Jan 11 17:27:04 <Compn>	do we need strict criteria ? :P
Jan 11 17:27:15 <saste>	but there are some tickets which are more important than others
Jan 11 17:27:31 <saste>	"todo" as a tag is misleading imo
Jan 11 17:27:42 <kriegerod>	ok, so TODO = critical level tickets
Jan 11 17:27:56 <Cigaes>	saste: there are also tickets that are more demanding than other.
Jan 11 17:28:13 <Compn>	difficulty and importance
Jan 11 17:28:14 <beastd>	maybe the idea from michaelni is quite pragmatic. we could tag things with todo and list all tickets tagged todo with https://trac.ffmpeg.org/tags?q=%27todo%27
Jan 11 17:28:18 *	Compn runs from the bikeshed
Jan 11 17:29:02 <saste>	discussion slided from discussion about todos to discussion about what is "todo" ;)
Jan 11 17:29:47 <beastd>	yes, which ist the hardest part. but some fuzzy solution could be sufficient
Jan 11 17:29:59 <Cigaes>	beastd: this looks like a good solution, provided the "todo" tag is not added by a wandering user for their own whims.
Jan 11 17:30:28 <michaelni>	wandering users prefer to mark their tickets as critical
Jan 11 17:30:32 <saste>	beastd, btw what about a difficulty level or tag in trac?
Jan 11 17:31:00 <saste>	so wannabee ffdevs (assuming there are some) can easily spot the easy tickets to work on
Jan 11 17:31:31 <michaelni>	small age of a ticket might work for this too btw
Jan 11 17:31:38 <michaelni>	old tickets tend to be harder
Jan 11 17:32:14 <kriegerod>	...or less important
Jan 11 17:32:34 <michaelni>	yes
Jan 11 17:32:52 <saste>	Cigaes, what's the status of the lavd probing API?
Jan 11 17:33:24 <saste>	is lukasz still working on it or is it blocked for some reason?
Jan 11 17:33:38 <beastd>	saste: dfficulty can be done. either we add a new custom ticket field or now with tags. we would need on a convention either way
Jan 11 17:33:43 <Cigaes>	saste: that was more Lukasz's work. I did not have personal communication with him.
Jan 11 17:33:54 <saste>	Cigaes, ok
Jan 11 17:34:27 <saste>	so far for what concerns point 1. technical issues, TODOs, long term projects
Jan 11 17:34:38 <saste>	?
Jan 11 17:35:08 <saste>	do we have comments from external users?
Jan 11 17:35:30 <Cigaes>	I can mention the few items I have in my personal TODO list, if anyone is interested.
Jan 11 17:35:38 <saste>	Cigaes, go on
Jan 11 17:35:57 <Cigaes>	I have started working on frame-accurate EDL.
Jan 11 17:36:23 <saste>	status?
Jan 11 17:36:24 <Cigaes>	For now, it works without threads but not at all with threads. I am a bit stuck there, but I had no time to really investigate the issue yet.
Jan 11 17:37:22 <Compn>	so you can seek to a frame number ?
Jan 11 17:37:29 <Compn>	thats a highly requested feature
Jan 11 17:37:30 <ubitux>	what about the subtitles charset thing?
Jan 11 17:37:46 <Compn>	Cigaes : even without threads support it would be useful ...
Jan 11 17:37:47 <ubitux>	Cigaes: i think at least wm4 holds a grudge about your plan
Jan 11 17:37:57 <Cigaes>	Compn: to a timestamp. But for now only in selected muxers.
Jan 11 17:38:02 <Compn>	ah
Jan 11 17:38:28 <ubitux>	in the subtitles charset project i'm mainly interested in the utf-16 supports
Jan 11 17:38:33 <Cigaes>	ubitux: I am still convinced that his plan do not work at all.
Jan 11 17:38:35 <ubitux>	i think that's what mpv is expecting the most
Jan 11 17:39:00 <Compn>	rather hear what vlc wants charset wise
Jan 11 17:39:07 <Compn>	j-b : what charsets does vlc require ? 
Jan 11 17:39:11 <Cigaes>	... but I am not motivated for arguing the issue.
Jan 11 17:39:12 <Compn>	for subs
Jan 11 17:39:38 <ubitux>	Cigaes: question is, do you have some WIP and plans about it?
Jan 11 17:39:55 <j-b>	Compn: none. We support everything. We prefer that the decoder outputs UTF-8, of course, but it does not matter.
Jan 11 17:40:23 <j-b>	Compn: iconv is a hard dependency of vlccore.
Jan 11 17:40:23 <Cigaes>	ubitux: all I have WIP was posted on the mailing-list a long time ago and buried under bikeshedding.
Jan 11 17:40:49 <michaelni>	Cigaes, ubitux my main concern with the "charset issue" is that it appeared deadlocked with noone working on it
Jan 11 17:41:07 <ubitux>	ok
Jan 11 17:41:48 <michaelni>	Cigaes, or said diferently it appeared IIRC that noone wanted to work on your design and you also where too busy 
Jan 11 17:41:55 <Cigaes>	I am willing to work on it, but I can not progress if the only voice on the ML says I am doing wrong.
Jan 11 17:42:43 <michaelni>	its difficult for me ATM to argue about it as iam a bit unprepared and half forgot the details of the "charset issue"
Jan 11 17:43:28 *	cbsrobot_ has quit (Remote host closed the connection)
Jan 11 17:43:53 <Cigaes>	I can try to write a summary about the status of the thing on the mailing list.
Jan 11 17:44:44 <saste>	Cigaes, or you ping people if you need someone to review/comment on your work
Jan 11 17:44:48 <saste>	that sometimes work
Jan 11 17:45:18 <saste>	other medium/long term projects were mentioned in the previous meeting:
Jan 11 17:45:20 <michaelni>	what i remember and that may be unrelated actually is that i felt it would be nice if decoders/demuxers could return subtitles without knowing the charset and leaving it to players to detect/interpret the text
Jan 11 17:45:24 <Cigaes>	saste: I will see if there are pingable pending mails.
Jan 11 17:45:32 <saste>	1. remaining mp filters port
Jan 11 17:45:43 <saste>	2. language binding creation (through SWIG or similar)
Jan 11 17:45:51 <michaelni>	Cigaes, and yes, a summary would be nice, it would be a pitty if the thing is deadlocked in bikeshed
Jan 11 17:45:52 <saste>	3. high level API creation
Jan 11 17:46:03 <saste>	4.  EDL support
Jan 11 17:46:20 <beastd>	I have another proposal for TODO
Jan 11 17:47:05 <beastd>	concerning ffmpeg CLI there is the frequent need to concatenate files. ffmpeg has gotten much better in doing it, but at least we lack a simple-to-use user interface. (short term the faq entry should be rewritten once more.) Long/mid term would be designing and implementing a user interface in ffmpeg to allow for easy concatenation.
Jan 11 17:47:08 <Cigaes>	saste: is 4 what I was talking abut a bit earlier.
Jan 11 17:47:45 <michaelni>	beastd, this sounds related to playlists
Jan 11 17:47:49 <saste>	Cigaes, yes I noticed
Jan 11 17:47:56 <beastd>	it is something users frequently do. a start would be someone thinking about a design and sending it as RFC to ffmpeg-devel ML
Jan 11 17:48:05 <beastd>	michaelni: could be related
Jan 11 17:48:12 <Compn>	beastd : make it as easy as multiple files with mencoder ?
Jan 11 17:48:21 <michaelni>	beastd, if you could specify a list of files to play then you basically have concatenation
Jan 11 17:48:23 <wm4>	about subtitles, yes, the only thing that's missing is utf-16 support
Jan 11 17:48:32 <Compn>	we need playlist support :)
Jan 11 17:49:08 <ubitux>	what do you mean by "playlist support"? don't we support already various playlists?
Jan 11 17:49:10 <Compn>	wm4 : do we have rar subs support? (playing files in rars or rar'd vobsubs) ?
Jan 11 17:49:21 <wm4>	no
Jan 11 17:49:24 <Cigaes>	Compn: we already have a lot of playlist formats support,
Jan 11 17:49:24 <kriegerod>	beastd, i think there's a class of existing apps that do that. Maybe we could google them up and highlight on some page? Anyway GUI tends to be standalone, that's different from "doing it by ffmpeg"
Jan 11 17:49:25 <saste>	about playlist, can't the concat demuxer be extended to support more playlist formats?
Jan 11 17:49:37 <wm4>	I know mplayer contains some extremely hideous code to invoke unrar on the fly
Jan 11 17:49:38 <Cigaes>	just no consistent way of validating access to other files.
Jan 11 17:49:43 <Compn>	saste : there was a patch in 2009 for that playlist api
Jan 11 17:49:59 <saste>	Compn, was that work on Anton?
Jan 11 17:50:04 <Compn>	no
Jan 11 17:50:05 <beastd>	kriegerod: true, we should look at other implementations
Jan 11 17:50:06 <wm4>	playlist parsers (as demuxers) would be nice
Jan 11 17:50:06 <Compn>	geza iirc
Jan 11 17:50:10 <saste>	we had a GSOC at some point, maybe it was after the fork
Jan 11 17:50:13 <Compn>	but i dont know who did original patch
Jan 11 17:50:25 <Compn>	someone said anton was working on it , but ... i dont see anything
Jan 11 17:50:37 <nevcairiel>	Antons GSOC was playlist support, before the fork, but it never really went anywhere :d
Jan 11 17:50:53 <Cigaes>	The concat demuxer can only work for files with very similar characteristics.
Jan 11 17:51:12 <Cigaes>	With "playlist support", users may want to mix very different files.
Jan 11 17:51:26 <Compn>	saste / ubitux / Cigaes : http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/94761
Jan 11 17:51:40 <Compn>	is the patch from 2009
Jan 11 17:52:47 <ubitux>	i'd better have ordered chapters in mkv…
Jan 11 17:52:52 <Compn>	i dont know if its the right thing.
Jan 11 17:52:59 <saste>	ah: ffmpeg -conc -i audio1,audio2,audio3 audiofull
Jan 11 17:53:02 <Compn>	right api or whatever. at least its something
Jan 11 17:53:06 <j-b>	I still have bounties for FFmpeg, btw, notably on DTS-HD and AAC-encoder
Jan 11 17:53:12 <saste>	seems what beastd  was talking about
Jan 11 17:53:40 <saste>	about AAC encoding, any news from the epic ticket's guys?
Jan 11 17:53:43 <wm4>	ubitux: all what's needed is exporting the ordered chapters info
Jan 11 17:53:52 <Compn>	saste : well, i think beastd wants ffmpeg concat to be as easy as mencoders' multiple file support.
Jan 11 17:53:59 <Cigaes>	(the "-conc -i 1,3,3" syntax looks like it will lead to yet another level of escaping madness)
Jan 11 17:54:00 <ubitux>	wm4: don't we already?
Jan 11 17:54:05 <wm4>	ubitux: no
Jan 11 17:54:09 <ubitux>	maybe not enough information in the chapters?
Jan 11 17:54:25 <wm4>	I doubt it
Jan 11 17:54:26 *	llogan (~llogan <at> pdpc/supporter/student/pasteeater) has joined #ffmpeg-meeting
Jan 11 17:54:33 <Compn>	lou is here :)
Jan 11 17:54:46 <wm4>	and you need a nice/fast way to scan for segment files too
Jan 11 17:54:53 <llogan>	ok. now we can start....
Jan 11 17:55:05 <nevcairiel>	even if the information was exported, i'm not sure you could make it play ordered chapter files seamlessly without a lot of magic in user code as well
Jan 11 17:55:10 <wm4>	also, what's so hard about concatenating arbitrary files?
Jan 11 17:55:10 <Compn>	wm4 : whats mplayer2's mkv ordered chapter support look like ?
Jan 11 17:55:22 <llogan>	i forgot i was -9 UTC...not -8. damn it
Jan 11 17:55:27 <Cigaes>	nevcairiel: can ordered chapters point to files with different codecs?
Jan 11 17:55:29 <beastd>	i think my concern was captured closely enough. and IIRC mencoder has a rather intuitive interface for concat but lots of other problems. anyway extending the CLI syntax can be very challenging
Jan 11 17:55:31 <ubitux>	wm4: AVChapter seems to have id, timestamps, and metadata
Jan 11 17:55:44 <ubitux>	and our mkv demuxer seems to create them
Jan 11 17:55:53 <saste>	beastd, mind to show an example?
Jan 11 17:56:03 <nevcairiel>	Cigaes: the spec doesnt necessarily disallow it, but it doesnt work in any implementation today, so...
Jan 11 17:56:04 <saste>	(about the mencoder syntax)
Jan 11 17:56:25 <wm4>	ubitux: does it export segment id? does it support editions in any way?
Jan 11 17:56:26 <nevcairiel>	(the "spec" really doesn't define many details about the whole process)
Jan 11 17:56:44 <ubitux>	wm4: i can't tell, sorry
Jan 11 17:56:45 <wm4>	also, ordered chapters are an abomination
Jan 11 17:56:52 <wm4>	(just saying)
Jan 11 17:57:05 <Compn>	saste : mencoder -vf scale=640:480 file1.rm file2.avi file3.mpg -oac lavc -ovc xvid -o file.avi  , will make one output file , all the same resolution and codec. its very easy to hand write , no escaping command lines, no brackets or commas...
Jan 11 17:57:07 <ubitux>	it's somehow related to the mov edit list btw
Jan 11 17:57:08 <Cigaes>	nevcairiel: then it looks like what I am implementing in the concat demuxer;
Jan 11 17:57:12 <nevcairiel>	its not that terrible, at least it wouldnt be if it was documented somewhere
Jan 11 17:57:27 <Cigaes>	for now it is a proof of concept, but once it is done it can be shared with other formats.
Jan 11 17:57:28 <michaelni>	llogan, beastd when the concat/playlist discussion finishes, can you update us on the server backup status ? (i think we still need a system that does full backups of both our servers and each time sends on email or so to either ML or root so we notice if something makes it stop working)
Jan 11 17:57:40 <nevcairiel>	trying to reverse engineer how haalis thing handles certain weird files was annoying =p
Jan 11 17:58:24 <wm4>	Compn: yeah, I never understood why weird fragile things like the concat demuxer are needed...
Jan 11 17:58:33 <Compn>	right
Jan 11 17:59:50 <saste>	wm4, concat demuxer was needed, at least until we don't have proper playlist support
Jan 11 18:00:10 <wm4>	so you admit it was a hack because ffmpeg.c is too much of a hack?
Jan 11 18:00:28 <beastd>	Please pardon me. Will need to leave in now.
Jan 11 18:00:51 <saste>	wm4, it makes sense to implement it as a component for library users, not only for ffmpeg.c
Jan 11 18:01:17 <wm4>	I myself am annoyed that a demuxer might suddenly open random files I didn't ask it to open
Jan 11 18:01:28 <wm4>	it might even be a security issue
Jan 11 18:01:34 <Compn>	what demuxer does that wm4 ?
Jan 11 18:01:41 <wm4>	Compn: concat
Jan 11 18:01:48 <saste>	wm4, you can disable it from the build if it annoys you
Jan 11 18:01:52 <Compn>	i mean, how would that happen wm4 ?
Jan 11 18:02:03 <kriegerod>	what's wrong with concat demuxer? it does its job in specific required manner, and fits in demuxer interface. Its fragileness is consequence of its requirement to work without reencoding.
Jan 11 18:02:05 <wm4>	saste: can I make distros to disable it?
Jan 11 18:02:31 <Compn>	concat is for copying video , got it
Jan 11 18:02:45 <Compn>	mencoder would do it, but also would break most of the time when copying video in containers
Jan 11 18:02:50 <Compn>	because it wasnt precise
Jan 11 18:02:50 <Cigaes>	kriegerod: it still lacks a few consistency checks, like matching streams in different order from different files.
Jan 11 18:03:07 *	kierank (uid5955 <at> gateway/web/irccloud.com/x-ooeiaqndiqxjeuob) has joined #ffmpeg-meeting
Jan 11 18:03:22 *	pross-au has quit (Quit: Z)
Jan 11 18:03:24 *	beastd has quit (Quit: So many things, so little time...)
Jan 11 18:03:55 <Compn>	i have to go soon as well.
Jan 11 18:04:35 <llogan>	since trac moved remote backups are basically non-existant because, AFAIK, i do not have permissions to make the database dump and/or the daily local database dumps have not occurred last time i checked.
Jan 11 18:05:13 <llogan>	unfortunately, i do not have the resources to perform daily, full backups of the whole machine
Jan 11 18:05:25 <michaelni>	llogan, ok, tell me after the meeting what permissions you need
Jan 11 18:06:03 <saste>	llogan, you could run a backup script from another ffmpeg server
Jan 11 18:06:51 <llogan>	saste: which server? i do not think the web host has enough drive space, IIRC
Jan 11 18:07:01 <michaelni>	also we need full backups, my problem ironically is not that i lack diskspace or net bandwidth but iam too scetterbrained so i know i will forget doing them
Jan 11 18:07:16 <saste>	llogan, ok, was only an idea
Jan 11 18:07:24 <saste>	michaelni, script and conquer
Jan 11 18:07:26 <llogan>	saste: it was a good idea
Jan 11 18:07:56 <llogan>	michaelni: (ana)cron and rsync might be good enough.
Jan 11 18:08:09 <Cigaes>	llogan: what kind of rsync setup?
Jan 11 18:09:46 <llogan>	Cigaes: good question. daily/weekly/monthly? depends on the required complexity i guess. currently i'm doing irregular backups with duplicity.
Jan 11 18:10:13 <Cigaes>	llogan: I was asking more about the --delete-* kind of options. rsync alone is not suitable for a backup,
Jan 11 18:10:32 <Cigaes>	since it will either leave obsolete files there or delete files that may need to be restoring later.
Jan 11 18:11:28 <llogan>	that's one reason i am using duplicity, but rsync was just a more simple recommendation (more for the trac database file for example)
Jan 11 18:12:02 *	michaelni would be using tar+*zip+(gpg)+ssh
Jan 11 18:12:36 <Cigaes>	llogan: rsync can do the work like duplicity, provided the correct options are chosen. rsnapshot, for example, is a good script to do that.
Jan 11 18:13:03 <llogan>	i will unvolunteer myself from the backups. i do not have to time, resources, or experience to do an adequate job
Jan 11 18:14:09 <michaelni>	llogan, ok, anyone else who wants to volunteer ?
Jan 11 18:14:43 <michaelni>	note beastd didnt ever really volunteer, he just did some work on it ...
Jan 11 18:14:49 <saste>	michaelni, maybe ask on mailing-list or in private mails
Jan 11 18:15:39 <saste>	should we move to point 2.?
Jan 11 18:15:46 <michaelni>	saste, ok, ok
Jan 11 18:15:57 <llogan>	is trac also on a VPS or VM or something? if so can images be made too?
Jan 11 18:16:23 <Cigaes>	saste: before moving to point 2, I may mention a few more projects.
Jan 11 18:16:34 <michaelni>	llogan, trac is on a virtual machine
Jan 11 18:16:36 <Cigaes>	Regarding lavfi:
Jan 11 18:16:43 <saste>	Cigaes, sure (I'm just a bit worried that we run out of time)
Jan 11 18:17:12 <Cigaes>	The pull-based nature of EOF annoys me. I am thinking of adding some kind of filter_message() method along with filter_frame(),
Jan 11 18:17:29 <Cigaes>	to let the library process EOF and more in a push-based manner.
Jan 11 18:17:46 <Cigaes>	One of the benefits would be to have a timestamp for EOF, and therefore a duration for the last frame.
Jan 11 18:18:02 <michaelni>	saste, note for the future, if these meetings become too long, maybe they should be split in technical / non technical or something
Jan 11 18:18:12 <michaelni>	or maybe more frequent so theres less to discuss
Jan 11 18:18:17 <Cigaes>	Regarding network:
Jan 11 18:18:26 <j-b>	and you should use a collaborative note
Jan 11 18:18:37 <saste>	michaelni, probably
Jan 11 18:18:52 <saste>	this is the second meeting in one year
Jan 11 18:18:52 <Cigaes>	The recent discussion on the ML makes me want to implement some kind of global solution
Jan 11 18:19:06 <Cigaes>	for protocols that require subprotocols.
Jan 11 18:19:12 <saste>	j-b, do you suggest a specific platform/software for that?
Jan 11 18:19:57 <saste>	Cigaes, about EOF in lavfi, yes although maybe mailing-list is a better place where to discuss it
Jan 11 18:20:42 <Cigaes>	saste: I do not want to annoy people on the mailing list with ideas that are just maturating.
Jan 11 18:20:54 <Cigaes>	I will post something once I have at least a proof of concept.
Jan 11 18:21:08 <j-b>	saste: sure, etherpad.
Jan 11 18:21:17 <j-b>	saste: it's live, and allows everyone to edit
Jan 11 18:21:37 <saste>	j-b, noted for the next time
Jan 11 18:21:56 <saste>	but if someone wants to create a shared document right now, he's welcome
Jan 11 18:22:26 <j-b>	https://etherpad.mozilla.org/MmPk7vQSVT
Jan 11 18:22:26 <saste>	Cigaes, ok and thanks
Jan 11 18:23:16 <j-b>	saste: something like that
Jan 11 18:23:28 <j-b>	saste: it avoids having the load on only one person
Jan 11 18:24:21 <saste>	j-b, thx
Jan 11 18:24:54 <saste>	second point: 2. crowdfunding, donation system improvements, merchandising etc.
Jan 11 18:25:17 <saste>	about crowdfunding, it was discussed in the previous meeting and nothing has been done in the meanwhile
Jan 11 18:25:57 <saste>	crowdfunding and donations can have different targets
Jan 11 18:26:28 <saste>	donations are for generic donations to the whole project, while crowdfunding seems more oriented for specific  features development
Jan 11 18:26:58 <saste>	basically from what i can see we lack developers wanting to create such a project
Jan 11 18:27:21 <kriegerod>	which project?
Jan 11 18:27:44 <michaelni>	improve / maintain ffserver would be a random example :)
Jan 11 18:27:52 <saste>	kriegerod, ffmpeg, or a specific feature implementation project
Jan 11 18:28:19 <saste>	we had a few platform proposals the last time and in several discussions on m-l, irc, rl
Jan 11 18:28:23 <kriegerod>	well, crowdfunding is about having idea and having donated money to implement the idea
Jan 11 18:28:41 <saste>	kickstart, indiego, freedomsponsor and other ones i forgot about
Jan 11 18:28:41 <kriegerod>	when these two are there, i think it would be no problem to find implementor(s)
Jan 11 18:28:54 <rmklp>	I think to attract someone to pay a certain amount in a crowd-funding project a well-defined goal is crucial for the success.
Jan 11 18:29:03 <saste>	kriegerod, no in practice we never had volunteers for doing that
Jan 11 18:29:16 <rmklp>	just improving ffserver will not work IMHO
Jan 11 18:29:18 <llogan>	saste: there was an additional one i mentioned that gimp is/was using too but i forgot the name and i'm not at my ususal machine
Jan 11 18:29:30 <kriegerod>	saste: for doing what and for which amount of money? that's important
Jan 11 18:29:33 <saste>	what i propose is to make projects involving at least two developers
Jan 11 18:29:42 <llogan>	i can make a wiki page for crowdfunding ideas if that could be useful
Jan 11 18:29:53 <saste>	i'd like to do that for implementing DVD reading support, and/or high-level scripting
Jan 11 18:30:02 <michaelni>	rmklp, maybe "fix all ffserver bugs that where on trac at date X"
Jan 11 18:30:13 <saste>	the principle is that i don't find enough motivation if i have to do it alone, but i could if i have a partner for it
Jan 11 18:30:23 <saste>	it should also be more fun for the involved developers
Jan 11 18:30:48 <llogan>	something along the lines of rht GSoC ideas page might be helpful.
Jan 11 18:30:55 <saste>	if we manage to find volunteers for this, then we may create a page on the website listing the on-going projects
Jan 11 18:30:58 <llogan>	s/rht/the
Jan 11 18:31:22 <wm4>	how do you plan to handle DVD reading technically?
Jan 11 18:31:35 <wm4>	or maybe that's offtopic right now
Jan 11 18:31:54 <saste>	wm4, I did some work about it, but it was not still working
Jan 11 18:31:54 <rmklp>	michaelni: probably. I don't know how many companies use ffserver commercially, though.
Jan 11 18:32:27 <saste>	it was a dvd reader, i can send you the thread link later in case you're interested
Jan 11 18:32:41 <wm4>	somewhat
Jan 11 18:32:49 <wm4>	though I doubt it'll be useful for playback use
Jan 11 18:33:07 <saste>	wm4, main objective and target would be backup transcoding of DVD
Jan 11 18:33:37 <rmklp>	michaelni: If the goal is to raise money then there are probably projects that would attract more companies (aac encoder, fast j2k encoder to name two which I guess there will be interest for)
Jan 11 18:34:06 <llogan>	RFC for crowdfunding ideas on -devel might get the ball rolling
Jan 11 18:34:32 <saste>	rmklp, the problem is that usually a single company is not willing to sponsor the whole project
Jan 11 18:34:41 <llogan>	or maybe j-b can describe their process/experience
Jan 11 18:35:08 <rmklp>	saste: yes, of course. I thought we are talking about crowd funding.
Jan 11 18:35:26 <j-b>	llogan: CrowdFunding is very hard to do for people like us
Jan 11 18:35:35 <michaelni>	rmklp, to raise more money making the description more spicy wth hls, rtmp, html5 should attract more interrest compared to "fixing issues"
Jan 11 18:35:41 <j-b>	llogan: a kind of bounty system would be more clever, IMHO
Jan 11 18:35:47 <rmklp>	saste: there was another crowd funding platform that I sent you an email about. one that was specialized on open source. I can'tr find it right now.
Jan 11 18:36:10 <rmklp>	https://www.bountysource.com/
Jan 11 18:36:14 <saste>	j-b, we have a rudimental form of bounty system
Jan 11 18:36:18 <llogan>	j-b: your VLC metro (IIRC) project seemed fairly successful to me
Jan 11 18:36:25 <saste>	we add the tag "bounty" to a ticket
Jan 11 18:36:33 <j-b>	llogan: fairly not.
Jan 11 18:36:40 <j-b>	llogan: and we targetted normal users
Jan 11 18:36:44 <saste>	but this is not very practical/effective, if not for small projects/bugfixes
Jan 11 18:36:55 <j-b>	saste: this is not a correct way
Jan 11 18:37:10 <saste>	we need a platform to coordinate several donors
Jan 11 18:37:29 <saste>	assuming we have some competent developers wanting to propose a project
Jan 11 18:37:32 <j-b>	yes, like bountysource
Jan 11 18:37:37 <rmklp>	yes and at first glance bountysource looks ok
Jan 11 18:37:50 <j-b>	it's not proper crowdsourcing
Jan 11 18:37:54 <kierank>	many companies won't do bountysource in public
Jan 11 18:37:56 <j-b>	but it's more what you'd need
Jan 11 18:38:22 <kierank>	mainly because for differing reasons they need to hide they are using ffmpeg
Jan 11 18:38:54 <rmklp>	kierank: maybe the big ones won't but I believe small ones will and I guess there are hundreds of smaller ones building products on top of ffmpeg
Jan 11 18:38:59 <kierank>	and because bounties are an indeirect form of expenditure
Jan 11 18:39:04 <saste>	kierank, most ffmpeg users are service providers, AFAIK
Jan 11 18:39:22 <kierank>	yeah and they need to hide the fact that their service is a script on top of ffmpeg
Jan 11 18:39:22 <saste>	so the fact that they're using or contributing to ffmpeg shouldn't hurt them
Jan 11 18:39:41 <llogan>	i agree with kierank about many of them wanting to hide
Jan 11 18:39:57 <kierank>	the others (e.g BBC) need to hide for different reasons
Jan 11 18:40:47 <saste>	can bountysource donations be anonymous?
Jan 11 18:40:47 <rmklp>	I know of sponsors who explicitly want to be known as ffmpeg sponsors
Jan 11 18:41:15 <saste>	rmklp, we discussed about a sponsor page, still never was done
Jan 11 18:41:27 <kierank>	rmklp: wait for marketing to find out the new super patented technology that the company claimed to invent is just ffmpeg
Jan 11 18:41:30 <saste>	i guess for lack of interest/motivation/manpower/you name it
Jan 11 18:41:32 <kierank>	and that will get quashed easily
Jan 11 18:42:44 <michaelni>	saste, it seems they can be annoymous, i see a "Anonymous" at https://www.bountysource.com/fundraisers/506-help-make-zoneminder-better/backers for example
Jan 11 18:43:12 <rmklp>	kierank: yes those exist but e.g. at least 2, probably three of the yadif sponsors don't fall into that category. there are a number of companies who build bigger applications on top of ffmpeg and who want to be known as "fair" commercial open source users (whatever that is) 
Jan 11 18:43:28 <saste>	rmklp: the idea was to have a sort of sponsor advertised on the website, in a "Sponsors" page or something
Jan 11 18:43:30 <rmklp>	and are willing to pay money
Jan 11 18:43:43 <kierank>	there is money available for mxf
Jan 11 18:43:47 <kierank>	always is...
Jan 11 18:43:50 <saste>	I'm not of any company willing to do that
Jan 11 18:43:54 <saste>	ATM
Jan 11 18:44:07 <saste>	indeed most donations are from private users
Jan 11 18:44:13 <rmklp>	you mean something along the lines of gold, silver, bronzw sponsor? 
Jan 11 18:44:24 <saste>	rmklp, yes, kind of
Jan 11 18:45:21 <rmklp>	saste: IMHO the key is to give them an easy package (defined price, conditions) that they can choose. if they have to think how they can sponsor, it will probably not happen. 
Jan 11 18:45:42 <saste>	rmklp, sure
Jan 11 18:45:46 <kierank>	certainly I can ask encoding.com and zencoder and probably others
Jan 11 18:46:34 <rmklp>	michael mentioned something from, I think, a linux distro where they had conditions for becoming a gold/silver/bronze sponsor and those were based on money and company size and I think that is a good approach.
Jan 11 18:47:04 <saste>	maybe something like http://xbmc.org/
Jan 11 18:47:06 <rmklp>	I can talk to the companies I was in touch with for the yadif sponsoring and ask them as soon as there are conditions.
Jan 11 18:47:22 <rmklp>	and probably some more in the future.
Jan 11 18:48:06 <saste>	rmklp, yes thanks
Jan 11 18:48:07 <michaelni>	rmklp, i meant http://www.linuxfoundation.org/about/members / http://en.wikipedia.org/wiki/Linux_Foundation
Jan 11 18:48:17 *	iive (~iive <at> unaffiliated/iive) has joined #ffmpeg-meeting
Jan 11 18:49:10 <j-b>	Sorry, to ask, but before asking for money, do you have enough people to "eat" this money?
Jan 11 18:49:22 <saste>	the other problem is that we don't have a formal entity representing the project, so that could be from problematic to impossible
Jan 11 18:49:48 <saste>	j-b, right now we got around 2500-3000$ in 1,5 years of donations from SPI
Jan 11 18:49:58 <saste>	we spent around 500$
Jan 11 18:50:16 <saste>	so no for the moment we don't have much money need
Jan 11 18:50:37 <michaelni>	saste, pay new hw for all devels who need it
Jan 11 18:50:38 <saste>	what we could spend the money for: paying travel tickets to attend events, paying for hw
Jan 11 18:51:06 <saste>	also offer some opportunity to developers to pay some expenses when doing ffmpeg development
Jan 11 18:51:19 <saste>	but this is probably better addressed with bounties
Jan 11 18:51:34 <rmklp>	saste: yes, the legal entity thing is a big one and probably the most work
Jan 11 18:52:00 <llogan>	is fate missing any hardwares we can buy?
Jan 11 18:52:36 *	michaelni has stuff laying around he wanted to install fate on but didnt yet have time
Jan 11 18:53:40 <saste>	about donations, SPI will proably migrate to a different pay-by-credit-card system (current one if Pay&Pledge)
Jan 11 18:54:06 <saste>	and they're moving to have paypal support for Debian donations, if that work that will be extended to other associate projects as well
Jan 11 18:54:06 <michaelni>	or pay someone to update and maintain fateserver for example as a random small thing, that someone should do and that would only be a few hours work so could easily be payed for if we had a few k
Jan 11 18:55:34 <kierank>	I don't know if ubitux, BBB, smarter and others who write ASM would be interested in getting my AVX2 server colocated somewhere?
Jan 11 18:55:49 <kierank>	I have it lying around doing nothing in storage at the moment
Jan 11 18:56:10 <ubitux>	no particular interest myself in it right now
Jan 11 18:56:22 <llogan>	feel free to ask on -devel too
Jan 11 18:56:27 <rmklp>	saste: do you know if anyone has done research on the options regarding the legal entity thing? wasn't ffmtech founded for that purpose and would it fulfill it legally, if there were no other problems with it.
Jan 11 18:57:00 <saste>	rmklp, the main issue with ffmtech, apart the fork thing, was the no-profit status
Jan 11 18:57:23 <saste>	which was never recognized and was pending since the organization was created
Jan 11 18:57:32 <saste>	i don't know what's the current status
Jan 11 18:57:33 <llogan>	what is the status on ffmtech? does it still exist?
Jan 11 18:57:56 <saste>	llogan, you can check it by yourself: http://www.ffmtech.org/
Jan 11 18:58:04 <rmklp>	judjing by what diego wrote to me just recently, very much so.
Jan 11 18:58:05 <smarter>	I'm not concerned about AVX2 yet, there's plenty to do before that :)
Jan 11 18:58:37 <kierank>	smarter: useful for benchmarking on modern hardware though
Jan 11 18:59:17 <llogan>	saste: are there any FFmpeg devs involved?
Jan 11 18:59:35 <saste>	llogan, reimar is still part of the board i think
Jan 11 18:59:41 <rmklp>	I though at least Reimar was on their board
Jan 11 19:01:06 <llogan>	http://ffmtech.org/board.html
Jan 11 19:01:32 <llogan>	shall we move on to the next topic?
Jan 11 19:01:38 <rmklp>	Another hypothetical question: Is there anyone interested in doing this differently, if the non-profit way does not work, i.e. found a company that offers stuff around ffmpeg, like JBoss inc. did for the jboss application server? Disclaimer: I am not interested in being part of this. I am merely listing options.
Jan 11 19:02:38 <kierank>	That's not easy because there's a lot of things to deal with
Jan 11 19:02:38 <saste>	michaelni, about small maintenance tasks, we have some donation money we could spend on that, if we have a proposal
Jan 11 19:02:46 <kierank>	rmklp: on site visits, patents, etc
Jan 11 19:02:49 <rmklp>	but may be completely not what people here want but it is a theoretical option, requiring a lot of work
Jan 11 19:03:01 <rmklp>	kierank: absolutely
Jan 11 19:03:09 <kierank>	the reality is people who choose ffmpeg do it because they have no money anyway
Jan 11 19:03:18 <kierank>	or are competent enough to do things themselves
Jan 11 19:03:46 <rmklp>	kierank: there may be some that match that description but there are others. But I don't have numbers.
Jan 11 19:04:43 <rmklp>	I would guess that there are a lot of api users out there who would even pay for support but of course I might be wrong. I just know I would (depending on the price).
Jan 11 19:05:14 <kierank>	API users are orders of magnitude lower than ffmpeg users
Jan 11 19:05:31 <kierank>	since it's easier to write scripts around ffmpeg than to try and understand the api
Jan 11 19:05:38 <rmklp>	I am not saying this would become a 500M enterprise like jboss but ffmpeg is used by a lot of companies as a library in products
Jan 11 19:06:20 <rmklp>	you are focusing on transcoding. there are tons of other uses of the library.
Jan 11 19:06:39 <rmklp>	but of course you are right.
Jan 11 19:06:58 <kierank>	the biggest use of ffmpeg by far is transcoding
Jan 11 19:07:14 <wm4>	often I think it focuses on transcoding too much...
Jan 11 19:07:23 <wm4>	the library, at least
Jan 11 19:07:24 <kierank>	direct use of ffmepg I mean
Jan 11 19:07:43 <wm4>	yeah, ffmpeg.c isn't much of use for other things
Jan 11 19:08:32 <kriegerod>	rmklp, your idea of company doing ffmpeg support is viable. I have seen there are some such companies around GStreamer, e.g. http://www.centricular.com/, also some theirs devs are at Collabora, which is a company of that sort
Jan 11 19:08:53 <rmklp>	yes but if you would get just 20 companies that use ffmpeg in players, analysis software etc. to pay 1000$ a year for sponsoring or a little higher priority in support, you would certainly increase the generated money considerably compared to knwo and that is not very optimistic.
Jan 11 19:10:10 <rmklp>	as I said, I have so far only talked to a handful of fellow companies that develop software that uses ffmpeg as a library and more than half seemed open to something like that.
Jan 11 19:10:46 <kierank>	the number of companies that use ffmpeg as a library is quite small imo
Jan 11 19:10:53 <rmklp>	but it needs a lot of work an dedication and has a lot of potential for bad things 
Jan 11 19:11:13 <kierank>	most of the mainstream features work well
Jan 11 19:11:19 <kierank>	people will pay money for niche stuff
Jan 11 19:11:29 <kierank>	(e.g mxf) but the problem with niche stuff is there are few people to do it
Jan 11 19:11:29 <michaelni>	i think we should provide the option for companies who want to sponsor ffmpeg to do so
Jan 11 19:11:50 <kierank>	michaelni: there have to be pacakages
Jan 11 19:11:59 <kierank>	and some clear message as to where money is going
Jan 11 19:12:02 <saste>	or in alternative to pay for bounties, which would avoid the need for a formal entity/company behind it
Jan 11 19:12:11 <michaelni>	kierank, money goes to SPI-ffmpeg
Jan 11 19:12:18 <kierank>	michaelni: i mean what for
Jan 11 19:12:37 <kierank>	michaelni: people show this to their managers
Jan 11 19:12:55 <kierank>	managers don't give a shit about SPI. they care about the money going to things which help the project (hw, fate etc)
Jan 11 19:13:00 <saste>	michaelni, so it would be DONOR -> SPI -> CONTRIBUTOR
Jan 11 19:13:19 <saste>	the problem is that we need approval from the SPI treasurer
Jan 11 19:13:20 <rmklp>	kierank: I think I know companies who would pay just to get on the list of companies that support ffmpeg regardless of where the money goes but it is of course better to write something about that
Jan 11 19:13:20 <michaelni>	kierank, yes, we would need a list
Jan 11 19:13:46 <michaelni>	saste, can we try to pay some small development via SPI to see if this is possible or not ?
Jan 11 19:13:58 <saste>	michaelni, i think it is already possible
Jan 11 19:14:10 <saste>	but it is decided on a case-by-case basis
Jan 11 19:14:19 <rmklp>	by SPI
Jan 11 19:14:20 <rmklp>	?
Jan 11 19:14:34 <saste>	SPI is a non-profit, and thus must be very careful about how the money is spent
Jan 11 19:15:06 <saste>	rmklp, yes, basically when we decide about a refund request, it must be approved by the SPI treasurer
Jan 11 19:15:15 <saste>	so we have no direct control over the donation money
Jan 11 19:15:32 <rmklp>	if that is only a theoretical hurdle and easy in practice, it would be a good thing. what do you think?
Jan 11 19:15:56 <saste>	rmklp, i think it can be done for internal developments
Jan 11 19:16:30 <saste>	but in case it is a company requesting some work, we can't go through SPI (in that case it would be better to use an independent bounty platform)
Jan 11 19:16:56 <saste>	otherwise you can't guarantee the company that the donated money will be spent for the task
Jan 11 19:18:25 <rmklp>	legally doing something like a bountysource project is a contract. do you know, how in the case of ffmpeg would be the parties? would have to be the individual developers who pledge to implement the feature, wouldn't it?
Jan 11 19:18:38 <rmklp>	s/how/who
Jan 11 19:19:06 <saste>	rmklp, yes, but in that case it is a matter between individual ffmpeg developers and the pledgers/donors
Jan 11 19:19:15 <saste>	ffmpeg as a formal entity is not involved at all
Jan 11 19:19:33 <saste>	indeed the developers could also not be ffmpeg developers at all
Jan 11 19:20:49 <saste>	about merchandising we basically have the same issues, lacking a formal entity
Jan 11 19:20:55 <saste>	but I might be wrong
Jan 11 19:22:14 <rmklp>	hypothetical example just for understanding: If I thought having a fast j2k encoder that supports a certain pixel format would be a project that could generate some money, I would try to convince someone like michael to offer that and he would say, he needed 20000 dollars for the implementation and then would open the bountysource project?
Jan 11 19:22:28 <saste>	rmklp, yes
Jan 11 19:22:55 <saste>	or the other way around, random developer propose a task, and an individual/company fund it in case of interest
Jan 11 19:23:15 <rmklp>	yes.
Jan 11 19:24:43 <rmklp>	so what is going to happen now? Someone is going to "test" paying a developer via SPI to find out if that works? What else? Is someone going to propose a sponsorship program?
Jan 11 19:25:06 <saste>	rmklp, this is point 3. development task proposals
Jan 11 19:25:13 <saste>	should we go on?
Jan 11 19:25:45 <rmklp>	saste: I did not understand that. how is it related to 3.?
Jan 11 19:25:59 <saste>	also we will probably discuss the topic on the mailing-list, to see if there are volunteers for setting up bounty projects
Jan 11 19:26:14 <rmklp>	ok
Jan 11 19:26:30 <saste>	rmklp, > Someone is going to "test" paying a developer via SPI to find out if that works?
Jan 11 19:26:56 <saste>	right now we have 2K$ of donated money, so maybe it is not enough for a complex project
Jan 11 19:27:14 <saste>	(and we should probably spend that money for other stuff, like travel refunds)
Jan 11 19:27:28 <rmklp>	once yadif is committed it will be a bit more
Jan 11 19:28:22 <saste>	but that works that a developer proposes a funded task, then it is discussed and approved on list and finally the money is sent if approved by SPI
Jan 11 19:28:39 <rmklp>	ok
Jan 11 19:28:56 <saste>	to follow that path we first need a contributor proposing the task
Jan 11 19:29:54 <saste>	should we skip to point 3.?
Jan 11 19:31:11 <saste>	so it is: 3. development task proposals
Jan 11 19:31:17 <kierank>	does that include gsoc?
Jan 11 19:31:42 <saste>	kierank, also
Jan 11 19:31:57 <saste>	although I mostly intended that as "funded development task proposals"
Jan 11 19:32:15 <saste>	about gsoc, I'm not sure we will be accepted for gsoc even this year
Jan 11 19:32:40 <saste>	indeed i'm not even sure it is a good idea to apply
Jan 11 19:32:53 <kierank>	saste: afaik google are ok with ffmpeg/libav now
Jan 11 19:33:30 <saste>	kierank, good to know
Jan 11 19:34:42 <kriegerod>	couple of days ago on maillist there was a request for DVB subtitles support. I said i'll check that, but i'm ok if anybody else takes it, or if we try this issue as a polygon to experiment with above discussed things
Jan 11 19:34:56 <saste>	we talked about an internal ffmpeg summer of code, but we probably lack the organization/money
Jan 11 19:35:29 <saste>	we could do it together with videolan if there is some interest and it's not too complicate for them
Jan 11 19:35:41 <saste>	kriegerod, sure
Jan 11 19:35:53 <saste>	about that, i also want to propose some candidate funding tasks
Jan 11 19:36:09 <saste>	namely: DVD reading support, and high-level scripting binding
Jan 11 19:36:25 <saste>	but: I only do that if I find a partner to work with me
Jan 11 19:36:28 <kierank>	dvd reading?
Jan 11 19:36:28 <kierank>	wow
Jan 11 19:36:40 <kierank>	someone's crazy :)
Jan 11 19:37:18 <j-b>	kierank: I don't know where you get this information from, tbh
Jan 11 19:37:35 <kierank>	j-b: mentor summit
Jan 11 19:37:37 <kierank>	av500 asked
Jan 11 19:37:45 <kierank>	VLC is not in a good position however
Jan 11 19:37:46 <j-b>	like they said last year
Jan 11 19:37:56 <j-b>	kierank: we won't apply, anyway
Jan 11 19:38:12 <j-b>	kierank: bored of this PC bullshit
Jan 11 19:39:20 <saste>	anyway, more proposals?
Jan 11 19:40:01 <saste>	but discussion and proposals can go on on other channels...
Jan 11 19:40:39 <saste>	next point?
Jan 11 19:41:02 <kierank>	j2k encoder is probably the only large thing missing from the pro perspective, as much as i hate j2k
Jan 11 19:41:21 <saste>	kierank, would you work on that?
Jan 11 19:41:33 <kierank>	no, don't have time
Jan 11 19:41:39 <llogan>	saste: i'm personally not excited about GSoC
Jan 11 19:41:57 *	rmklp has quit (Quit: rmklp)
Jan 11 19:42:06 <saste>	kierank, or can you find someone who will?
Jan 11 19:42:22 <kierank>	don't think so
Jan 11 19:43:17 <saste>	if there is not anything else we can go to the next and last point
Jan 11 19:43:33 <saste>	4. miscellanea
Jan 11 19:43:55 <saste>	ubitux, any news about the website restyling?
Jan 11 19:44:34 <ubitux>	not much progress, but i'll keep you up-to-date
Jan 11 19:44:51 <saste>	ubitux, mh, okay
Jan 11 19:44:57 <michaelni>	someone should contact apple and ask them about details / bug reports of the prores issues they mentioned on that page
Jan 11 19:45:10 <llogan>	what's this on the web site restyling?
Jan 11 19:45:55 <ubitux>	llogan: http://db0.galo.pe/ffmpeg-web/htdocs/
Jan 11 19:46:11 <ubitux>	"WIP"
Jan 11 19:46:19 <llogan>	i am unaware of any work to update the site
Jan 11 19:46:21 <saste>	also it would be nice if we add a goodies section
Jan 11 19:46:48 <saste>	with designs we collected from past logo contests
Jan 11 19:46:58 <saste>	i'll probably try to find some time about that
Jan 11 19:47:00 <llogan>	who is doing the redesign?
Jan 11 19:47:12 <saste>	we should also define the license of the content
Jan 11 19:47:33 <saste>	but if someone wants to do that he's welcome
Jan 11 19:47:51 <michaelni>	goodies section maybe best on the wiki so work on it can be shared with more people
Jan 11 19:48:14 <saste>	michaelni, that works for me as well
Jan 11 19:48:29 <saste>	although it would have more visibility on the official website
Jan 11 19:48:38 <saste>	btw what's the license of the wiki content?
Jan 11 19:48:43 <saste>	what if we add artwork?
Jan 11 19:48:43 <michaelni>	the official site could link to the wiki
Jan 11 19:49:16 <llogan>	The materials within the Community Contributed Documentation section of the FFmpeg Wiki are released under the ​Creative Commons Attribution-ShareAlike 3.0 License.
Jan 11 19:49:49 <saste>	about logo contests, did we specify the required license?
Jan 11 19:49:59 <ubitux>	llogan: db0 on #ffmpeg-devel
Jan 11 19:50:13 <saste>	otherwise we'll need to get in touch directly with the various contributors
Jan 11 19:50:34 <saste>	also herve flores suggested to adopt a commercial license for artwork/logos
Jan 11 19:50:36 <llogan>	ubitux: i don't know who that is
Jan 11 19:51:10 <ubitux>	someone i know
Jan 11 19:51:18 <ubitux>	not involved in ffmpeg developement so far
Jan 11 19:51:22 <ubitux>	except for this
Jan 11 19:52:03 <saste>	other misc topics?
Jan 11 19:52:09 <llogan>	i don't prefer the dark look but i guess we can see how it turns out
Jan 11 19:53:55 <michaelni>	what shall we do with libavfilter.net, libavcodec.net, libavutil.net, libswresample.net and others ?
Jan 11 19:54:08 <michaelni>	we are in control of them but they cost money
Jan 11 19:54:11 <llogan>	saste: no specific logo license has been selected IIRC for submissions
Jan 11 19:54:21 <llogan>	michaelni: dump them.
Jan 11 19:55:01 <saste>	michaelni, same from me, if we don't have appealing reasons to keep them
Jan 11 19:55:30 <saste>	is someone planning to attend some FLOSS event this year?
Jan 11 19:55:47 <michaelni>	if noone wants to use them (for ffmpeg stuff) and noone wants to sponsor it then ill let them expire
Jan 11 19:56:48 <saste>	i'll probably try to attend some if we are enough to man an ffmpeg booth
Jan 11 19:57:16 <saste>	fosdem is probably too close, so the next viable event is probably linuxtag
Jan 11 19:57:33 <llogan>	i bet beastd will go to that
Jan 11 19:57:38 <llogan>	maybe thilo too
Jan 11 19:57:42 *	j-b (~jb <at> videolan/developer/j-b) has left #ffmpeg-meeting
Jan 11 19:58:24 <saste>	llogan, part of the donation money could be spent for paying (at least part) of the travel tickets
Jan 11 19:59:21 <saste>	if there is nothing more we can close the meeting
Jan 11 20:00:06 *	rmklp (~krueger <at> ip-178-200-241-251.unitymediagroup.de) has joined #ffmpeg-meeting
Jan 11 20:00:33 <llogan>	saste: thanks for organizing and herding cats
Jan 11 20:00:46 <saste>	michaelni, anything else?
Jan 11 20:01:18 <michaelni>	not really, noone wants to ask apple about the prores issues ?
Jan 11 20:01:27 <Cigaes>	Thanks indeed for the organization.
Jan 11 20:01:37 <michaelni>	saste, thx as well from me
Jan 11 20:02:12 <saste>	michaelni, about the prores thing, a private mail is probably better
Jan 11 20:02:48 <michaelni>	you volunteer to send apple a private mail ? or you mean i should ?
Jan 11 20:03:19 <saste>	michaelni, yes, probably doing it yourself would be faster
Jan 11 20:03:39 <saste>	as for me, i'm not even sure what the issues are about
Jan 11 20:03:46 <michaelni>	ok then
Jan 11 20:04:04 <saste>	then i suppose we can close the meeting
Jan 11 20:04:17 <saste>	thanks all for your time
Jan 11 20:04:24 <Cigaes>	Good bye.
Jan 11 20:04:38 <saste>	i'm going to send the meeting log later today
Jan 11 20:05:00 <saste>	(...to the ffmpeg-devel mailing list)
Jan 11 20:05:12 <saste>	good bye!
Jan 11 20:05:49 <michaelni>	good bye all, until the next meeting ...
Jan 11 20:05:56 *	Cigaes has quit (Quit: leaving)
Jan 11 20:05:57 *	michaelni (~michael <at> chello084114129144.4.15.vie.surfer.at) has left #ffmpeg-meeting ("Leaving")
Jan 11 20:06:35 *	ubitux (~ux <at> did75-21-88-189-231-41.fbx.proxad.net) has left #ffmpeg-meeting
Jan 11 20:06:38 *	llogan (~llogan <at> pdpc/supporter/student/pasteeater) has left #ffmpeg-meeting ("WeeChat 0.3.2")
Jan 11 20:08:43 *	wm4 (~wm4 <at> ip-static-94-242-209-206.as5577.net) has left #ffmpeg-meeting ("Leaving")
**** ENDING LOGGING AT Sat Jan 11 20:14:28 2014
Shortcuts

import torch
from torch.nn.modules.container import ModuleList, ModuleDict, Module
from torch.nn.parameter import Parameter
from torch import Tensor

import collections
from contextlib import contextmanager
from typing import Union, Optional, Dict, Tuple, Sequence


_cache_enabled = 0
_cache: Dict[Tuple[int, str], Optional[Tensor]] = {}


[docs]@contextmanager
def cached():
    r"""Context manager that enables the caching system within parametrizations
    registered with :func:`register_parametrization`.

    The value of the parametrized objects is computed and cached the first time
    they are required when this context manager is active. The cached values are
    discarded when leaving the context manager.

    This is useful when using a parametrized parameter more than once in the forward pass.
    An example of this is when parametrizing the recurrent kernel of an RNN or when
    sharing weights.

    The simplest way to activate the cache is by wrapping the forward pass of the neural network

    .. code-block:: python

        import torch.nn.utils.parametrize as P
        ...
        with P.cached():
            output = model(inputs)

    in training and evaluation. One may also wrap the parts of the modules that use
    several times the parametrized tensors. For example, the loop of an RNN with a
    parametrized recurrent kernel:

    .. code-block:: python

        with P.cached():
            for x in xs:
                out_rnn = self.rnn_cell(x, out_rnn)
    """
    global _cache
    global _cache_enabled
    _cache_enabled += 1
    try:
        yield
    finally:
        _cache_enabled -= 1
        if not _cache_enabled:
            _cache = {}


def _register_parameter_or_buffer(module, name, X):
    if isinstance(X, Parameter):
        module.register_parameter(name, X)
    else:
        module.register_buffer(name, X)


[docs]class ParametrizationList(ModuleList):
    r"""A sequential container that holds and manages the ``original`` or ``original0``, ``original1``, ...
    parameters or buffers of a parametrized :class:`torch.nn.Module`.

    It is the type of ``module.parametrizations[tensor_name]`` when ``module[tensor_name]``
    has been parametrized with :func:`register_parametrization`.

    If the first registered parmetrization has a ``right_inverse`` that returns one tensor or
    does not have a ``right_inverse`` (in which case we assume that ``right_inverse`` is the identity),
    it will hold the tensor under the name ``original``.
    If it has a ``right_inverse`` that returns more than one tensor, these will be registered as
    ``original0``, ``original1``, ...

    .. warning::
        This class is used internally by :func:`register_parametrization`. It is documented
        here for completeness. It shall not be instantiated by the user.

    Args:
        modules (sequence): sequence of modules representing the parametrizations
        original (Parameter or Tensor): parameter or buffer that is parametrized
        unsafe (bool): a boolean flag that denotes whether the parametrization
            may change the dtype and shape of the tensor. Default: `False`
            Warning: the parametrization is not checked for consistency upon registration.
            Enable this flag at your own risk.
    """
    original: Tensor
    unsafe: bool

    def __init__(
        self, modules: Sequence[Module], original: Union[Tensor, Parameter], unsafe: bool = False
    ) -> None:
        # We require this because we need to treat differently the first parametrization
        # This should never throw, unless this class is used from the outside
        if len(modules) == 0:
            raise ValueError("ParametrizationList requires one or more modules.")

        super().__init__(modules)
        self.unsafe = unsafe

        # In plain words:
        # module.weight must keep its dtype and shape.
        # Furthermore, if there is no right_inverse or the right_inverse returns a tensor,
        # this should be of the same dtype as the original tensor
        #
        # We check that the following invariants hold:
        #    X = module.weight
        #    Y = param.right_inverse(X)
        #    assert isinstance(Y, Tensor) or
        #           (isinstance(Y, collections.abc.Sequence) and all(isinstance(t, Tensor) for t in Y))
        #    Z = param(Y) if isisntance(Y, Tensor) else param(*Y)
        #    # Consistency checks
        #    assert X.dtype == Z.dtype and X.shape == Z.shape
        #    # If it has one input, this allows to be able to use set_ to be able to
        #    # move data to/from the original tensor without changing its id (which is what the
        #    # optimiser uses to track parameters)
        #    if isinstance(Y, Tensor)
        #      assert X.dtype == Y.dtype
        # Below we use original = X, new = Y

        original_shape = original.shape
        original_dtype = original.dtype

        # Compute new
        with torch.no_grad():
            new = original
            for module in reversed(self):  # type: ignore[call-overload]
                if hasattr(module, "right_inverse"):
                    try:
                        new = module.right_inverse(new)
                    except NotImplementedError:
                        pass
                # else, or if it throws, we assume that right_inverse is the identity

        if not isinstance(new, Tensor) and not isinstance(new, collections.abc.Sequence):
            raise ValueError("'right_inverse' must return a Tensor or a Sequence of tensors (list, tuple...). "
                             f"Got {type(new).__name__}")

        # Set the number of original tensors
        self.is_tensor = isinstance(new, Tensor)
        self.ntensors = 1 if self.is_tensor else len(new)

        # Register the tensor(s)
        if self.is_tensor:
            if original.dtype != new.dtype:
                raise ValueError(
                    "When `right_inverse` outputs one tensor, it may not change the dtype.\n"
                    f"original.dtype: {original.dtype}\n"
                    f"right_inverse(original).dtype: {new.dtype}"
                )
            # Set the original to original so that the user does not need to re-register the parameter
            # manually in the optimiser
            with torch.no_grad():
                original.set_(new)  # type: ignore[call-overload]
            _register_parameter_or_buffer(self, "original", original)
        else:
            for i, originali in enumerate(new):
                if not isinstance(originali, Tensor):
                    raise ValueError("'right_inverse' must return a Tensor or a Sequence of tensors "
                                     "(list, tuple...). "
                                     f"Got element {i} of the sequence with type {type(originali).__name__}.")

                # If the original tensor was a Parameter that required grad, we expect the user to
                # add the new parameters to the optimizer after registering the parametrization
                # (this is documented)
                if isinstance(original, Parameter):
                    originali = Parameter(originali)
                originali.requires_grad_(original.requires_grad)
                _register_parameter_or_buffer(self, f"original{i}", originali)

        if not self.unsafe:
            # Consistency checks:
            # Since f : A -> B, right_inverse : B -> A, Z and original should live in B
            # Z = forward(right_inverse(original))
            Z = self()
            if not isinstance(Z, Tensor):
                raise ValueError(
                    f"A parametrization must return a tensor. Got {type(Z).__name__}."
                )
            if Z.dtype != original_dtype:
                raise ValueError(
                    "Registering a parametrization may not change the dtype of the tensor, unless `unsafe` flag is enabled.\n"
                    f"unparametrized dtype: {original_dtype}\n"
                    f"parametrized dtype: {Z.dtype}"
                )
            if Z.shape != original_shape:
                raise ValueError(
                    "Registering a parametrization may not change the shape of the tensor, unless `unsafe` flag is enabled.\n"
                    f"unparametrized shape: {original_shape}\n"
                    f"parametrized shape: {Z.shape}"
                )

[docs]    def right_inverse(self, value: Tensor) -> None:
        r"""Calls the methods ``right_inverse`` (see :func:`register_parametrization`)
        of the parametrizations in the inverse order they were registered in.
        Then, it stores the result in ``self.original`` if ``right_inverse`` outputs one tensor
        or in ``self.original0``, ``self.original1``, ... if it outputs several.

        Args:
            value (Tensor): Value to which initialize the module
        """
        # All the exceptions in this function should almost never throw.
        # They could throw if, for example, right_inverse function returns a different
        # dtype when given a different input, which should most likely be caused by a
        # bug in the user's code

        with torch.no_grad():
            # See https://github.com/pytorch/pytorch/issues/53103
            for module in reversed(self):  # type: ignore[call-overload]
                if hasattr(module, "right_inverse"):
                    value = module.right_inverse(value)
                else:
                    raise RuntimeError(f"parametrization {type(module).__name__} does not implement "
                                       "right_inverse.")
            if self.is_tensor:
                # These exceptions should only throw when a right_inverse function does not
                # return the same dtype for every input, which should most likely be caused by a bug
                if not isinstance(value, Tensor):
                    raise ValueError(
                        f"`right_inverse` should return a tensor. Got {type(value).__name__}"
                    )
                if value.dtype != self.original.dtype:
                    raise ValueError(
                        f"The tensor returned by `right_inverse` has dtype {value.dtype} "
                        f"while `original` has dtype {self.original.dtype}"
                    )
                # We know that the result is going to have the same dtype
                self.original.set_(value)  # type: ignore[call-overload]
            else:
                if not isinstance(value, collections.abc.Sequence):
                    raise ValueError(
                        "'right_inverse' must return a sequence of tensors. "
                        f"Got {type(value).__name__}."
                    )
                if len(value) != self.ntensors:
                    raise ValueError(
                        "'right_inverse' must return a sequence of tensors of length "
                        f"{self.ntensors}. Got a sequence of lenght {len(value)}."
                    )
                for i, tensor in enumerate(value):
                    original_i = getattr(self, f"original{i}")
                    if not isinstance(tensor, Tensor):
                        raise ValueError(
                            f"`right_inverse` must return a sequence of tensors. "
                            f"Got element {i} of type {type(tensor).__name__}"
                        )
                    if original_i.dtype != tensor.dtype:
                        raise ValueError(
                            f"Tensor {i} returned by `right_inverse` has dtype {tensor.dtype} "
                            f"while `original{i}` has dtype {original_i.dtype}"
                        )
                    original_i.set_(tensor)

    def forward(self) -> Tensor:
        # Unpack the originals for the first parametrization
        if self.is_tensor:
            x = self[0](self.original)
        else:
            originals = (getattr(self, f"original{i}") for i in range(self.ntensors))
            x = self[0](*originals)
        # It's not possible to call self[1:] here, so we have to be a bit more cryptic
        # Also we want to skip all non-integer keys
        curr_idx = 1
        while hasattr(self, str(curr_idx)):
            x = self[curr_idx](x)
            curr_idx += 1
        return x


def _inject_new_class(module: Module) -> None:
    r"""Sets up a module to be parametrized.

    This works by substituting the class of the module by a class
    that extends it to be able to inject a property

    Args:
        module (nn.Module): module into which to inject the property
    """
    cls = module.__class__

    def getstate(self):
        raise RuntimeError(
            "Serialization of parametrized modules is only "
            "supported through state_dict(). See:\n"
            "https://pytorch.org/tutorials/beginner/saving_loading_models.html"
            "#saving-loading-a-general-checkpoint-for-inference-and-or-resuming-training"
        )

    param_cls = type(
        f"Parametrized{cls.__name__}",
        (cls,),
        {
            "__getstate__": getstate,
        },
    )

    module.__class__ = param_cls


def _inject_property(module: Module, tensor_name: str) -> None:
    r"""Injects a property into module[tensor_name].

    It assumes that the class in the module has already been modified from its
    original one using _inject_new_class and that the tensor under :attr:`tensor_name`
    has already been moved out

    Args:
        module (nn.Module): module into which to inject the property
        tensor_name (str): name of the name of the property to create
    """
    # We check the precondition.
    # This should never fire if register_parametrization is correctly implemented
    assert not hasattr(module, tensor_name)

    @torch.jit.unused
    def get_cached_parametrization(parametrization) -> Tensor:
        global _cache
        key = (id(module), tensor_name)
        tensor = _cache.get(key)
        if tensor is None:
            tensor = parametrization()
            _cache[key] = tensor
        return tensor

    def get_parametrized(self) -> Tensor:
        parametrization = self.parametrizations[tensor_name]
        if _cache_enabled:
            if torch.jit.is_scripting():
                # Scripting
                raise RuntimeError('Caching is not implemented for scripting. '
                                   'Either disable caching or avoid scripting.')
            elif torch._C._get_tracing_state() is not None:
                # Tracing
                raise RuntimeError('Cannot trace a model while caching parametrizations.')
            else:
                return get_cached_parametrization(parametrization)
        else:
            # If caching is not active, this function just evaluates the parametrization
            return parametrization()

    def set_original(self, value: Tensor) -> None:
        self.parametrizations[tensor_name].right_inverse(value)

    setattr(module.__class__, tensor_name, property(get_parametrized, set_original))

[docs]def register_parametrization(
    module: Module, tensor_name: str, parametrization: Module, *, unsafe: bool = False,
) -> Module:
    r"""Adds a parametrization to a tensor in a module.

    Assume that ``tensor_name="weight"`` for simplicity. When accessing ``module.weight``,
    the module will return the parametrized version ``parametrization(module.weight)``.
    If the original tensor requires a gradient, the backward pass will differentiate
    through :attr:`parametrization`, and the optimizer will update the tensor accordingly.

    The first time that a module registers a parametrization, this function will add an attribute
    ``parametrizations`` to the module of type :class:`~ParametrizationList`.

    The list of parametrizations on the tensor ``weight`` will be accessible under
    ``module.parametrizations.weight``.

    The original tensor will be accessible under
    ``module.parametrizations.weight.original``.

    Parametrizations may be concatenated by registering several parametrizations
    on the same attribute.

    The training mode of a registered parametrization is updated on registration
    to match the training mode of the host module

    Parametrized parameters and buffers have an inbuilt caching system that can be activated
    using the context manager :func:`cached`.

    A :attr:`parametrization` may optionally implement a method with signature

    .. code-block:: python

        def right_inverse(self, X: Tensor) -> Union[Tensor, Sequence[Tensor]]

    This method is called on the unparametrized tensor when the first parametrization
    is registered to compute the initial value of the original tensor.
    If this method is not implemented, the original tensor will be just the unparametrized tensor.

    If all the parametrizations registered on a tensor implement `right_inverse` it is possible
    to initialize a parametrized tensor by assigning to it, as shown in the example below.

    It is possible for the first parametrization to depend on several inputs.
    This may be implemented returning a tuple of tensors from ``right_inverse``
    (see the example implementation of a ``RankOne`` parametrization below).

    In this case, the unconstrained tensors are also located under ``module.parametrizations.weight``
    with names ``original0``, ``original1``,...

    .. note::

        If unsafe=False (default) both the forward and right_inverse methods will be called
        once to perform a number of consistency checks.
        If unsafe=True, then right_inverse will be called if the tensor is not parametrized,
        and nothing will be called otherwise.

    .. note::

        In most situations, ``right_inverse`` will be a function such that
        ``forward(right_inverse(X)) == X`` (see
        `right inverse <https://en.wikipedia.org/wiki/Inverse_function#Right_inverses>`_).
        Sometimes, when the parametrization is not surjective, it may be reasonable
        to relax this.

    .. warning::

        If a parametrization depends on several inputs, :func:`~register_parametrization`
        will register a number of new parameters. If such parametrization is registered
        after the optimizer is created, these new parameters will need to be added manually
        to the optimizer. See :meth:`torch.Optimizer.add_param_group`.

    Args:
        module (nn.Module): module on which to register the parametrization
        tensor_name (str): name of the parameter or buffer on which to register
            the parametrization
        parametrization (nn.Module): the parametrization to register
    Keyword args:
        unsafe (bool): a boolean flag that denotes whether the parametrization
            may change the dtype and shape of the tensor. Default: `False`
            Warning: the parametrization is not checked for consistency upon registration.
            Enable this flag at your own risk.

    Raises:
        ValueError: if the module does not have a parameter or a buffer named :attr:`tensor_name`

    Examples:
        >>> import torch
        >>> import torch.nn as nn
        >>> import torch.nn.utils.parametrize as P
        >>>
        >>> class Symmetric(nn.Module):
        >>>     def forward(self, X):
        >>>         return X.triu() + X.triu(1).T  # Return a symmetric matrix
        >>>
        >>>     def right_inverse(self, A):
        >>>         return A.triu()
        >>>
        >>> m = nn.Linear(5, 5)
        >>> P.register_parametrization(m, "weight", Symmetric())
        >>> print(torch.allclose(m.weight, m.weight.T))  # m.weight is now symmetric
        True
        >>> A = torch.rand(5, 5)
        >>> A = A + A.T   # A is now symmetric
        >>> m.weight = A  # Initialize the weight to be the symmetric matrix A
        >>> print(torch.allclose(m.weight, A))
        True

        >>> class RankOne(nn.Module):
        >>>     def forward(self, x, y):
        >>>         # Form a rank 1 matrix multiplying two vectors
        >>>         return x.unsqueeze(-1) @ y.unsqueeze(-2)
        >>>
        >>>     def right_inverse(self, Z):
        >>>         # Project Z onto the rank 1 matrices
        >>>         U, S, Vh = torch.linalg.svd(Z, full_matrices=False)
        >>>         # Return rescaled singular vectors
        >>>         s0_sqrt = S[0].sqrt().unsqueeze(-1)
        >>>         return U[..., :, 0] * s0_sqrt, Vh[..., 0, :] * s0_sqrt
        >>>
        >>> linear_rank_one = P.register_parametrization(nn.Linear(4, 4), "weight", RankOne())
        >>> print(torch.linalg.matrix_rank(linear_rank_one.weight).item())
        1

    """
    parametrization.train(module.training)
    if is_parametrized(module, tensor_name):
        # Correctness checks.
        # If A is the space of tensors with shape and dtype equal to module.weight
        # we check that parametrization.forward and parametrization.right_inverse are
        # functions from A to A
        if not unsafe:
            Y = getattr(module, tensor_name)
            X = parametrization(Y)
            if not isinstance(X, Tensor):
                raise ValueError(
                    f"A parametrization must return a tensor. Got {type(X).__name__}."
                )
            if X.dtype != Y.dtype:
                raise ValueError(
                    "Registering a parametrization may not change the dtype of the tensor, unless the `unsafe` flag is enabled.\n"
                    f"module.{tensor_name}.dtype: {Y.dtype}\n"
                    f"parametrization(module.{tensor_name}).dtype: {X.dtype}"
                )
            if X.shape != Y.shape:
                raise ValueError(
                    "Registering a parametrization may not change the shape of the tensor, unless the `unsafe` flag is enabled.\n"
                    f"module.{tensor_name}.shape: {Y.shape}\n"
                    f"parametrization(module.{tensor_name}).shape: {X.shape}"
                )
            if hasattr(parametrization, "right_inverse"):
                try:
                    Z = parametrization.right_inverse(X)  # type: ignore[operator]
                except NotImplementedError:
                    pass
                else:
                    if not isinstance(Z, Tensor):
                        raise ValueError(
                            f"parametrization.right_inverse must return a tensor. Got: {type(Z).__name__}"
                        )
                    if Z.dtype != Y.dtype:
                        raise ValueError(
                            "The tensor returned by parametrization.right_inverse must have the same dtype "
                            f"as module.{tensor_name}, unless the `unsafe` flag is enabled.\n"
                            f"module.{tensor_name}.dtype: {Y.dtype}\n"
                            f"returned dtype: {Z.dtype}"
                        )
                    if Z.shape != Y.shape:
                        raise ValueError(
                            "The tensor returned by parametrization.right_inverse must have the same shape "
                            f"as module.{tensor_name}, unless the `unsafe` flag is enabled.\n"
                            f"module.{tensor_name}.shape: {Y.shape}\n"
                            f"returned shape: {Z.shape}"
                        )
            # else right_inverse is assumed to be the identity

        # add the new parametrization to the parametrization list
        assert isinstance(module.parametrizations, ModuleDict)  # Make mypy happy
        module.parametrizations[tensor_name].append(parametrization)
        # If unsafe was True in previous parametrization, keep it enabled
        module.parametrizations[tensor_name].unsafe |= unsafe  # type: ignore[index, union-attr]
    elif tensor_name in module._buffers or tensor_name in module._parameters:
        # Set the parametrization mechanism
        # Fetch the original buffer or parameter
        original = getattr(module, tensor_name)
        # We create this early to check for possible errors
        parametrizations = ParametrizationList([parametrization], original, unsafe=unsafe)
        # Delete the previous parameter or buffer
        delattr(module, tensor_name)
        # If this is the first parametrization registered on the module,
        # we prepare the module to inject the property
        if not is_parametrized(module):
            # Change the class
            _inject_new_class(module)
            # Inject a ``ModuleDict`` into the instance under module.parametrizations
            module.parametrizations = ModuleDict()
        # Add a property into the class
        _inject_property(module, tensor_name)
        # Add a ParametrizationList
        assert isinstance(module.parametrizations, ModuleDict)  # Make mypy happy
        module.parametrizations[tensor_name] = parametrizations
    else:
        raise ValueError(
            f"Module '{module}' does not have a parameter, a buffer, or a "
            f"parametrized element with name '{tensor_name}'"
        )
    return module


[docs]def is_parametrized(module: Module, tensor_name: Optional[str] = None) -> bool:
    r"""Returns ``True`` if module has an active parametrization.

    If the argument :attr:`tensor_name` is specified, returns ``True`` if
    ``module[tensor_name]`` is parametrized.

    Args:
        module (nn.Module): module to query
        name (str, optional): attribute in the module to query
            Default: ``None``
    """
    parametrizations = getattr(module, "parametrizations", None)
    if parametrizations is None or not isinstance(parametrizations, ModuleDict):
        return False
    if tensor_name is None:
        # Check that there is at least one parametrized buffer or Parameter
        return len(parametrizations) > 0
    else:
        return tensor_name in parametrizations


[docs]def remove_parametrizations(
    module: Module, tensor_name: str, leave_parametrized: bool = True
) -> Module:
    r"""Removes the parametrizations on a tensor in a module.

    - If ``leave_parametrized=True``, ``module[tensor_name]`` will be set to
      its current output. In this case, the parametrization shall not change the ``dtype``
      of the tensor.
    - If ``leave_parametrized=False``, ``module[tensor_name]`` will be set to
      the unparametrised tensor in ``module.parametrizations[tensor_name].original``.
      This is only possible when the parametrization depends on just one tensor.

    Args:
        module (nn.Module): module from which remove the parametrization
        tensor_name (str): name of the parametrization to be removed
        leave_parametrized (bool, optional): leave the attribute :attr:`tensor_name` parametrized.
            Default: ``True``

    Returns:
        Module: module

    Raises:
        ValueError: if ``module[tensor_name]`` is not parametrized
        ValueError: if ``leave_parametrized=False`` and the parametrization depends on several tensors
    """

    if not is_parametrized(module, tensor_name):
        raise ValueError(f"Module {module} does not have a parametrization on {tensor_name}")

    # Fetch the original tensor
    assert isinstance(module.parametrizations, ModuleDict)  # Make mypy happy
    parametrizations = module.parametrizations[tensor_name]
    if parametrizations.is_tensor:
        original = parametrizations.original
        if leave_parametrized:
            with torch.no_grad():
                t = getattr(module, tensor_name)
            # We know they have the same dtype because we have checked this when registering the
            # parametrizations. As such, we can use set_
            # We do this so that the parameter does not to change the id()
            # This way the user does not need to update the optimizer
            with torch.no_grad():
                original.set_(t)
    else:
        if leave_parametrized:
            # We cannot use no_grad because we need to know whether one or more
            # original tensors required grad
            t = getattr(module, tensor_name)
            # We'll have to trust the user to add it to the optimizer
            original = Parameter(t) if t.requires_grad else t
        else:
            raise ValueError("Cannot leave unparametrized (`leave_parametrized=False`) a tensor "
                             "that is parametrized in terms of a sequence of tensors.")

    # Delete the property that manages the parametrization
    delattr(module.__class__, tensor_name)
    # Delete the ParametrizationList
    del module.parametrizations[tensor_name]

    # Restore the parameter / buffer into the main class
    _register_parameter_or_buffer(module, tensor_name, original)

    # Roll back the parametrized class if no other buffer or parameter
    # is currently parametrized in this class
    if not is_parametrized(module):
        delattr(module, "parametrizations")
        # Restore class
        orig_cls = module.__class__.__bases__[0]
        module.__class__ = orig_cls
    return module

I pasted the tweaked PHP as well as the JS from the example below.


<?php

/**
 * Plugin Name: Manage WordPress Posts Using Bulk Edit and Quick Edit
 * Description: This is the code for a tutorial WP Dreamer wrote about managing WordPress posts using bulk and quick edit.
 * Author: WP Dreamer
 * Author URI: http://wpdreamer.com/2012/03/manage-wordpress-posts-using-bulk-edit-and-quick-edit/
 */

/**
 * I decided to convert the tutorial to a plugin format
 * so I could easily monitor it on my development environment
 * and store it on GitHub.
 *
 * With that said, you could easily take this code and paste it
 * into your theme's functions.php file. There is, however,
 * an included javascript file so be sure to check the
 * manage_wp_posts_be_qe_enqueue_admin_scripts()
 * function to confirm you're enqueueing the right javascript file.
 *
 * Also, after a few requests for custom field examples other than
 * text boxes, I updated the tutorial to include a select dropdown
 * and a radio button.
 *
 * Custom Fields:
 * 'Release Date - input text
 * 'Coming Soon' - input radio
 * 'Film Rating' - select dropdown
 *
 * If you find any issues with the tutorial, or code, please let me know. Thanks!
 */

/**
 * Since Bulk Edit and Quick Edit hooks are triggered by custom columns,
 * you must first add custom columns for the fields you wish to add, which are setup by
 * 'filtering' the column information.
 *
 * There are 3 different column filters: 'manage_pages_columns' for pages,
 * 'manage_posts_columns' which covers ALL post types (including custom post types),
 * and 'manage_{$post_type_name}_posts_columns' which only covers, you guessed it,
 * the columns for the defined $post_type_name.
 *
 * The 'manage_pages_columns' and 'manage_{$post_type_name}_posts_columns' filters only
 * pass $columns (an array), which is the column info, as an argument, but 'manage_posts_columns'
 * passes $columns and $post_type (a string).
 *
 * Note: Don't forget that it's a WordPress filter so you HAVE to return the first argument that's
 * passed to the function, in this case $columns. And for filters that pass more than 1 argument,
 * you have to specify the number of accepted arguments in your add_filter() declaration,
 * following the priority argument.
 *
 */
add_filter( 'manage_posts_columns', 'manage_wp_posts_be_qe_manage_posts_columns', 10, 2 );
function manage_wp_posts_be_qe_manage_posts_columns( $columns, $post_type ) {

    /**
     * The first example adds our new columns at the end.
     * Notice that we're specifying a post type because our function covers ALL post types.
     *
     * Uncomment this code if you want to add your column at the end
     */
    /*if ( $post_type == 'movies' ) {
        $columns[ 'release_date' ] = 'Release Date';
        $columns[ 'coming_soon' ] = 'Coming Soon';
        $columns[ 'film_rating' ] = 'Film Rating';
    }

    return $columns;*/

    /**
     * The second example adds our new column after the ÒTitleÓ column.
     * Notice that we're specifying a post type because our function covers ALL post types.
     */
    switch ( $post_type ) {

        case 'movies':

            // building a new array of column data
            $new_columns = array();

            foreach( $columns as $key => $value ) {

                // default-ly add every original column
                $new_columns[ $key ] = $value;

                /**
                 * If currently adding the title column,
                 * follow immediately with our custom columns.
                 */
                if ( $key == 'title' ) {
                    $new_columns[ 'release_date_column' ] = 'Release Date';
                    $new_columns[ 'coming_soon_column' ] = 'Coming Soon';
                    $new_columns[ 'film_rating_column' ] = 'Film Rating';
                }

            }

            return $new_columns;

    }

    return $columns;

}

/**
 * The following filter allows you to make your column(s) sortable.
 *
 * The 'edit-movies' section of the filter name is the custom part
 * of the filter name, which tells WordPress you want this to run
 * on the main 'movies' custom post type edit screen. So, e.g., if
 * your custom post type's name was 'books', then the filter name
 * would be 'manage_edit-books_sortable_columns'.
 *
 * Don't forget that filters must ALWAYS return a value.
 */
add_filter( 'manage_edit-movies_sortable_columns', 'manage_wp_posts_be_qe_manage_sortable_columns' );
function manage_wp_posts_be_qe_manage_sortable_columns( $sortable_columns ) {

    /**
     * In order to make a column sortable, add the
     * column data to the $sortable_columns array.
     *
     * I want to make my 'Release Date' column
     * sortable so the array indexes (the 'release_date_column'
     * value between the []) need to match from
     * where we added the column in the
     * manage_wp_posts_be_qe_manage_posts_columns()
     * function.
     *
     * The array value (after the =) should be set to
     * identify the data that is going to be sorted,
     * i.e. what will be placed in the URL when it's sorted.
     * Since my release date is a custom field, I just
     * use the custom field name, 'release_date'.
     *
     * When the column is clicked, the URL will look like this:
     * http://mywebsite.com/wp-admin/edit.php?post_type=movies&orderby=release_date&order=asc
     */
    $sortable_columns[ 'release_date_column' ] = 'release_date';

    // Let's also make the film rating column sortable
    $sortable_columns[ 'film_rating_column' ] = 'film_rating';

    return $sortable_columns;

}

/**
 * Now that we have a column, we need to fill our column with data.
 * The filters to populate your custom column are pretty similar to the ones
 * that added your column: 'manage_pages_custom_column', 'manage_posts_custom_column',
 * and 'manage_{$post_type_name}_posts_custom_column'. All three pass the same
 * 2 arguments: $column_name (a string) and the $post_id (an integer).
 *
 * Our custom column data is post meta so it will be a pretty simple case of retrieving
 * the post meta with the meta key 'release_date'.
 *
 * Note that we are wrapping our post meta in a div with an id of Òrelease_date-Ó plus the post id.
 * This will come in handy when we are populating our ÒQuick EditÓ row.
 */
add_action( 'manage_posts_custom_column', 'manage_wp_posts_be_qe_manage_posts_custom_column', 10, 2 );
function manage_wp_posts_be_qe_manage_posts_custom_column( $column_name, $post_id ) {

    switch( $column_name ) {

        case 'release_date_column':

            echo '<div id="release_date-' . $post_id . '">' . get_post_meta( $post_id, 'release_date', true ) . '</div>';
            break;

        case 'coming_soon_column':

            echo '<div id="coming_soon-' . $post_id . '">' . get_post_meta( $post_id, 'coming_soon', true ) . '</div>';
            break;

        case 'film_rating_column':

            echo '<div id="film_rating-' . $post_id . '">' . get_post_meta( $post_id, 'film_rating', true ) . '</div>';
            break;

    }

}

/**
 * Just because we've made the column sortable doesn't
 * mean the posts will sort by our column data. That's where
 * this next 2 filters come into play.
 * 
 * If your sort data is simple, i.e. alphabetically or numerically,
 * then 'pre_get_posts' is the filter to use. This filter lets you
 * change up the query before it's run.
 *
 * If your orderby data is more complicated, like our release date
 * which is a date string stored in a custom field, then check out
 * the 'posts_clauses' filter example used below.
 *
 * In the example below, when the main query is trying to order by
 * the 'film_rating', it's a simple alphabetical sorting by a custom
 * field so we're telling the query to set our 'meta_key' which is
 * 'film_rating' and that we want to order by the query by the
 * custom field's meta_value, e.g. PG, PG-13, R, etc.
 *
 * Check out http://codex.wordpress.org/Class_Reference/WP_Query
 * for more info on WP Query parameters.
 */
add_action( 'pre_get_posts', 'manage_wp_posts_be_qe_pre_get_posts', 1 );
function manage_wp_posts_be_qe_pre_get_posts( $query ) {

    /**
     * We only want our code to run in the main WP query
     * AND if an orderby query variable is designated.
     */
    if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {

        switch( $orderby ) {

            // If we're ordering by 'film_rating'
            case 'film_rating':

                // set our query's meta_key, which is used for custom fields
                $query->set( 'meta_key', 'film_rating' );

                /**
                 * Tell the query to order by our custom field/meta_key's
                 * value, in this case: PG, PG-13, R, etc.
                 *
                 * If your meta value are numbers, change
                 * 'meta_value' to 'meta_value_num'.
                 */
                $query->set( 'orderby', 'meta_value' );

                break;

        }

    }

}

/**
 * Just because we've made the column sortable doesn't
 * mean the posts will sort by our column data. That's where
 * the filter above, 'pre_get_posts', and the filter below,
 * 'posts_clauses', come into play.
 *
 * If your sort data is simple, i.e. alphabetically or numerically,
 * then check out the 'pre_get_posts' filter used above.
 *
 * If your orderby data is more complicated, like combining
 * several values or a date string stored in a custom field,
 * then the 'posts_clauses' filter used below is for you.
 * The 'posts_clauses' filter allows you to manually tweak
 * the query clauses in order to sort the posts by your
 * custom column data.
 *
 * The reason more complicated sorts will not with the
 * "out of the box" WP Query is because the WP Query orderby
 * parameter will only order alphabetically and numerically.
 *
 * Usually I would recommend simply using the 'pre_get_posts'
 * and altering the WP Query itself but because our custom
 * field is a date, we have to manually set the query to
 * order our posts by a date.
 */
add_filter( 'posts_clauses', 'manage_wp_posts_be_qe_posts_clauses', 1, 2 );
function manage_wp_posts_be_qe_posts_clauses( $pieces, $query ) {
    global $wpdb;

    /**
     * We only want our code to run in the main WP query
     * AND if an orderby query variable is designated.
     */
    if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {

        // Get the order query variable - ASC or DESC
        $order = strtoupper( $query->get( 'order' ) );

        // Make sure the order setting qualifies. If not, set default as ASC
        if ( ! in_array( $order, array( 'ASC', 'DESC' ) ) )
            $order = 'ASC';

        switch( $orderby ) {

            // If we're ordering by release_date
            case 'release_date':

                /**
                 * We have to join the postmeta table to include
                 * our release date in the query.
                 */
                $pieces[ 'join' ] .= " LEFT JOIN $wpdb->postmeta wp_rd ON wp_rd.post_id = {$wpdb->posts}.ID AND wp_rd.meta_key = 'release_date'";

                // Then tell the query to order by our date
                $pieces[ 'orderby' ] = "STR_TO_DATE( wp_rd.meta_value,'%m/%d/%Y' ) $order, " . $pieces[ 'orderby' ];

                break;

        }

    }

    return $pieces;

}

/**
 * Now that you have your custom column, it's bulk/quick edit showtime!
 * The filters are 'bulk_edit_custom_box' and 'quick_edit_custom_box'. Both filters
 * pass the same 2 arguments: the $column_name (a string) and the $post_type (a string).
 *
 * Your data's form fields will obviously vary so customize at will. For this example,
 * we're using an input. Also take note of the css classes on the <fieldset> and <div>.
 * There are a few other options like 'inline-edit-col-left' and 'inline-edit-col-center'
 * for the fieldset and 'inline-edit-col' for the div. I recommend studying the WordPress
 * bulk and quick edit HTML to see the best way to layout your custom fields.
 */
add_action( 'bulk_edit_custom_box', 'manage_wp_posts_be_qe_bulk_quick_edit_custom_box', 10, 2 );
add_action( 'quick_edit_custom_box', 'manage_wp_posts_be_qe_bulk_quick_edit_custom_box', 10, 2 );
function manage_wp_posts_be_qe_bulk_quick_edit_custom_box( $column_name, $post_type ) {

    switch ( $post_type ) {

        case 'movies':

            switch( $column_name ) {

                case 'release_date_column':
                    ?><fieldset class="inline-edit-col-left">
                        <div class="inline-edit-col">
                            <label>
                                <span class="title">Release Date</span>
                                <span class="input-text-wrap">
                                    <input type="text" value="" name="release_date">
                                </span>
                            </label>
                        </div>
                    </fieldset><?php
                    break;

                case 'coming_soon_column':

                    ?><fieldset class="inline-edit-col-left">
                        <div class="inline-edit-col">
                            <label>
                                <span class="title">Coming Soon</span>
                                <span class="input-text-wrap">
                                    <label style="display:inline;">
                                        <input type="radio" name="coming_soon" value="Yes" /> Yes
                                    </label>&nbsp;&nbsp;
                                    <label style="display:inline;">
                                        <input type="radio" name="coming_soon" value="No" /> No
                                    </label>
                                </span>
                            </label>
                        </div>
                    </fieldset><?php
                    break;

                case 'film_rating_column':

                    ?><fieldset class="inline-edit-col-left">
                        <div class="inline-edit-col">
                            <label>
                                <span class="title">Film rating</span>
                                <span class="input-text-wrap">
                                    <select name="film_rating">
                                        <option value="">Rating</option>
                                        <option value="G">G</option>
                                        <option value="PG">PG</option>
                                        <option value="PG-13">PG-13</option>
                                        <option value="R">R</option>
                                        <option value="NC-17">NC-17</option>
                                        <option value="X">X</option>
                                        <option value="GP">GP</option>
                                        <option value="M">M</option>
                                        <option value="M/PG">M/PG</option>
                                    </select>
                                </span>
                            </label>
                        </div>
                    </fieldset><?php
                    break;

            }

            break;

    }

}

/**
 * When you click 'Quick Edit', you may have noticed that your form fields are not populated.
 * WordPress adds one 'Quick Edit' row which moves around for each post so the information cannot
 * be pre-populated. It has to be populated with JavaScript on a per-post 'click Quick Edit' basis.
 *
 * WordPress has an inline edit post function that populates all of their default quick edit fields
 * so we want to hook into this function, in a sense, to make sure our JavaScript code is run when
 * needed. We will 'copy' the WP function, 'overwrite' the WP function so we're hooked in, 'call'
 * the original WP function (via our copy) so WordPress is not left hanging, and then run our code.
 *
 * Remember where we wrapped our column data in a <div> in Step 2? This is where it comes in handy,
 * allowing our Javascript to retrieve the data by the <div>'s element ID to populate our form field.
 * There are other methods to retrieve your data that involve AJAX but this route is the simplest.
 *
 * Don't forget to enqueue your script and make sure it's dependent on WordPress's 'inline-edit-post' file.
 * Since we'll be using the jQuery library, we need to make sure 'jquery' is loaded as well.
 *
 * I have provided several scenarios for where you've placed this code. Simply uncomment the scenario
 * you're using. For all scenarios, make sure your javascript file is in the same folder as your code.
 */
add_action( 'admin_print_scripts-edit.php', 'manage_wp_posts_be_qe_enqueue_admin_scripts' );
function manage_wp_posts_be_qe_enqueue_admin_scripts() {

    // if code is in theme functions.php file
    //wp_enqueue_script( 'manage-wp-posts-using-bulk-quick-edit', trailingslashit( get_bloginfo( 'stylesheet_directory' ) ) . 'bulk_quick_edit.js', array( 'jquery', 'inline-edit-post' ), '', true );

    // if using code as plugin
    wp_enqueue_script( 'manage-wp-posts-using-bulk-quick-edit', trailingslashit( plugin_dir_url( __FILE__ ) ) . 'bulk_quick_edit.js', array( 'jquery', 'inline-edit-post' ), '', true );

}

/**
 * Saving your 'Quick Edit' data is exactly like saving custom data
 * when editing a post, using the 'save_post' hook. With that said,
 * you may have already set this up. If you're not sure, and your
 * 'Quick Edit' data is not saving, odds are you need to hook into
 * the 'save_post' action.
 *
 * The 'save_post' action passes 2 arguments: the $post_id (an integer)
 * and the $post information (an object).
 */
add_action( 'save_post', 'manage_wp_posts_be_qe_save_post', 10, 2 );
function manage_wp_posts_be_qe_save_post( $post_id, $post ) {

    // pointless if $_POST is empty (this happens on bulk edit)
    if ( empty( $_POST ) )
        return $post_id;

    // verify quick edit nonce
    if ( isset( $_POST[ '_inline_edit' ] ) && ! wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' ) )
        return $post_id;

    // don't save for autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // dont save for revisions
    if ( isset( $post->post_type ) && $post->post_type == 'revision' )
        return $post_id;

    switch( $post->post_type ) {

        case 'movies':

            /**
             * Because this action is run in several places, checking for the array key
             * keeps WordPress from editing data that wasn't in the form, i.e. if you had
             * this post meta on your "Quick Edit" but didn't have it on the "Edit Post" screen.
             */
            $custom_fields = array( 'release_date', 'coming_soon', 'film_rating' );

            foreach( $custom_fields as $field ) {

                if ( array_key_exists( $field, $_POST ) )
                    update_post_meta( $post_id, $field, $_POST[ $field ] );

            }

            break;

    }

}

/**
 * Saving the 'Bulk Edit' data is a little trickier because we have
 * to get JavaScript involved. WordPress saves their bulk edit data
 * via AJAX so, guess what, so do we.
 *
 * Your javascript will run an AJAX function to save your data.
 * This is the WordPress AJAX function that will handle and save your data.
 */
add_action( 'wp_ajax_manage_wp_posts_using_bulk_quick_save_bulk_edit', 'manage_wp_posts_using_bulk_quick_save_bulk_edit' );
function manage_wp_posts_using_bulk_quick_save_bulk_edit() {

    // we need the post IDs
    $post_ids = ( isset( $_POST[ 'post_ids' ] ) && !empty( $_POST[ 'post_ids' ] ) ) ? $_POST[ 'post_ids' ] : NULL;

    // if we have post IDs
    if ( ! empty( $post_ids ) && is_array( $post_ids ) ) {

        // get the custom fields
        $custom_fields = array( 'release_date', 'coming_soon', 'film_rating' );

        foreach( $custom_fields as $field ) {

            // if it has a value, doesn't update if empty on bulk
            if ( isset( $_POST[ $field ] ) && !empty( $_POST[ $field ] ) ) {

                // update for each post ID
                foreach( $post_ids as $post_id ) {
                    update_post_meta( $post_id, $field, $_POST[ $field ] );
                }

            }

        }

    }
}


// Register 'movies' cpt for this demo.
add_action( 'init', 'wpse237805_register_movies' );
function wpse237805_register_movies() {
    $labels = array(
        "name" => __( 'Movies', 'textdomain' ),
        "singular_name" => __( 'Movie', 'textdomain' ),
    );

    $args = array(
        "label" => __( 'Movies', 'textdomain' ),
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "show_in_rest" => false,
        "rest_base" => "",
        "has_archive" => false,
        "show_in_menu" => true,
                "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "movies", "with_front" => true ),
        "query_var" => true,

        "supports" => array( "title", "editor", "custom-fields" ),
    );

    register_post_type( "movies", $args );
}
This FFmeeting was hosted on ​​irc://irc.freenode.net/ffmpeg-meeting2016 on 2016-05-28, at 17 UTC.

**** BEGIN LOGGING AT Sat May 28 18:51:04 2016

May 28 18:51:04 *	Now talking on #ffmpeg-meeting2016
May 28 18:51:21 *	durandal_1707 (~durandal@m83-184-22-75.cust.tele2.hr) has joined #ffmpeg-meeting2016
May 28 18:51:34 *	jamrial (~jamrial@181.22.62.26) has joined #ffmpeg-meeting2016
May 28 18:51:49 *	durandal_170 gives channel operator status to durandal_1707
May 28 18:52:22 *	BBB (~rbultje@65.206.95.146) has joined #ffmpeg-meeting2016
May 28 18:52:48 *	mateo` (~mateo@static-5-51-29-67.ftth.abo.bbox.fr) has joined #ffmpeg-meeting2016
May 28 18:53:35 *	cehoyos (~cehoyos@80-110-89-243.cgn.dynamic.surfer.at) has joined #ffmpeg-meeting2016
May 28 18:53:36 *	ubitux (~ubitux@bre75-1-78-192-242-8.fbxo.proxad.net) has joined #ffmpeg-meeting2016
May 28 18:54:55 *	c_14 (~c_14@unaffiliated/c-14/x-8913907) has joined #ffmpeg-meeting2016
May 28 18:55:10 *	saste (~saste___@151.56.85.76) has joined #ffmpeg-meeting2016
May 28 18:57:41 *	kurosu_ (020d4d7f@gateway/web/freenode/ip.2.13.77.127) has joined #ffmpeg-meeting2016
May 28 18:58:06 *	iive (~iive@unaffiliated/iive) has joined #ffmpeg-meeting2016
May 28 18:59:53 *	nevcairiel (nev@WoWUIDev/WoWAce/Ace3/nevcairiel) has joined #ffmpeg-meeting2016
May 28 19:00:24 <durandal_170>	we will start at at 17:15 UTC
May 28 19:03:11 *	Timothy_Gu (~timothy_g@wikipedia/timothy-gu) has joined #ffmpeg-meeting2016
May 28 19:03:45 *	kurosu (020d4d7f@gateway/web/freenode/ip.2.13.77.127) has joined #ffmpeg-meeting2016
May 28 19:03:48 *	j-b (~jb@videolan/developer/j-b) has joined #ffmpeg-meeting2016
May 28 19:04:09 *	kurosu_ has quit ()
May 28 19:04:43 <durandal_170>	so lets start
May 28 19:04:46 <durandal_170>	first topic: Code of Conduct and policy around it
May 28 19:04:52 <BBB>	yes
May 28 19:05:29 <jamrial>	the "first version" was voted and commited, so that's done
May 28 19:06:01 <durandal_170>	michaelni commited first version, should it be extended and other stuff added to it?
May 28 19:06:09 <Timothy_Gu>	I still maintain that some solid repercussions should be specified in the CoC. The ML root idea is good, but it should be written as a reference for future.
May 28 19:06:27 <BBB>	the VLC one is useful for reference
May 28 19:06:56 <Timothy_Gu>	We don't have to go as solid as "this --> 1 day ban; that --> 2-day ban" but it should be clear what could happen
May 28 19:06:56 <jamrial>	atomnuker was against adding that, afaik
May 28 19:07:19 <jamrial>	i also think it should be added
May 28 19:07:32 <jamrial>	BBB where's vlc's?
May 28 19:07:54 <BBB>	https://wiki.videolan.org/Code_of_Conduct/
May 28 19:09:30 <Timothy_Gu>	This clause doesn't go against the assumption of good faith, as atomnuker seems to suggest. It's more for the clarity of the entire community, to show that our community is a mature one governed by a set of clear rules.
May 28 19:09:51 <kurosu>	I'm also for adding some - in spite of the issues that were raised
May 28 19:10:29 <durandal_170>	like one VLC have or more rigid?
May 28 19:11:27 <atomnuker>	I dislike the notion that very well defined rules and (especially ZERO TOLERANCE POLICIES) are needed to maintain order or say a community is "mature"
May 28 19:11:41 *	DSM_ (~textual@150.129.198.154) has joined #ffmpeg-meeting2016
May 28 19:12:10 <nevcairiel>	we would all be happy if its never invoked, but alas we're here because precedence exists that we need it
May 28 19:12:15 <atomnuker>	I think that defining some rules is okay, as long as they're not set in stone and are debateable
May 28 19:12:25 <iive>	nevcairiel: and what is that precedence?
May 28 19:12:29 <BBB>	atomnuker: “NB: Before applying any of those following disciplinary policies, the VideoLAN team will try to discuss the problem with the offender in order to solve it in a more peaceful way.”
May 28 19:12:39 <BBB>	atomnuker: from the VLC CoC “disciplinary actions"
May 28 19:12:49 <atomnuker>	yeah, that's okay
May 28 19:12:50 <kurosu>	VLC's, in my interpretation, is for issues caused by situations going out of control, so it looks fine
May 28 19:13:23 <BBB>	has anyone here read the book “animal farm”? it’s so appropriate in this situation :-p </side-note>
May 28 19:14:47 <durandal_170>	so should we vote for adding basic clear rules?
May 28 19:14:55 <jamrial>	vlc's seems a tad explicit, so lets not copy paste it
May 28 19:15:02 <BBB>	jamrial: agreed
May 28 19:15:08 <saste>	what's the process to approve the rules? we need to go through vote on MLs or here on IRC?
May 28 19:15:29 <jamrial>	i'd say ML since some people in the voting comitee are not here, i think
May 28 19:15:40 <BBB>	who will write the changes?
May 28 19:15:42 <kurosu>	I'd suggest ML as IRC could be considered not to reach a quorum (whatever the spelling)
May 28 19:16:03 <atomnuker>	yep, better to define them now and just put them on the ML
May 28 19:16:14 <iive>	I still would like explanation, why do we need that
May 28 19:17:06 <durandal_170>	without it there are no consequences to bad habits
May 28 19:17:57 <iive>	like?
May 28 19:17:59 <jamrial>	iive: we now have a CoC, so there needs to be a list of what happens if you don't follow it
May 28 19:18:48 <BBB>	so action points: who will write the changes to the CoC for disciplinary actions on CoC violations?
May 28 19:20:07 <durandal_170>	I can
May 28 19:20:25 <durandal_170>	ok, so lets add something like: first warning then temporal ban then perma ban?
May 28 19:20:27 <iive>	I think that most of you do not understand what CoC is for. atomnuker had explained it quite well.
May 28 19:20:37 <iive>	but i do suspect that you do not care.
May 28 19:20:45 *	kurosu_ (020d4d7f@gateway/web/freenode/ip.2.13.77.127) has joined #ffmpeg-meeting2016
May 28 19:20:55 <iive>	You do not want CoC, you just want laws and enforcement.
May 28 19:21:22 <BBB>	iive: “NB: Before applying any of those following disciplinary policies, the VideoLAN team will try to discuss the problem with the offender in order to solve it in a more peaceful way.”
May 28 19:21:28 <BBB>	iive: from the videolan CoC page
May 28 19:22:49 <iive>	BBB: 1. You are proposing to literally replace the current CoC with VideoLans. 2. Why don't we do that now, instead of complicating our lifes with none-sense?
May 28 19:23:00 <Timothy_Gu>	1. No.
May 28 19:23:07 *	Compn (notabot@97-71-16-25.res.bhn.net) has joined #ffmpeg-meeting2016
May 28 19:23:16 <Timothy_Gu>	2. In case you didn't notice, atomnuker approved this clause.
May 28 19:24:08 <saste>	about the consequences can you (durandal?) be more specific? I think it was about banning from the ML for some time
May 28 19:24:31 <saste>	having some simple rules should be better than nothing (as it happens now)
May 28 19:24:44 <durandal_170>	first warning, then 7 days ban than permanent ban
May 28 19:25:14 <saste>	and it will be operated by the ML admins?
May 28 19:25:44 <atomnuker>	what about time(x) = 4^(times_warned)?
May 28 19:25:59 <jamrial>	mind, seven day ban should not be for silly stuff like top posting unless the requests are constantly ignored
May 28 19:26:14 *	iive facepalms
May 28 19:26:16 <durandal_170>	it is hard to enforce it on internet for real, but yes it would be ban on IRC and ML
May 28 19:26:26 <Timothy_Gu>	Git push access?
May 28 19:26:32 <durandal_170>	and no its not about top-posting or bottom-posting
May 28 19:26:53 <durandal_170>	Timothy_Gu: yes
May 28 19:27:02 <kurosu_>	Yes 3 strikes for a permanent ban seems heavy handed depending on the topic
May 28 19:27:14 <atomnuker>	yeah, I think the time should be a function of time, not pernament
May 28 19:27:24 <jamrial>	three strikes sounds extreme
May 28 19:27:40 <atomnuker>	64 days for 3 offences seems fine with 4^times_warned
May 28 19:27:46 <Timothy_Gu>	I'd be happy with "If the Contributor repeatedly, intentionally, and severly violates this Code of Conduct, possible repercussions include ..."
May 28 19:28:04 <durandal_170>	agree
May 28 19:28:06 <Timothy_Gu>	I don't want to get too formulaic about such things.
May 28 19:28:14 <atomnuker>	yeah, that too
May 28 19:29:06 <durandal_170>	so lets add that to current CoC and put it for vote on ML?
May 28 19:29:12 <atomnuker>	"possible reprocussions include temporary or pernament ban on ML/IRC"
May 28 19:29:40 <jamrial>	durandal_1707: send a draft first and get comments to improve it
May 28 19:30:09 <durandal_170>	will do, if noone beats me
May 28 19:30:26 <kurosu_>	Yeah this would be more appropriate else time will run short for this meeting
May 28 19:31:08 <durandal_170>	ok, next topic?
May 28 19:31:32 <Timothy_Gu>	"technical development issues"
May 28 19:31:51 <Timothy_Gu>	so AVClass et al.
May 28 19:32:27 <durandal_170>	isn't this topic about recent git server outage?
May 28 19:32:58 <jamrial>	since cehoyos is here, we could maybe talk about his behavior and why the CoC and repercussions for violating it was introduced to begin with
May 28 19:33:39 <durandal_170>	i have nothing new to add, everything have already been said on ML
May 28 19:34:05 <jamrial>	where?
May 28 19:34:28 <iive>	nothing's been said on ML
May 28 19:34:35 <iive>	nobody wants to start flamewar
May 28 19:35:11 <durandal_170>	i can talk about that later, now should we vote for AVClass thing or?
May 28 19:35:26 <atomnuker>	on that topic, there's a good reason why we have stable releases and a git master - git master can be broken at any point and then be fixed so that we don't break the stable version
May 28 19:35:41 <BBB>	is this about michaelni’s idea of adding an AVClass to AVCodecParameters?
May 28 19:35:47 <jamrial>	durandal_1707: some context about the avclass issue first would be good
May 28 19:36:35 <durandal_170>	i'm not really into it, michaelni could better describe it why (if) it's needed
May 28 19:37:10 <durandal_170>	iirc its about exporting codec info from lavf, right?
May 28 19:38:00 <michaelni>	AVClass & AVOption should be added to all public "Context" structs for API consistency and to make it easier for apps to support multiple ffmpeg versios and distros 
May 28 19:38:08 <michaelni>	that is IMHO
May 28 19:38:17 <durandal_170>	basically few devs are against it iirc
May 28 19:38:47 <michaelni>	nevcairiel, seemed to be unhappy about adding it to AVCodecParameters
May 28 19:39:38 <durandal_170>	I would prefer it there is better solution
May 28 19:41:21 <kurosu_>	Side note: the name is confusing because I would have assumed from the name it was ok
May 28 19:41:39 <nevcairiel>	I see it as a necessity for contexts that have private options in internal data somewhere, not as a really good API for generic access, which loses strict typing that structs give you, you can't typo a struct member name because the compiler yells at you .. you can in avoption, etc.
May 28 19:41:42 <kurosu_>	(to put such an information there)
May 28 19:42:04 <michaelni>	maybe the problems AVOptions have can be fixed
May 28 19:43:06 <Timothy_Gu>	Are members of AVCodecParameters supposed to be changeable by a consumer?
May 28 19:43:13 <Timothy_Gu>	consumer = user app
May 28 19:43:32 <michaelni>	a user app using only libavcodec or only libavformat has to change them
May 28 19:43:42 <nevcairiel>	if you just use lavf and lavc, there is no reason to change them really, but you could fill it manually if you use another demuxer
May 28 19:44:01 <nevcairiel>	or another mxuer for
May 28 19:44:33 <nevcairiel>	but you dont need AVOptions to fill the struct
May 28 19:44:45 <nevcairiel>	for me, the downsides outweigh the potential benefits, thats all
May 28 19:45:56 <Timothy_Gu>	Do we care about ABI with Libav? No, right?
May 28 19:46:03 <BBB>	no
May 28 19:46:06 *	kurosu has quit (Ping timeout: 250 seconds)
May 28 19:46:06 <nevcairiel>	we got rid of that last meeting
May 28 19:46:55 <michaelni>	what downsides does having support for AVClass/AVOption have ? its completely optional, a user app can just directly access the struct, it just will have to update more often and if it wants tp support stable distros it would need alot of #if which with AVOptions should be alot cleaner
May 28 19:48:25 <michaelni>	for example if we change sample_rate to a AVRational. With AVOptions an app can use the same code to set sample rate from an AVRational for new and old code
May 28 19:48:42 <michaelni>	without AVOption a #if VERSION.. is needed
May 28 19:48:58 <iive>	so, basically avclass would allow to use options, instead of get/set_ functions?
May 28 19:49:14 <nevcairiel>	I would absolutely  favor the explicit #if myself, that way I know wtf is going on :)
May 28 19:49:45 <michaelni>	me too until there are 20 such #ifs then i dont know anything anymore
May 28 19:50:21 <michaelni>	AVOption gives an app this choice it doesnt need to be used
May 28 19:50:31 *	kurosu (020d4d7f@gateway/web/freenode/ip.2.13.77.127) has joined #ffmpeg-meeting2016
May 28 19:51:27 <michaelni>	about type checking named constants could be added like #define SAMPLE_RATE_KEY "sample_rate"
May 28 19:51:34 <BBB>	so … we’re currently just rehashing the ML discussion
May 28 19:51:37 <BBB>	this isn’t reall helping
May 28 19:51:50 <BBB>	there’s disagreement, that much is clear
May 28 19:52:01 <jamrial>	iive: afaik get/set were added because of libav's abi compatability, since new fields added by us would not have a known offset
May 28 19:52:52 <iive>	jamrial: yes, but same thing applies if we want to add or remove a member.
May 28 19:53:37 <Timothy_Gu>	So is this debate between AVClass/AVOptions vs. explicit getters and setters?
May 28 19:53:45 <BBB>	no
May 28 19:53:47 <nevcairiel>	no, dont let iive derail it
May 28 19:53:49 <saste>	also, with AVOption there's the possibility to some (very limited) introspection, like listing options and exporting them to a GUI/UI
May 28 19:54:13 <michaelni>	saste, yes, also theres max/min and defaults
May 28 19:54:36 <BBB>	my issue with avoption is that the introspection isn’t very useful, because you just list all options even though only a very small subset are useful or even set per use case
May 28 19:54:53 <Timothy_Gu>	Plus, AVCodecParameters isn't really intended to be such a end user-accessible structure though.
May 28 19:54:57 <BBB>	imagine AVCodecContext’s introspection - priv options made it a little better, but it’s still criminal
May 28 19:55:18 <kurosu_>	Agreed with BBB: if a technical agreement can't be reached here or the ml, a way forward must be found 
May 28 19:55:24 <michaelni>	BBB this is a implementation problem, we could do codec specific AVOption lists
May 28 19:55:46 <kurosu_>	No point in an infinite loop only broke by who gets fed up first
May 28 19:55:51 <nevcairiel>	introspection and options m ight be useful on the actual AVCodecContext, especially with private codec options, but that argument falls off quickly as you get to the other structs
May 28 19:55:58 <BBB>	kurosu_: so true :)
May 28 19:56:29 <michaelni>	kurosu_, yes we need to know AVOption/AVClass in AVCodecParameters yes or no for the release
May 28 19:56:29 <BBB>	so, I don’t think we have consensus that AVClass should be added to AVCodecParameters at this point. so how are we going to continue this discussion?
May 28 19:56:50 *	DSM_ has quit (Read error: Connection reset by peer)
May 28 19:58:12 <durandal_170>	hmm, I'm out of ideas.
May 28 19:58:26 *	baptiste (~baptiste@fate.ffmpeg.org) has joined #ffmpeg-meeting2016
May 28 19:58:38 <baptiste>	heya
May 28 19:59:06 <durandal_170>	hi
May 28 19:59:08 <kurosu_>	I'm ok of if there's a vote, possibly restricted to people with commits in affected parts of the code in the last x units of time
May 28 19:59:13 <nevcairiel>	if everyone else is in favor of adding it there, then just do so, its not like it actively hurts me or my interests, but I just don't like the concept
May 28 19:59:32 <ubitux>	well the question asking if there is a downside to adding it hasn't been answered (unless i missed it); if we add it, does it promote bad usage? does it cause a maintainance burden? 
May 28 19:59:44 <atomnuker>	is there even anyone who agrees with michaelni to add AVClass?
May 28 19:59:50 *	jamrial_ (~jamrial@181.22.62.26) has joined #ffmpeg-meeting2016
May 28 20:00:01 <atomnuker>	most of the people on the ML disagreed
May 28 20:00:03 <nevcairiel>	if you want it to be complete, you need to maintain the struct twice, once in the header, and once in its AVOption declaration
May 28 20:00:16 <nevcairiel>	so there is a bit of maintenance
May 28 20:00:28 <michaelni>	iam happy to maintain the extra code
May 28 20:00:35 <jamrial_>	offtopic, but fuck win10 wireless
May 28 20:00:39 <durandal_170>	we could drop header support ;)
May 28 20:00:58 <iive>	i thought that's the end goal.
May 28 20:01:27 <nevcairiel>	if it is, i'm outta here =p
May 28 20:02:03 *	jamrial has quit (Ping timeout: 260 seconds)
May 28 20:02:10 <durandal_170>	ok, we can put this on vote for ML if michaelni really wants this
May 28 20:02:15 <nevcairiel>	making AVOptions the only way to access things was never the goal, and if anyone should ever want to bring that up, we would have quite the discussion =p
May 28 20:02:16 *	jamrial_ is now known as jamrial
May 28 20:02:45 <ubitux>	what about serializations of parameters and such? 
May 28 20:03:05 <michaelni>	nevcairiel, iam a C and asm guy really, i wont come up with such idea ...
May 28 20:03:28 <michaelni>	ubitux, yes, that too is a potential usecase
May 28 20:03:30 <nevcairiel>	didnt think you would
May 28 20:03:34 <ubitux>	i guess this enters again in the scope of api users not supposed to though (i feel like it could help wrt ffserver but i'm going to get killed)
May 28 20:03:44 <nevcairiel>	the danger is real
May 28 20:04:21 <ubitux>	but otoh adding the AVClass (without avoptions yet) before the release sounds like a safe bet
May 28 20:04:31 <jamrial>	let ffserver die after avstream->avctx is gone
May 28 20:04:32 <ubitux>	like, we could postpone such discussion
May 28 20:04:36 <Timothy_Gu>	We should rewrite FFmpeg in JavaScript. Built-in introspection.
May 28 20:04:51 <nevcairiel>	if the AVClass exists you might as well add the options, otherwise its just useless
May 28 20:05:20 <ubitux>	i'm with michaelni on the risky aspect of not having that pointer before the release, but i don't know yet if it will be helpful in the future
May 28 20:05:34 <ubitux>	nevcairiel: it's useless but it prevents the abi break later
May 28 20:05:56 <nevcairiel>	well we should just decide now then instead of going with a schrödingers avclass :)
May 28 20:06:01 <jamrial>	wm4 was trying to get libav to first implement the updated parser stuff before making a release. do we care?
May 28 20:06:03 <ubitux>	(of adding it if we decide to use avoption or any related "technology")
May 28 20:06:30 <nevcairiel>	jamrial: they decided not to though, so not sure what there is to care
May 28 20:06:39 <kurosu_>	I think only 2 persons called for a vote to settle this, so besides disagreeing with the concept of vote on this, does this mean I ot enough info is available to make an educated vote?te
May 28 20:06:40 <jamrial>	ah, i see
May 28 20:07:07 <kurosu_>	(sorry on phone :( )
May 28 20:07:11 <nevcairiel>	well apparently noone else really has any opinions on the matter
May 28 20:07:35 <kurosu_>	I consider I don't get to vote on that topic
May 28 20:07:35 <BBB>	I’m not convinced we need AVOptions at this point
May 28 20:07:44 <BBB>	if we don’t need AVOptions, I don’t think we need AVClass
May 28 20:07:52 <BBB>	(in AVCodecParameters)
May 28 20:08:15 <durandal_170>	yea, it opens cans of worms
May 28 20:08:17 <jamrial>	we also don't need log context in AVCodecParameters
May 28 20:08:18 <nevcairiel>	fwiw, i don't think its one of the structs that will change dramatically and all the time
May 28 20:08:28 <BBB>	avcodecParameters logging is useless
May 28 20:08:39 <BBB>	since the class is not codec-specific
May 28 20:08:45 <BBB>	so it would just log [parameters] bla bla
May 28 20:08:49 <BBB>	instead of [h264] bla bla
May 28 20:08:51 <BBB>	or [mov] bla bla
May 28 20:08:54 <nevcairiel>	and yes, everytime AVCodecParameters is handled you generally have some parent context it belongs to
May 28 20:08:58 <nevcairiel>	be it a  muxer or demuxer
May 28 20:09:00 <nevcairiel>	or something
May 28 20:09:06 <BBB>	so we should actively discourage using AVCodecParameters being used as the class for logging
May 28 20:09:16 <nevcairiel>	if you would try, it would likely crash
May 28 20:09:18 <ubitux>	BBB: i think logging has a mechanism to print the tree?
May 28 20:09:31 <ubitux>	sth like [h264 @ ...] [parameters @ ...] bla
May 28 20:09:37 <nevcairiel>	never seen that
May 28 20:09:49 <BBB>	I’ve never seen that either :-p certainly news to me
May 28 20:09:53 <ubitux>	i remember sth like that with swr but maybe i'm confused
May 28 20:09:53 <michaelni>	ubitux, yes it can print the parent too
May 28 20:09:54 <BBB>	(that’s not to say you’re not right)
May 28 20:11:02 <durandal_170>	ok, can we get back to this later?
May 28 20:11:16 <nevcairiel>	in any case, i don't really care that much if it gets in or not, my opinion is that its not really useful or needed
May 28 20:12:09 <jamrial>	on the ml if possible. a thread stating the potential benefits, drawbacks, concerns about misuse/confusion, etc, for discussion. then a vote in that same thread
May 28 20:14:09 <durandal_170>	sounds good to me
May 28 20:14:46 *	DSM_ (~textual@203.134.198.46) has joined #ffmpeg-meeting2016
May 28 20:14:46 <kurosu>	btw, is a vote a codified way to move forward in the face of such a polarizing issue (or more)?
May 28 20:14:46 <michaelni>	if a vote is done it should be started by someone else than me & nevcairiel probabl, not sure if  a vote makes sense for technical issue it would give a yes vs no result though 
May 28 20:15:15 <michaelni>	and either yes or no is better than no result
May 28 20:16:04 <BBB>	anyone remotely interested in managing the vote probably has some stake in it either way
May 28 20:16:11 <BBB>	I think it’s fine for you to set up the vote
May 28 20:16:21 <BBB>	(since you want it so you have incentive to do effort for it)
May 28 20:17:32 <michaelni>	I dont understand the drawbacks and concerns about misuse/confusion so iam not able to write a neutral mail
May 28 20:18:26 <durandal_170>	then setup wiki and write drawbacks/etc there?
May 28 20:18:44 <jamrial>	lets not make things complicated
May 28 20:20:31 <jamrial>	may i suggest another technical topic?
May 28 20:20:39 <durandal_170>	yes
May 28 20:21:19 <jamrial>	liabvutil is currently the only non modular library. literally everything is compiled and installed no matter your configure options
May 28 20:21:33 <BBB>	I’ve complained about that 10000x
May 28 20:21:42 <jamrial>	yes, that's why i bring it up :p
May 28 20:21:42 <BBB>	but I think it lacks somebody actually fixing it :)
May 28 20:21:53 <nevcairiel>	i dont think thats necessarily a bad thing
May 28 20:22:09 <nevcairiel>	the modules in avcodec etc dont directly impact public api, they just disable some encoder or something
May 28 20:22:18 <jamrial>	i could give it a try if i have the time, but i want to know how to handle it
May 28 20:22:18 <nevcairiel>	but in avutil the modules practically map to public API functions
May 28 20:22:22 <jamrial>	nevcairiel: that's the thing
May 28 20:22:24 <nevcairiel>	which should still exist even if disabled
May 28 20:22:37 <jamrial>	what would be best? instlal all headers and return NULL/ENOSYS, or not install them?
May 28 20:22:43 <jamrial>	for the disabled modules, that is
May 28 20:22:53 <BBB>	I would just not install them
May 28 20:23:00 <BBB>	the use I have for it is in static libs
May 28 20:23:01 <nevcairiel>	well even if not installed, the ABI should be the same, imho
May 28 20:23:04 <BBB>	so I don’t care for placeholders
May 28 20:24:21 <jamrial>	well, opencl and lzo are headers that only get installed if those components are enabled
May 28 20:24:39 <jamrial>	so there's a precedent of sorts
May 28 20:25:39 <BBB>	I think it’s new territory
May 28 20:25:53 <BBB>	so there’s a reasonable defense for either strategy
May 28 20:26:06 <iive>	what would you like to disable from libavutil?
May 28 20:26:17 <nevcairiel>	shouldnt a decent linker get rid of your unused stuff in static libs anyway?
May 28 20:26:21 <ubitux>	if we end up moving various dsp utils inside lavu (because it needs to be shared between codecs and filters), it makes perfect sense to make lavu modular
May 28 20:26:27 <jamrial>	but at the same time, ubitux's pixelutils gets installed and just returns NULL if it's not enabled
May 28 20:26:42 <ubitux>	yeah, this was a first attempt at it
May 28 20:26:52 <jamrial>	iive: all the crypto stuff and such, for example
May 28 20:26:53 <ubitux>	but pretty annoying to do tbh
May 28 20:27:19 <jamrial>	you may only need md5, crc and aes, but not sha or camelia
May 28 20:28:06 <ubitux>	does anyone mind moving to infrastructure issues after that?
May 28 20:28:27 <ubitux>	i'm not sure i can stay for very long and i'm slightly concerned about that issue
May 28 20:28:35 <jamrial>	as a topic? sure
May 28 20:28:41 <ubitux>	yes
May 28 20:28:44 *	Illya (sid133335@gateway/web/irccloud.com/x-rfijfsjjprqfpkvu) has joined #ffmpeg-meeting2016
May 28 20:29:06 <Illya>	Is this only for contributors or can I sit in and listen? 
May 28 20:29:46 <jamrial>	you're welcome to listen and participate
May 28 20:29:55 <durandal_170>	ubitux: so what you want to ask?
May 28 20:30:01 <BBB>	infrastructure, let’s go
May 28 20:30:19 <ubitux>	alright well
May 28 20:30:24 <ubitux>	first there is the dedicated server
May 28 20:30:32 <ubitux>	which i ordered a while ago as a "quick solution"
May 28 20:31:03 *	rcombs (rcombs@irc.rcombs.me) has joined #ffmpeg-meeting2016
May 28 20:31:06 <ubitux>	it's not like i do really mind the money aspect, but there was many offers
May 28 20:31:19 <kurosu_>	Err what's the result on the previous topic? Send patches and it'll get reviewed but the end goal is ok? (I don't mind)
May 28 20:31:23 <ubitux>	and i'm still handling the server
May 28 20:31:45 <durandal_170>	ubitux: i thought that server is no longer used...
May 28 20:31:47 <BBB>	kurosu_: sounds like it yes
May 28 20:31:52 <ubitux>	durandal_170: ah?
May 28 20:31:57 <iive>	kurosu_: i think nobody objected. Try to make some example patches and we might find issues then :)
May 28 20:32:10 <ubitux>	so we don't use ffbox0 anymore?
May 28 20:32:15 <kurosu_>	Ok just wanted to make the result of the meeting on that topic clear
May 28 20:32:37 <durandal_170>	ubitux: i dunno, I never touched those stuff
May 28 20:32:54 <ubitux>	that's the other issue; we don't really have someone to handle the sysadmin stuff
May 28 20:33:01 <jamrial>	i think michaelni handled the server migration last time
May 28 20:33:14 <ubitux>	does anyone have a sysadmin in his relationships that would be interested in that?
May 28 20:33:15 <michaelni>	"<ubitux> it's not like i do really mind the money aspect, but there was many offers" <-- everyone disappeared except the one from bulgaria
May 28 20:33:28 <jamrial>	ubitux: wasn't it llogan?
May 28 20:34:09 <michaelni>	we have a virtual box in bulgaria that ffbox0 could be moved to if teres a volunteer
May 28 20:34:14 <ubitux>	well, i saw michael handling mailing issue recently, and we have regularly unsolved issue wrt the infrastructure
May 28 20:34:42 <michaelni>	trac is currently on a virtual box there too
May 28 20:35:00 <jamrial>	kierank offered a server as well i remember
May 28 20:35:02 <ubitux>	like, i still receive many unwanted dvdnav moderation mails, and no one seems to know how to stop them
May 28 20:35:22 <iive>	jamrial: trac was on kierank's server, until it died.
May 28 20:35:30 <ubitux>	i feel like michael has to handle all the dirty stuff everytime there is a problem
May 28 20:35:32 <iive>	the server
May 28 20:35:35 *	Shiz (~shiz@hydrogenium.shiz.me) has joined #ffmpeg-meeting2016
May 28 20:35:36 <ubitux>	or even when we have to upload a sample etc
May 28 20:35:58 <ubitux>	i feel like we really need someone to officially handle the sysadmin stuff
May 28 20:36:07 <michaelni>	jamrial, kieranks server is now limited to 5mbit/sec
May 28 20:36:15 <ubitux>	so if anyone knows someone to help with that i think that would be a good idea
May 28 20:36:15 *	kierank (sid5955@gateway/web/irccloud.com/x-chhjwqpzyyehmyvm) has joined #ffmpeg-meeting2016
May 28 20:36:50 <BBB>	speaking of the devil :D
May 28 20:37:41 <michaelni>	it would be nice to have some help with sysadmin stuff
May 28 20:37:48 <durandal_170>	i'm really not into such stuff, so I can't do that
May 28 20:38:15 <BBB>	maybe lou is interested in that kind of stuff?
May 28 20:38:43 <durandal_170>	the only experience I have is some GUI web setup of mail server and http server and database ...
May 28 20:39:05 <BBB>	you shouldn’t feel obliged to do stuff you don’t want to do ;)
May 28 20:39:17 <michaelni>	about uploading samples anyone who needs/wants access to that its easy to give
May 28 20:39:22 *	DSM_ has quit (Max SendQ exceeded)
May 28 20:39:43 <jamrial>	michaelni: at least regarding samples write access could be given to people that often makes new tests
May 28 20:40:21 <jamrial>	or maybe to anyone that can git push
May 28 20:40:38 <iive>	can we hear what services are running on what server atm?
May 28 20:40:41 <durandal_170>	michaelni: iirc you gave me access but I don't remember what password was
May 28 20:40:43 <michaelni>	i need to setup account on the box so "anyone that can git push" is a bit hard
May 28 20:40:50 <jamrial>	ah ok
May 28 20:41:49 <ubitux>	pretty sure no one in the community is available for sysadmin stuff, we probably need someone who isn't a developer but more a sysadmin
May 28 20:42:00 <ubitux>	and i think they're not that rare
May 28 20:42:01 <michaelni>	having someone with mail / postfix experience and more free time than tim would be usefull
May 28 20:42:21 <ubitux>	we can probably ask around our close relationships
May 28 20:42:35 <michaelni>	that would be a good idea i think
May 28 20:42:36 <ubitux>	i mean, we need someone to trust
May 28 20:42:41 <michaelni>	yes
May 28 20:43:26 <ubitux>	so if you're working in a company and knows well a bored sysadmin who like opensource
May 28 20:43:31 <ubitux>	maybe hint him?
May 28 20:43:35 <BBB>	don’t we have various people in the project that don’t code?
May 28 20:43:47 <ubitux>	ppl that don't code seems as busy as us
May 28 20:43:56 <BBB>	iive doesn’t seem busy
May 28 20:43:58 <ubitux>	and don't seem to particularly have sysadmin stuff
May 28 20:44:04 <ubitux>	skills*
May 28 20:44:23 <ubitux>	we called many times for sysadmin support
May 28 20:44:31 <BBB>	iive: can you sysadmin?
May 28 20:44:32 <ubitux>	i think we need to look a bit outside this community
May 28 20:45:11 <iive>	BBB: no. 
May 28 20:45:56 <iive>	just to be clear. we are talking about moving the maillist to the bulgarian box?
May 28 20:46:15 <michaelni>	iive, i think we dont talk about anything specific
May 28 20:46:41 <michaelni>	also raz has already copied ffbox to bulgaria but its a few month old
May 28 20:46:47 <BBB>	I’m gonna run out for lunch, I’ll be back in a bit
May 28 20:47:38 <kurosu_>	I think we're discussing about asking people worthy of trust to do it. Why can't we do the same as for asking infrastructure ?
May 28 20:47:55 <ubitux>	just an overview about what kind of stuff we need: security updates, managing various accesses, improvements in various setups such as mail or bug trackers, help with synchronizing samples, ...
May 28 20:48:12 <ubitux>	and i'm probably forgetting many things as i'm not even helping a bit
May 28 20:48:20 <ubitux>	(except by paying the server)
May 28 20:48:28 <jamrial>	i also need to leave, but wont be back for a few hours so i'll miss the rest of the meeting
May 28 20:48:47 <ubitux>	i'm going afk pretty soon but i haven't much more to say
May 28 20:49:01 <ubitux>	that was just a desperate call so everyone is aware of the issue
May 28 20:49:10 *	jamrial has quit ()
May 28 20:49:47 <iive>	ubitux: what's the issue again?
May 28 20:50:25 <michaelni>	iive theres no real issue i think, it just would be nice to have some help with sysadmin
May 28 20:51:00 <durandal_170>	michaelni: is ubitux paid server used for web page?
May 28 20:51:10 <michaelni>	yes
May 28 20:51:33 <durandal_170>	hmm, why it was never transfered?
May 28 20:52:40 <kierank>	VLC have offered to sysadmin for years
May 28 20:53:03 <Compn>	we have to vote on vlc
May 28 20:53:09 <Compn>	before we were worried about takeover on vlc side
May 28 20:53:34 <Compn>	but now i think its ok for vlc to host..
May 28 20:54:27 <michaelni>	we have a dedicated server from ubitux and one in bulgaria and one from kieran
May 28 20:54:50 <Compn>	ok, just need admins ?
May 28 20:54:55 <Compn>	i think i offered to admin before
May 28 20:55:01 <Compn>	i put it on the table, my offer to admin again 
May 28 20:55:14 <ubitux>	we need someone to refer to for every sysadmin stuff
May 28 20:55:28 <michaelni>	Compn, you know postfix and stuff ?
May 28 20:55:40 <michaelni>	ubitux, root@ffmpeg.org probably
May 28 20:55:40 <ubitux>	like if there is an issue, we're always looking for someone for the skills and motivation
May 28 20:56:17 <michaelni>	theres also a dedicated server from baptiste, i almost forgot
May 28 20:56:30 <michaelni>	fate is on that one
May 28 20:56:56 <michaelni>	or i think its a dedicated server at least 
May 28 20:57:02 <Compn>	michaelni : no, but i'm fast learner :P
May 28 20:57:32 <ubitux>	mails are not a simple thing
May 28 20:57:38 <ubitux>	and it's kind of sensitive
May 28 20:57:48 <michaelni>	ubitux, yes :/ 
May 28 20:58:44 <michaelni>	we probably should config postfix or spamassasin to check DMARK/DKIM/SPF or part of that on incoming mai (not really important but i thn it doest curretly)
May 28 20:59:48 <michaelni>	also gmail will soon switch DMARK to reject like yahoo, we have 2 methods basically in place to deal with that a custom solution from tim ad malman itself
May 28 21:00:31 <michaelni>	tims solution would then traslate all gmail like yahoo to gmailemail@ffmpeg.org
May 28 21:00:56 <michaelni>	mailman would put the original gmail into CC and put ffmpeg-devel@ffmpeg.org in from
May 28 21:01:16 <michaelni>	mailman is fully automatic, tims solution needs manual listig of affected servers
May 28 21:01:27 <michaelni>	or we hack mailman to do something else
May 28 21:01:50 <kurosu_>	That's a new item of work, but maybe not the biggest for the volunteer(s)?
May 28 21:02:13 <kurosu_>	Just to make sure people what the request is
May 28 21:02:21 <michaelni>	kurosu_, absolutely no big issue
May 28 21:02:35 <kurosu_>	*people understand what
May 28 21:04:03 <michaelni>	Compn, what server admin stuff yu know ?
May 28 21:05:03 <michaelni>	i mean any expereicene with apache config stuff, git? svn ? ftpd ?
May 28 21:05:19 <michaelni>	(that was a random list) 
May 28 21:05:58 <kurosu_>	Just list what you and the others mainly do?
May 28 21:06:00 <Compn>	just running home papache
May 28 21:06:09 <Compn>	stuff like that
May 28 21:06:16 <Compn>	er apache on my own home box, temporarily
May 28 21:06:17 <Compn>	nothing major
May 28 21:06:41 <Compn>	and on some other site
May 28 21:07:22 <Compn>	i just figured it would be easier to ask me to restart some service
May 28 21:07:23 <Compn>	than michael
May 28 21:07:28 <Compn>	but if not, nevermind
May 28 21:08:00 <durandal_170>	i would like to propose next topic: FFmpeg funding/donations
May 28 21:08:15 <michaelni>	kurosu_, apt-get update ;) occasionally creating an account, looking at why someones mail isnt where it shoud be, then seting up stuff that is needed like new mailman 
May 28 21:09:25 <michaelni>	kurosu_, rarely updating dns zone, uploading samples, rarely fixing permissions on samples, once every few month building new doxygen for a major release
May 28 21:10:09 *	durandal1170 (~computer@141-136-213-160.dsl.iskon.hr) has joined #ffmpeg-meeting2016
May 28 21:10:18 <michaelni>	its not that much work when everythig works
May 28 21:10:40 <Shiz>	considering the quality of this sysadmin conversation it seems delegating it to VLC would be a wise decision
May 28 21:10:45 <Compn>	i'd rather ask michael what he wants 
May 28 21:11:07 <kurosu_>	Michaelni, I meant when asking volunteers :-) I'm personally not
May 28 21:12:27 *	durandal_170 has quit (Ping timeout: 240 seconds)
May 28 21:12:27 <michaelni>	yes, i know, but i dont know who to ask, so be listing it a but others could ask people
May 28 21:13:07 <saste>	michaelni, what's the implications of asking vlc to do sysadmin stuff? or in other words, why you never considered that option?
May 28 21:13:28 <kierank>	Paranoia of course
May 28 21:13:33 <saste>	i'm fine with either, but i'm not the one helping so my opinion doesn't matter, was just trying to understand
May 28 21:13:42 *	durandal_1707 gives channel operator status to durandal1170
May 28 21:15:24 <iive>	or we could move the whole project to github :P
May 28 21:16:26 <michaelni>	saste, we use dedicated servers and multiple virtual machines on the new bulgarian box, vlcs offer was to integrate some of our services into the existing vlc server IIRC
May 28 21:17:42 <michaelni>	its much more restrictive IIUC
May 28 21:18:02 <Illya>	So the different components are: ffmpeg.org website, mailing list, email, git, fate samples ftpd/rsync (have I missed any?). Which services would be integrated into vlc?
May 28 21:18:17 <michaelni>	theres also trac
May 28 21:19:34 <Compn>	[15:25] <kierank> Paranoia of course
May 28 21:19:36 <Compn>	sounds like insult
May 28 21:19:49 <cehoyos>	That's not correct.
May 28 21:21:03 <Compn>	code of conduct 
May 28 21:21:04 <Compn>	:P
May 28 21:21:35 *	Shiz (~shiz@hydrogenium.shiz.me) has left #ffmpeg-meeting2016 ("-")
May 28 21:21:52 *	kurosu has quit (Ping timeout: 250 seconds)
May 28 21:22:30 <Illya>	iive: makes a good suggestion, GitHub would release at least two services (git and trac). For trac to GitHub you could look at something like: https://github.com/trustmaster/trac2github It also might make the project more accessible to new contributors 
May 28 21:22:43 <michaelni>	Compn, btw you should have the power to upload fate-samples and also normal samples
May 28 21:23:06 <michaelni>	you are in samples group
May 28 21:23:06 <Illya>	And GitHub is fairly reputable, if you're paranoid about that
May 28 21:23:08 <kierank>	michaelni: you are mistaken
May 28 21:23:45 <kierank>	But don't let that get in the way of VLC paranoia
May 28 21:24:32 <kurosu_>	Please.
May 28 21:24:47 <durandal1170>	well if nobody comes then VLC will be used
May 28 21:26:28 <durandal1170>	ok, can we get to next topic?
May 28 21:26:38 <michaelni>	durandal1170, ok with me
May 28 21:26:48 <durandal1170>	hopefully the last topic :)
May 28 21:27:04 <michaelni>	"<durandal1170> ok, can we get to next topic?"
May 28 21:27:33 <durandal1170>	its about FFmpeg funding/donations
May 28 21:28:07 <michaelni>	i want more funding/donations for FFmpeg, sadly thats probably all i can do here
May 28 21:28:21 <michaelni>	that is "wanting"
May 28 21:28:47 <durandal1170>	i want possibility to fund devs to work on specific part of FFmpeg
May 28 21:28:53 <michaelni>	+1
May 28 21:28:59 <iive>	what happened with FFmtech?
May 28 21:29:15 <saste>	this was discussed again and again, and we decided that there is nothing preventing us to do that
May 28 21:29:38 <saste>	at the moment we have a total of ~15K USD in the SPI and ffis.de funds
May 28 21:30:19 <saste>	OTOH we never asked to use money for that, since it was always only about refunding people for stuff and travel
May 28 21:30:35 <saste>	also I'm not sure what was the outcome of the last outreachy
May 28 21:30:58 <michaelni>	saste, can we fund someone maybe to make kierans fuzzing GSoC project a reality ? i mean if people agree to that 
May 28 21:31:02 <kierank>	There were no good students
May 28 21:31:59 <durandal1170>	so just need to pick some part of codebase that need refactoring/cleaning up/improving?
May 28 21:32:08 <durandal1170>	like rm demuxer
May 28 21:32:45 <durandal1170>	or swscale
May 28 21:33:47 <michaelni>	iam happy to help cleanup swscale but iam missing some motivation (not money, maybe rather other people joining in and working, i dont know)
May 28 21:35:28 *	saste has quit (Ping timeout: 252 seconds)
May 28 21:36:25 <durandal1170>	guess only left is to propose such thing like, sponsoring dev to for X
May 28 21:36:28 <kierank>	I would be able to fund a non crazy avfilter api
May 28 21:37:52 <durandal1170>	hmm, nicolas is working on some lavfi stuf, unrelated to that, and he is very busy
May 28 21:38:48 <durandal1170>	the main problem I see is what will Libav do if we develop such new API
May 28 21:39:27 <durandal1170>	i'm really interested in better lavfi API for various reasons
May 28 21:40:18 <durandal1170>	kierank: i guess end goal is to feed filters AVFrames directly?
May 28 21:40:29 <nevcairiel>	doesnt that happen today?
May 28 21:40:45 <durandal1170>	you have filtergraph...
May 28 21:40:52 <kierank>	Main goal is to not have weird buffering 
May 28 21:41:02 <nevcairiel>	an API that links filters together for a filtering chain is quite useful
May 28 21:41:04 <kierank>	i.e an API suitable for live as well as file
May 28 21:41:42 <nevcairiel>	things just get oddly complicated if you handle multiple un-synced inputs and shit like that
May 28 21:45:51 <durandal1170>	kierank: do you still have candidate for new lavfi API? 
May 28 21:47:32 <BBB>	are there any other subjects that come after this one?
May 28 21:48:05 *	saste (~saste___@151.56.107.16) has joined #ffmpeg-meeting2016
May 28 21:48:37 <durandal1170>	BBB: any stuff you want to chat about...
May 28 21:49:17 <saste>	i was offline for a few minutes, did I miss any reply?
May 28 21:49:20 <BBB>	no I’m just surprised it’s still ongoing after 3 hrs
May 28 21:50:17 <kurosu_>	Yeah not efficient but that's not like people were not doing anything else
May 28 21:51:01 <BBB>	I agre with the several people above that we should re-consider VLC as sysadmin for our stuff
May 28 21:51:11 <BBB>	doing stuff oruselves really doesn’t make sense if we’re strained in manpower
May 28 21:51:31 <BBB>	is there anything concrete we’re going to do w.r.t. derek and carl?
May 28 21:51:57 <iive>	i think that last time when this was discussed, it was mentioned that they cannot admin all our services
May 28 21:52:53 <saste>	<saste> michaelni, before proposing that I'd check with SPI if that would be an issue
May 28 21:52:54 <saste>	<saste> what would be possible (indeed we already did it in the past) would be to sponsor an outreachy slot as we did in a past edition
May 28 21:52:54 <saste>	<saste> IIRC FFmpeg is not involved with the last round of outreachy, right?
May 28 21:52:54 <saste>	<saste> also, related to this, at the moment it is me and michaelni who approve the funding requests
May 28 21:52:54 <saste>	<saste> also I should report about the donations status (every six months) and I think I missed that in the last year
May 28 21:52:57 <saste>	<saste> when we decided the funding procedure it was agreed that it was going to be a temporary solution, but then we ended up with that setup since then (it was 2012)
May 28 21:53:00 <saste>	<saste> do you have any specific proposal / comment about funding and donations?
May 28 21:53:02 <saste>	<saste> then I think we should move on
May 28 21:53:04 <saste>	<saste> I can re-ask the SPI guys again to know if it is acceptable to use the fund for sponsoring development
May 28 21:53:07 <saste>	<saste> in the past years people also suggested fancier stuff like crowdfunding but nothing came out of that
May 28 21:53:14 <saste>	^^ this is what I wrote before realizing i was offline, sorry for the spam
May 28 21:54:30 *	durandal_170 (~computer@141-136-243-145.dsl.iskon.hr) has joined #ffmpeg-meeting2016
May 28 21:54:54 <kurosu_>	Yeah the funding topic didn't seem to reach a conclusion/decision of what to do
May 28 21:55:25 <saste>	what we have now is bad, but better than nothing
May 28 21:55:53 <kurosu_>	Well you've proposed something to do, seems fine
May 28 21:55:56 <saste>	at least it helps with collecting money for sponsoring a bit of travelling
May 28 21:56:21 *	durandal1170 has quit (Ping timeout: 264 seconds)
May 28 21:57:15 <kurosu_>	So, topic closed and "action points" noted?
May 28 21:57:48 <saste>	I think so
May 28 21:58:05 <durandal_170>	saste: I want to make it possible to fund work on FFmpeg part
May 28 21:58:24 <durandal_170>	notably rm demuxer improvements
May 28 21:59:08 <kurosu_>	Kierank mentioned btw he was willing to fund some work on libavfilter API that would suit his needs, the details of which he'll give to whomever is integrated 
May 28 21:59:15 <kurosu_>	*interested
May 28 21:59:25 <saste>	before asking that on the ML, let me check again with SPI, then we can use the usual procedure with the fund request on the ML
May 28 21:59:48 <saste>	ping me in a few days if you don't hear nothing from me
May 28 21:59:52 <kierank>	So Derek and carl?
May 28 22:00:25 <durandal_170>	I guess can't be done much, Derek left and carl is still here
May 28 22:00:49 <michaelni>	saste, if you get no reply from SPI then put them in a position in which they must reply
May 28 22:01:01 <saste>	michaelni, sure
May 28 22:02:07 <durandal_170>	for sure I'm ignoring carl diffs
May 28 22:02:24 <kurosu_>	Although the CoC and the repercussions are neither final nor voted, I'm for this to be acted upon
May 28 22:02:34 <durandal_170>	he already posted at least 1 proper patch so he is able to follow that....
May 28 22:02:43 <iive>	durandal_170: it's ok if you ignore them all together.
May 28 22:02:50 <kurosu_>	It shouldn't even been allowed to reach this point without intervention
May 28 22:02:52 <iive>	durandal_170: what is not OK is to reject them 
May 28 22:03:20 <durandal_170>	iive: be assured if they are important that they will not be rejected
May 28 22:03:34 <iive>	with stuff like "Sorry, life sucks. This patch is unacceptable."
May 28 22:03:50 <kurosu_>	But I'd personally be only for the equivalent of a warning if it would come to that
May 28 22:04:31 <durandal_170>	iive: i replied how bug should be correctly handled after that..
May 28 22:04:54 <iive>	durandal_170:  that's not the issue. You went on war
May 28 22:05:21 <iive>	"I will comment only this time and if I don't get positive result I will simply block every your patch."
May 28 22:05:29 <BBB>	...
May 28 22:05:41 <kurosu_>	Everyone is to blame with this mess
May 28 22:05:52 <kurosu_>	People should have been told to cool off
May 28 22:05:59 <iive>	absolutely correct.
May 28 22:06:04 <BBB>	I think that’s the point of the VLC tempbans on the ML
May 28 22:06:17 <BBB>	a 1-day ban is essentially just to cool down
May 28 22:06:23 <durandal_170>	iive: i wrote that, but I looked at later diffs...
May 28 22:06:50 <iive>	durandal_170: but the "life sucks" is action on our promise.
May 28 22:06:55 <kurosu_>	Exactly, although an informal warning would have been a prelude
May 28 22:07:26 <iive>	durandal_170: you know that a polite request could be a lot more effective than threats?
May 28 22:07:31 <kurosu_>	And we are precisely starting such a discussion here
May 28 22:07:33 <BBB>	so conclusion is that the proposed disciplinary actions on the CoC will be written such that they would have prevented this but otherwise no further action?
May 28 22:08:15 <durandal_170>	BBB: further action on what?
May 28 22:08:56 <durandal_170>	iive: i asked politely multiple times
May 28 22:10:30 <BBB>	further action on derek vs carl
May 28 22:11:51 <durandal_170>	anyone could propose what to do
May 28 22:12:08 <iive>	durandal_170: you can give me links to the emails where you do that later. But in future, don't go on war. Ask other developers for help.
May 28 22:12:08 <kurosu_>	The CoC doesn't contain repercussions yet
May 28 22:12:12 <durandal_170>	thing is CoC come after this incident
May 28 22:12:44 <BBB>	I don’t even think the CoC strictly existed when the incident arose
May 28 22:12:54 <nevcairiel>	the CoC is just a formality, if someone wants to argue the behavior was OK because there was no CoC in place yet, i dont want to work with them in the first place
May 28 22:13:37 <BBB>	right
May 28 22:13:40 <durandal_170>	it certainly was not OK... but how can we proceed?
May 28 22:13:54 <kurosu_>	I'm not - I just want CoC to contain it then it to be used for the decision to be made
May 28 22:14:36 <BBB>	going by the VLC CoC (https://wiki.videolan.org/Code_of_Conduct/)
May 28 22:14:47 <BBB>	mailing list violations
May 28 22:15:06 <BBB>	first bulletpoint for non-netiquette violations: “24-hour ban from the mailing list in question.”
May 28 22:15:19 <BBB>	and also “As one cannot develop without the mailing lists, a ban from a *-devel mailing list will result in a ban from commit access for one day on the related project.”
May 28 22:15:23 <nevcairiel>	i dont think its as simple as a "mailing list violation"
May 28 22:15:33 <BBB>	no it clearly wasn't
May 28 22:16:07 <BBB>	oh, there’s an escalation section before that
May 28 22:16:09 <BBB>	“The first violation will always result in a simple warning, except if it is a grave or deliberate violation.”
May 28 22:16:20 <BBB>	(I’m assuming this one is considered grave)
May 28 22:16:23 <BBB>	and then: “The following violations will result in some of the disciplinary actions listed in the paragraphs below.”
May 28 22:16:43 <BBB>	so, I think we should formally ban carl from the ML for 24 hrs and ban his commit access for the same period
May 28 22:16:47 <iive>	what exactly is grave situation?
May 28 22:17:04 <BBB>	iive: this is how lawyers get rich
May 28 22:17:18 <iive>	<BBB> (I’m assuming this one is considered grave)
May 28 22:17:25 <kurosu_>	Something that is seen worthy of repercussions by several people
May 28 22:17:32 <iive>	i'd like to know why what you consider grave
May 28 22:17:55 <BBB>	iive: that’s not necessary for this decision
May 28 22:18:06 <BBB>	iive: we merely need to know whether this particular instance was grave or not
May 28 22:18:21 <iive>	and do YOU think it was?
May 28 22:18:23 <BBB>	we don’t need to put a line in the sand on what is grave and what is not, we can do that as situations arise
May 28 22:18:51 <kurosu_>	Well Carl hasn't been treated kindly but the situation has actually been rotting for years now
May 28 22:19:04 <durandal_170>	we can put vote on ML...
May 28 22:19:54 <kurosu_>	CoC would avoid abuse in one way or another, so that this situation doesn't actually rot
May 28 22:23:46 <BBB>	durandal_170: vote on … CoC? or my proposal?
May 28 22:24:02 <kurosu_>	Durandal_170: I'm ok for a vote on Carl, after the CoC contains repercussions (is it a warning? A 1 day ban? Etc)
May 28 22:24:39 <iive>	it's warning
May 28 22:24:56 <durandal_170>	on ML? irc meeting don't have enough members
May 28 22:25:15 <kurosu_>	Durandal_170: ML
May 28 22:25:45 <iive>	you see, this is perfect example why CoC should not punishment clauses
May 28 22:26:03 <iive>	we are not discussing things on principle, we are looking for a way to punish Carl.
May 28 22:26:18 <iive>	and we should be looking for a way to avoid getting there.
May 28 22:26:54 <nevcairiel>	its too late now, and we need to handle the situation at hand
May 28 22:27:03 <kurosu_>	I have the polar opinion, I consider that harassment towards Carl should be equally punished if found a harassment
May 28 22:27:34 <iive>	kurosu_: It should stop.
May 28 22:28:24 <kurosu_>	nevcairiel, do you want a vote here and now, to what effect?
May 28 22:29:00 <nevcairiel>	yes everyone should be happy and get along, but in real-life people don't, and we need to be prepared to handle that if needed, instead of burying our  heads in the sand and losing people over that
May 28 22:30:43 <BBB>	*clap*clap*clap* ++
May 28 22:31:09 <BBB>	I agree that a vote on the ML would be better to give people that fell asleep here the chance to participate also
May 28 22:34:59 <kurosu_>	It's late here. I'm ok for a vote also, just not sure what kind of offense it would be
May 28 22:35:09 <kurosu_>	That could be part of the vote
May 28 22:35:23 <kurosu_>	BTW public vote?
May 28 22:36:08 <kurosu_>	It seems it has always been so
May 28 22:36:37 <iive>	it's hard to fight slender campaign
May 28 22:37:05 <iive>	as it might not involve strong offensive words.
May 28 22:38:08 <kurosu_>	Well people can make an opinion for themselves
May 28 22:39:05 <iive>	ffmpeg was broken apart once from such campaign.
May 28 22:39:38 <saste>	I have to leave now, please send the chat log to the ML when the meeting closes
May 28 22:39:53 <saste>	goodbye! ;-)
May 28 22:39:59 <iive>	have fun :)
May 28 22:40:12 <michaelni>	saste, have fun !
May 28 22:42:27 <kurosu_>	Same here. Debate is done for me, I'll then act upon whatever is decided for vote afterwards
May 28 22:42:41 <kurosu_>	Good night 
May 28 22:42:52 *	kurosu_ has quit ()
May 28 22:43:29 *	saste (~saste___@151.56.107.16) has left #ffmpeg-meeting2016 ("Leaving")
May 28 22:50:10 <atomnuker>	you know, I think we should define a multimedia-based drinking game and put it up on our website
May 28 22:50:35 <nevcairiel>	identify the codec by its artifacts
May 28 22:50:44 <atomnuker>	take a shot for every AVI extension/hack your file has (double for B-frames)
May 28 22:50:59 <atomnuker>	take a shot if your VFR file doesn't play right
May 28 22:51:06 <iive>	atomnuker: drinking 10l cola?
May 28 22:51:15 <nevcairiel>	poor anime people atomnuker
May 28 22:51:26 <atomnuker>	never understood that 10l cola thing
May 28 22:52:01 <atomnuker>	oh oh take a shot if your file has an incorrect colorspace (e.g. 601 flagged 709)
May 28 22:52:23 <iive>	it's from mplayer, a figurative punishment for breaking the build.
May 28 22:52:45 <atomnuker>	ah, that's before my time
May 28 22:52:58 <iive>	oh, and it is the cola brand you don't like :D otherwise it won't be punishment.
May 28 22:53:13 <atomnuker>	doctor pepper is poison
May 28 22:53:37 <atomnuker>	anamorphic video -> take a shot
May 28 22:54:00 <atomnuker>	weird crop/whatever flag in your mkv -> take a shot
May 28 22:54:30 <mateo`>	atomnuker: anamorphic video not flagged as such
May 28 22:54:38 <atomnuker>	I wonder what would be horrible enough to make you want to finish your bottle
May 28 22:55:01 <nevcairiel>	anamorphic isnt that bad, its just terrible if no AR is indicated =p
May 28 22:58:03 <atomnuker>	a shot if you see a jpeg2000 image/video anywhere outside professional stuff
May 28 22:59:21 <nevcairiel>	i have a few DCP trailers of movies, not sure if that counts
May 28 22:59:45 <atomnuker>	a shot for direct (e.g. sped up) 24(/1.001) to 25fps conversion
May 28 23:00:06 <nevcairiel>	thats unfair for people living in PAL land =p
May 28 23:00:13 <nevcairiel>	thats like, all our content!
May 28 23:00:13 <nevcairiel>	:D
May 28 23:00:39 <iive>	do you want to make all developers a chronic alcoholics? :P
May 28 23:01:00 <atomnuker>	those are all small shots, they don't add up
May 28 23:01:23 <atomnuker>	and I can't think of anything horrific to make me drink an entire bottle
May 28 23:01:53 <iive>	you drink it, one shot at a time :)
May 28 23:02:16 <atomnuker>	you can't get drunk like that, gotta drink a whole bottle at a time
May 28 23:02:58 <atomnuker>	well, depends on the alcohol too I guess
May 28 23:05:02 <atomnuker>	take a shot for some fuzzed wav file being recognized as aac/h264/mp3
May 28 23:05:27 <atomnuker>	drink the entire bottle if it gets recognized as... theora
May 28 23:05:35 <atomnuker>	that's sufficiently rare
May 28 23:05:38 <atomnuker>	or VC1
May 28 23:05:41 <nevcairiel>	not sure that can even happen
May 28 23:06:14 <atomnuker>	cosmic rays is the sole cause of all miracles that *may* happen
May 28 23:06:29 <atomnuker>	I believe in them
May 28 23:07:08 <atomnuker>	at this moment billions of neutrinos occupy my laptop in a 1x1x1m cube
May 28 23:07:45 <atomnuker>	all it would take is a couple of thousand to react and flip some bits
May 28 23:08:35 <iive>	i thought neutrinos don't react... that's why they are so hard to detect.
May 28 23:11:48 <atomnuker>	if they don't react how could you even detect them?
May 28 23:12:55 <atomnuker>	they do, but because they're so low energy it takes quite a lot of matter for them to make a difference and generate a photon
May 28 23:20:55 <iive>	well, I wasn't precise... 
May 28 23:23:12 <Timothy_Gu>	So is the meeting done?
May 28 23:23:52 <iive>	i guess
May 28 23:26:06 *	Compn waves at cehoyos
May 28 23:26:07 <Compn>	ehe
May 28 23:26:17 <Compn>	how goes it carl? :)
May 28 23:39:29 <baptiste>	what's with carl ?
May 28 23:48:46 *	BBB has quit (Quit: BBB)
May 28 23:52:10 *	durandal_1707 has quit (Read error: Connection reset by peer)
May 28 23:55:37 *	durandal_1707 (~durandal@m83-180-58-222.cust.tele2.hr) has joined #ffmpeg-meeting2016
May 28 23:55:57 *	durandal_170 has quit (Quit: leaving)
May 28 23:57:10 *	durandal_1707 (~durandal@m83-180-58-222.cust.tele2.hr) has left #ffmpeg-meeting2016
May 28 23:58:51 *	BBB (~rbultje@pool-173-56-121-167.nycmny.fios.verizon.net) has joined #ffmpeg-meeting2016
May 29 00:24:48 *	kierank (sid5955@gateway/web/irccloud.com/x-chhjwqpzyyehmyvm) has left #ffmpeg-meeting2016
May 29 01:39:00 *	iive has quit (Quit: They came for me...)
May 29 04:35:49 *	Timothy_Gu (~timothy_g@wikipedia/timothy-gu) has left #ffmpeg-meeting2016
May 29 04:41:13 *	BBB has quit (Quit: BBB)
May 29 06:21:12 *	arthcp (75c6c0e7@gateway/web/cgi-irc/kiwiirc.com/ip.117.198.192.231) has joined #ffmpeg-meeting2016
May 29 06:21:40 *	arthcp (75c6c0e7@gateway/web/cgi-irc/kiwiirc.com/ip.117.198.192.231) has left #ffmpeg-meeting2016
May 29 09:21:40 *	nevcairiel (nev@WoWUIDev/WoWAce/Ace3/nevcairiel) has left #ffmpeg-meeting2016 ("http://quassel-irc.org - Chat comfortably. Anywhere.")
May 29 10:22:39 *	Illya (sid133335@gateway/web/irccloud.com/x-rfijfsjjprqfpkvu) has left #ffmpeg-meeting2016
May 29 12:38:34 *	BBB (~rbultje@pool-173-56-121-167.nycmny.fios.verizon.net) has joined #ffmpeg-meeting2016
May 29 13:43:45 *	c_14 (~c_14@unaffiliated/c-14/x-8913907) has left #ffmpeg-meeting2016 ("WeeChat 1.4")
May 29 14:19:35 *	BBB (~rbultje@pool-173-56-121-167.nycmny.fios.verizon.net) has left #ffmpeg-meeting2016
May 29 17:00:46 *	omerjerk (2d791d07@gateway/web/freenode/ip.45.121.29.7) has joined #ffmpeg-meeting2016
May 29 17:22:36 *	omerjerk has quit (Ping timeout: 250 seconds)
May 29 22:43:06 *	cehoyos has quit (Quit: Konversation terminated!)

Recommend

Go Managing dependencies Naming a module

Go Managing dependencies Enabling dependency tracking in your code

Go Managing dependencies Locating and importing useful packages

Go Module version numbering Major version Example

Go Module version numbering Patch version Example

Go Module version numbering Minor version Example

Go Module version numbering Pre-release version Example

Go Managing module source Organizing code in the repository

Go go.mod file reference retract Notes

Go go.mod file reference retract Example

Go go.mod file reference retract Syntax

Go go.mod file reference exclude Notes

Go go.mod file reference exclude Example

Go go.mod file reference exclude Syntax

Go go.mod file reference replace Notes

Go go.mod file reference replace Examples

Go go.mod file reference replace Syntax

Go go.mod file reference require Syntax

Go go.mod file reference go Syntax

Go go.mod file reference module Notes

Go go.mod file reference module Examples

Go go.mod file reference module Syntax

Go go.mod file reference Example

Go go.mod file reference

Go Publishing a module Publishing steps

Go Developing a major version update Branching for a major release

Go Module release and versioning workflow Publishing breaking API changes

Go Module release and versioning workflow Publishing the first stable version

Go Module release and versioning workflow Publishing the first (unstable) version

Go Module release and versioning workflow Publishing pre-release versions

Go Contribution Guide Miscellaneous topics Sending multiple dependent changes

Go Contribution Guide Miscellaneous topics Set up git aliases

Go Contribution Guide Miscellaneous topics Reviewing code by others

Go Contribution Guide Miscellaneous topics Synchronize your client

Go Contribution Guide Miscellaneous topics Specifying a reviewer / CCing others

Go Contribution Guide Miscellaneous topics Quickly testing your changes

Go Contribution Guide Miscellaneous topics Troubleshooting mail errors

Go Contribution Guide Miscellaneous topics Copyright headers

Contribution Guide Good commit messages

Go Contribution Guide Sending a change via Gerrit Step 5: Revise changes after a review

Go Contribution Guide Sending a change via Gerrit Step 4: Send changes for review

Go Contribution Guide Sending a change via Gerrit Step 3: Test your changes In the golang.org/x/... repositories

Contribution Guide Sending a change via Gerrit Step 3: Test your changes In the main Go repository

Go Contribution Guide Sending a change via Gerrit Step 2: Prepare changes in a new branch

Go Contribution Guide Sending a change via Gerrit Step 1: Clone the source code

Go Contribution Guide Sending a change via Gerrit Overview

Go Contribution Guide Becoming a contributor Step 4: Install the git-codereview command

Contribution Guide Becoming a contributor Step 0: Select a Google Account

Go Contribution Guide Becoming a contributor Overview

Go Diagnostics Debugging

Go Diagnostics Profiling

How to Write Go Code Testing

How to Write Go Code Your first program Importing packages from remote modules

How to Write Go Code Your first program Importing packages from your module

How to Write Go Code Your first program